使用 C# 和 OpenGL 实现的基础 3D 小行星游戏
4.83/5 (18投票s)
使用 C# 和 OpenGL 实现的基础 3D 小行星游戏

引言
本文面向希望开始 3D 游戏编程但不知道从何开始的初学者。它使用 OpenGL 和 VS 2008 编写,并使用我自己制作的一个名为 Shadowengine 的小型图形引擎。它具备游戏的基本要素:得分、难度级别和生命计数器。所有这些都用少量的代码编写,目的是使其简单易懂。
我首先要解决的问题是让场景看起来像外太空。为此,我将背景颜色设置为黑色。在 OpenGL 中,设置方式如下:
Gl.glClearColor(0, 0, 0, 1);//red green blue alpha
另一个问题是星星,我通过在屏幕上绘制随机的白色点来解决。算法大致如下。我生成一个随机点并测量它与飞船的距离,如果距离小于预定义值,我就丢弃该点并重复该过程,直到创建所需的星星。请看代码:
public void CreateStars(int cantidad)
{
Random r = new Random();
int count = 0;
while (count != cantidad)
{
Position p = default(Position);
p.x = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
p.z = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
p.y = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
if (Math.Pow(Math.Pow(p.x, 2) + Math.Pow(p.y, 2) +
Math.Pow(p.z, 2), 1 / 3f) > 15)
{
stars.Add(p);
count++;
}
}
}
得分是一个随着时间推移而增加的数字,并且每次我通过一个关卡时,它都会增长得更快。关卡每 450 帧增加一次。
我需要解决的最后一个问题是小行星碰撞问题。我为飞船创建三个位置(一个用于飞船,两个用于机翼),并且每隔一段时间,我会检查所有小行星与这三个位置之间的距离。如果距离小于预定义值,我就执行碰撞事件。
该项目包含六个类:
- AsteroidGenerator.cs - 它处理在随机位置和随机大小和速度下创建小行星。它还具有查询飞船和小行星之间是否发生碰撞的方法。
- Asteroid.cs - 它处理与小行星相关的所有内容,例如移动、纹理选择、绘制等。
- Star.cs - 它具有创建随机白色点并绘制它们的方法。
- Camera.cs - 它处理用户摄像机的选择并设置场景的正确透视视图。
- SpaceShip.cs - 此类包含与飞船相关的所有方法和属性,例如移动、绘制等。
- Controller.cs - 此类管理游戏创建、游戏逻辑并包含运行游戏所需的所有类。这是一段代码示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace Naves
{
public class Controller
{
Camera camara = new Camera();
Star star = new Star();
SpaceShip spaceShip = new SpaceShip();
public SpaceShip Nave
{
get { return spaceShip; }set { spaceShip = value; }
}
public Camera Camara
{
get { return camara; }
}
public void BeginGame()
{
AsteroidGenerator.GenerateAsteroid(35, false);
}
public void ResetGame()
{
AsteroidGenerator.GenerateAsteroid(35, true);
spaceShip.Reiniciar();
}
public void CreateObjects()
{
star.CreateStars(450);
spaceShip.Create();
Asteroid.Crear();
}
public void DrawScene()
{
star.Draw();
AsteroidGenerator.DrawAsteroids();
spaceShip.Dibujar();
}
}
}
Main.cs - 这是包含游戏视觉组件的窗体。它包含 controller 类,并通过适当的窗口控件向玩家提供信息。它有一个计时器来定期绘制场景,并具有用于纹理和对象加载的代码。
如果想为项目添加声音,请取消注释已注释的行,然后按 Ctrl+Alt+E,并在托管调试助手下,取消选中 loaderlock 异常。
我希望收到此示例的反馈。如果你喜欢它,请投票或在下方留言。我将尝试制作一个飞船可以射击小行星的版本。
历史
- 2011 年 12 月 28 日:初始版本
