游戏客户端
是玩家唯一真正碰得到的部分。
玩家看到的、听到的、按下的一切,都跑在这里。选择的关键不是「最好」——没有哪个在所有方面都最好——而是你的游戏要在哪里跑,以及你已经会什么。按目的地选,别按名气选。
想做什么,决定了该选什么
按顺序问三个问题。玩家从哪里拿到它——一个链接、应用商店,还是桌面商店?是 2D 还是 3D?你现在已经能顺手写哪种语言?这三个答案通常只留下一个合理选项,剩下的就只是偏好之争了。
如果是第一个 ,网页赢的次数比人们以为的多。不用装东西,不用过审,一小时内就能把链接发给朋友。
游戏每秒要把同样的三件事重复几十遍
从方块下落的益智游戏到 3D 赛车,每一款游戏都运行在之上。客户端每秒都要把同样的工作重复很多次。它读取玩家按了什么,更新世界(移动角色、判断有没有击中、加分),再画出一幅新画面。游戏循环每转一圈,就产生一帧。在 60 下,一圈必须在约 16 毫秒内完成,所以慢的会表现为画面卡顿。
- 1 读取输入 哪些键正被按住,手指点在了哪里,手柄上的哪个按钮被按下。这里只读取,先不移动任何东西。
- 2 更新世界 按“速度 × 经过的时间”移动角色,施加重力,做,改变分数和计时器。游戏的规则就住在这里。
- 3 绘制画面 清空屏幕,把背景、和分数画在新的位置上。玩家只看得到这一步,所以别把游戏规则放进来。
在画面里跑来跑去的图片——角色、金币、子弹——叫作精灵。当两个精灵看不见的盒子(碰撞箱)重叠时,就算碰到了;每一帧都检查这件事,叫作碰撞检测。Phaser、Godot、Unity 这样的引擎会替你运行游戏循环,你只要填写更新这一步发生什么、要画什么。
x += speed * dt。这样在每台设备上,大家都以同样的速度移动。
告诉 你说的是游戏循环的哪一部分。例如:“在更新这一步,用帧间隔时间让玩家随方向键以每秒 200 像素移动,碰到墙就停下。在绘制这一步,把分数显示在左上角。”点明是哪一步,得到的代码就更小、更容易检查。
网页
一个链接,是游戏和玩家之间最短的距离。不用安装、不用过审,有的设备都能跑。
手机 App
换来商店分发、推送通知和内购,代价是排队过审和平台规则。
桌面
更大的屏幕、真正的输入设备,以及 Steam。玩得久的游戏都住在这儿。
两个常见的误解
Babylon.js、Unity、Unreal、Flame 出现在这里,是因为值得了解,而不是 SONUB 采用了它们。