简单的登月舱克隆游戏






4.71/5 (15投票s)
本文介绍了如何使用简单的 C# 和 GDI+ 代码制作登月舱游戏

引言
本文描述了一个小型登月飞船克隆的开发过程。登月飞船是Atari推出的一款街机游戏,它有一个简单但很棒的想法,人们喜欢一遍又一遍地玩。
登月飞船是一个游戏,您可以在其中控制一个试图在月球上着陆的着陆器。会施加月球引力,因此着陆器会逐渐坠落并撞向粗糙的表面。玩家必须从主推进器施加推力并旋转航天器才能导航到着陆平台。
游戏由箭头键控制 - 上、左和右,以及X,它控制加力燃烧室(增加燃料消耗下的推力)。
有限的燃料供应(在推进器运行时燃烧)是游戏的难点之一,着陆器的速度和旋转容差也是如此。尝试着陆太快,脆弱的车辆就会坠毁。
设计元素
我决定将游戏对象分为以下几个类
Game
- 处理游戏更新和事件Ground
- 保存有关关卡的信息Lander
- 包含有关登月飞船的信息并更新它
游戏使用Windows Form在PictureBox
上显示渲染的Bitmap
并捕获键盘事件。来自 Windows Form 的 KeyDown
和 KeyDown
事件被发送到Game,Game将这些键切换为已按下。然后,例如,Lander
对象可以检查是否按下了向上键,并通过主推进器施加推力。
游戏在由 Windows Form 的 Timer
管理的时间步长中运行。
地形是随机生成的。它在内部存储为连接点的列表;在渲染中,它们由线条连接。
图形
游戏绘图是在 GDI+ 中完成的,通过 Graphics
对象。在每个时间步,都会绘制游戏,首先绘制地面,然后绘制着陆器,然后是一些统计数据(速度,位置)。由于着陆器可以旋转,我们需要对 Graphics
应用旋转变换
Matrix m = new Matrix();
m.RotateAt((float)MathFuncs.RadiansToDegrees(Lander.Rotation), Lander.Location);
g.Transform = m; //assigning the matrix to Graphics object
g.DrawImage(Lander.Sprite, Lander.LocationGraphics);
m.Reset();
g.Transform = m; //restore original matrix
游戏更新和模拟
游戏更新是在 Game
对象中以时间步长完成的。游戏首先通过调用 Lander
的 Update
方法来更新着陆器的位置,然后我们检查碰撞。
物理模拟非常简单。我们对着陆器施加力 - 首先是引力,即
sY += Gravity * ts.TotalSeconds;
然后我们检查每次按键(主或旋转推进器)并根据推力和旋转施加力
sY -= Math.Sin(MathFuncs.NormalizeAngle(Rotation + Math.PI / 2))
* totalSeconds * ThrustSpeed;
sX -= Math.Cos(MathFuncs.NormalizeAngle(Rotation + Math.PI / 2))
* totalSeconds * ThrustSpeed;
然后我们需要检查与地面的碰撞 - 我们只需检查着陆器边界矩形的每个角是否“在”地形线之下。由于地面/地形只是一系列连接的线 - 斜坡,它们仅从左向右延伸,因此没有任何线可以位于另一条线的上方或下方。因此,如果我们发现在时间步长之后,边界矩形的其中一个点位于线下方,则着陆器一定已经着陆或坠毁。
检查 Point
是否在 line
之下(在 2D 中)包括计算与 Point
具有相同 X 坐标的 line
上一个点的 Y 坐标,并确定 Point.Y
> 线的 Y 坐标 at Point.X
。所以类似 Line.GetYCoordAtX(point.X) > point.Y
。
结论
该游戏是匆忙设计和实现的,因此类设计不如它可能的好。如果您想添加一些东西,这里有一些额外的想法或练习
- 可以实现某种评分功能,基于最终着陆速度、旋转和剩余燃料。
- 可以添加声音效果来增强体验。
- 通过鼠标或游戏手柄进行模拟控制可以提供更精细的控制等级。
- 多人游戏,两个玩家尝试在同一屏幕上着陆。
历史
- 2009年12月8日:初始发布