65.9K
CodeProject 正在变化。 阅读更多。
Home

简单的登月舱克隆游戏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (15投票s)

2009 年 12 月 8 日

公共领域

3分钟阅读

viewsIcon

60056

downloadIcon

2934

本文介绍了如何使用简单的 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 对象中以时间步长完成的。游戏首先通过调用 LanderUpdate 方法来更新着陆器的位置,然后我们检查碰撞。

物理模拟非常简单。我们对着陆器施加力 - 首先是引力,即

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日:初始发布
© . All rights reserved.