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

使用 C# 和 OpenGL 实现的基础 3D 小行星游戏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (18投票s)

2011 年 12 月 30 日

CPOL

3分钟阅读

viewsIcon

99041

downloadIcon

12268

使用 C# 和 OpenGL 实现的基础 3D 小行星游戏

Basic3DAsteroidGame/image001.jpg

引言

本文面向希望开始 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 日:初始版本
© . All rights reserved.