如果我正在制作一款游戏,我是否可以/应该创造一个“敌人”?类

本文关键字:一个 创造 敌人 是否 一款 如果 游戏 | 更新日期: 2023-09-27 18:17:32

我正在为自己的期末项目制作一款XNA类游戏,这将是一款FPS。为了生成敌人,我认为我可以编写一个类来导入一个模型,并定义"敌人"的随机大小和位置,以及他的移动和行动。然后我会从Game.cs文件中调用这个类。然而,我在这方面遇到了一些困难。

我的主要问题是,我不确定在哪里/如何调用敌人(这是一个雪人)在游戏文件。

这是我对Snowmen.cs (enemy)类的设置

public class Snowmen : Microsoft.Xna.Framework.Game
{
    private Camera  cam = new Camera();
    Model snowMan;
    Matrix[] snowManMatrix;
    protected override void LoadContent()
    {
        snowMan = Content.Load<Model>( "Models''snowman" );
        snowManMatrix = new Matrix[ snowMan.Bones.Count ];
        snowMan.CopyAbsoluteBoneTransformsTo( snowManMatrix );
    }
    public void DrawSnowMan(Model model, GameTime gameTime) 
    {
        foreach (ModelMesh mesh in model.Meshes) 
        {
            Matrix world, scale, translation;
            scale = Matrix.CreateScale(0.02f, 0.02f, 0.02f);
            translation = Matrix.CreateScale(0.0f, 0.7f, -4.0f);
            world = scale * translation;
         foreach (BasicEffect effect in mesh.Effects)
         {
            effect.World = snowManMatrix[mesh.ParentBone.Index] * world;
            effect.View = cam.viewMatrix;
            effect.Projection = cam.projectionMatrix;
            effect.EnableDefaultLighting();
         }
           mesh.Draw();
         }
    }
    protected override void Draw(GameTime gameTime)
    {
        DrawSnowMan( snowMan, gameTime ); 
        base.Draw(gameTime);
    }
}

到目前为止,我的Game1.cs文件是一个功能skybox,也包含LoadContent()Draw()方法。敌人职业是否完全没有必要?

如果我正在制作一款游戏,我是否可以/应该创造一个“敌人”?类

你可能想使用DrawableGameObject

public class Snowman : DrawableGameObject
{
    private Camera  cam = new Camera();
    //Model snowMan;
    //Matrix[] snowManMatrix;
    public Model snowMan {get;set;};
    public Matrix[] snowManMatrix{get;set;};
    protected override void LoadContent()
    {
        //snowMan = Content.Load<Model>( "Models''snowman" );
        snowManMatrix = new Matrix[ snowMan.Bones.Count ];
        snowMan.CopyAbsoluteBoneTransformsTo( snowManMatrix );
    }
    public void DrawSnowMan(Model model, GameTime gameTime) 
    {
        foreach (ModelMesh mesh in model.Meshes) 
        {
            Matrix world, scale, translation;
            scale = Matrix.CreateScale(0.02f, 0.02f, 0.02f);
            translation = Matrix.CreateScale(0.0f, 0.7f, -4.0f);
            world = scale * translation;
         foreach (BasicEffect effect in mesh.Effects)
         {
            effect.World = snowManMatrix[mesh.ParentBone.Index] * world;
            effect.View = cam.viewMatrix;
            effect.Projection = cam.projectionMatrix;
            effect.EnableDefaultLighting();
         }
           mesh.Draw();
         }
    }
    protected override void Draw(GameTime gameTime)
    {
        DrawSnowMan( snowMan, gameTime ); 
    }
}
在Game1.cs

进行初始化
   Snowman snowDude= new Snowman();
   Components.Add(snowDude);

And move

   //snowDude = Content.Load<Model>( "Models''snowman" ); 
   snowDude.snowMan = Content.Load<Model>( "Models''snowman" ); 

插入Game1的LoadContent

添加到组件意味着当Game1的更新和绘制被调用时,snowDude的更新和绘制被调用。老实说,我并不是百分百确定是什么顺序。我认为加载内容也应该被调用,但我认为最好的做法是(至少在你学习的时候)将所有的声音/动画/精灵导入到同一个地方(在你的主文件中),这样你就知道什么时候调用了什么。

代替Components.Add(snowDude);

你可以在Game1的Draw Method中调用snowDude.Draw(gametime)。和Game1的Update方法中的snowDude.Update()。

除此之外,我同意Brent的观点。如果只有雪人,那么只有一个职业应该没问题,但如果你开始增加更多,就会有很多重叠,所以创建一个敌人职业

public class Enemy: DrawableGameObject{}

和将雪人更改为

public class SnowMan:Enemy{}

如果你只有雪人,这是可以的。当你添加其他敌人或类似对象时,添加Parent类(如Enemy)在结构上都很有用,它允许你集中代码并减少/消除重复代码。

如果你希望你的游戏能够快速发展,你可以考虑一个实体系统:

http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/

实体系统可以帮助你克服传统的面向对象解决方案所固有的一些设计挑战(深层层次结构,优质对象等),并在面对变化时保持游戏的灵活性。