怎么制作游戏引擎(游戏引擎是干嘛的怎么开发出来的)


15岁那年,我写了个游戏引擎。如何制作一个2D游戏引擎?一看就懂的力学模拟和碰撞检测

欣欣《猫咪大作战》第一关

力学模拟+屏幕渲染+游戏进度管理,用的ActionScript,不难。源码在Github上的TCXX/CatsAdventure可以找到,毫无代码风格可言,能跑。

游戏设计

类似超级玛丽,取名《猫咪大作战》。方向键控制猫咪进行移动、跳跃、发射子弹,到达泡泡进入下一关。

  • 屏幕顶端有个时间条,随着时间流逝慢慢向左缩短。当时间耗尽,猫咪的探险也就结束了。
  • 猫有9条命,触碰狗或篝火减一条,直至为0。
  • 一些关卡中会出现特效道具。
  • 还有一些关卡会有移动的狗啦蜜蜂啦,可以用子弹打或者使劲跑。
  • 关卡进度可保存。

如何制作一个2D游戏引擎?一看就懂的力学模拟和碰撞检测

《猫咪大作战》部分关卡设计

游戏参数

  • Flash主版本号:cs5
  • Flash Player 最低版本号:10.0.2.13
  • 屏幕分辨率:1024x768或更高

力学模拟

游戏引擎主要考虑以下几个力:摩擦力,拖拽力,空气阻力,重力,和支持力。

因为是二维世界的模拟,每个物体有x和y两个方向上的速度,vx和vy。渲染的时候,每个单位时间物体的新位置:

x’ = x + dx

y’ = y + dy

重力是每个时间单位自动叠加到速度上的。每个物体自带一个叫status的变量,标记当前是否腾空,用来判断一些操作比如跳跃是否有效。如果物体有地面支撑,会cancel重力效果。

如果猫咪从太高的地方下落,会有反弹效果。实现方式为:

dy’ = -c*dy (0<c<1)

猫紧贴墙壁的时候使用跳跃键,可以使猫咪顺墙而上。因为猫会爬树。

水平拖拽力是每时间单位增加,直到允许的最大拖拽速度。

if (_player.keyLeftPressed) {
 _player.vx -= _player.dragForce;
}
if (_player.keyRightPressed) {
 _player.vx += _player.dragForce;
}
if (_player.vx > 0) {
 if (_player.vx > _player.friction) {
   _player.vx -= _player.friction;
 } else {
   _player.vx = 0;
 }
} else {
 if (_player.vx < -_player.friction) {
   _player.vx += _player.friction;
 } else {
   _player.vx = 0;
 }
}

空气阻力同理,物品掉落过程中达到自由落体最高速度就不再增加。

if (_player.vy > _player.MAX_FALLING_SPEED) {
 _player.vy = _player.MAX_FALLING_SPEED;
}

碰撞检测

最开始用的检测算法,被吐槽太多了只好又写了一个。代码略长,一共三百多行,不复制过来主要还是因为写得太烂了。描述一下大致思路:

  1. 根据player的坐标,确定player周围的九个格子,然后一个个看格子里有没有地面也就是砖块。此步得到地面的一个list。
  2. 把list里的每个砖块转换成一个正方形区域,把player转换成一个长方形区域。调用ActionScript自带的intersection函数,比较player和每个砖块的区域,看看返回的结果是否为空。
  3. 对于每个砖块,如果和player有重叠的区域,那么根据相对位置判断相撞方向,再根据该方向的当前速度,要么强制归零要么dy’ = -c*dy反弹。同时更新status变量。

反弹已经很友好了。像塞尔达这种游戏里,都是直接算摔死的。

屏幕渲染

首先是一些基本操作,比如在物体移动出了屏幕边界的时候就会被从画布上移除。

在计算游戏中物体的具体位置时,一种粗糙的处理方式是直接修改Flash元件在舞台上的显示坐标。这样做的缺点是,每次改动都会重新渲染屏幕,消耗不必要的时间和资源。所以先保存每个物体的理论位置,再统一渲染。甚至动用了神秘的名叫tempX和tempY的变量。

尽管如此,子弹多的时候画面还是超级卡。

游戏进度

有剧情有鸡汤。除了判定是否重来、晋级下一关以外,还特地藏了个作弊键,一键到下一关。如何制作一个2D游戏引擎?一看就懂的力学模拟和碰撞检测

欣欣《猫咪大作战》开头

番外:关卡地图编辑器

游戏地图用二维数组保存,1表示此处有墙,0表示此处无墙。由于手写数据非常不直观,还容易出错,于是用Visual Basic写了一个小工具,可以直观地编辑游戏地图,并生成对应的代码。

界面最上方设置数组名称、数组规模,下方的大块区域是A*B的方格,每个格子通过鼠标点击切换黑白颜色,对应有墙无墙两种状态。完成地图编辑后单击右上方的按钮“生成代码”,文本框里会出现自动生成的代码用于复制。

VB6年久失修,刚刚用虚拟机跑了一下发现中文显示不出来了。放个大致的界面你们感受一下就好。

文案策划

秦志强:利用文案策划在家兼职年赚50万+的秘密>>>>
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ15101117,本站将立刻清除。