我正在制作游戏,可以/我应该创建一个“敌人”类吗?

时间:2011-12-12 21:27:48

标签: c# xna

我正在为我正在参加的XNA课程中的最终项目制作一个游戏,它将成为一个FPS。为了产生敌人,我想我可以编写一个导入模型的类,并定义“敌人”的随机大小和位置,以及他的动作和动作。然后我会从我的Game.cs文件中调用该类。但是,我对此有些困难。

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

这就是我对Snowmen.cs(敌人)课程所拥有的内容

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 文件是一个功能性的天空盒,还包含LoadContent()Draw()方法。完全不需要敌人的阶级吗?

3 个答案:

答案 0 :(得分:1)

您可能想要使用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);

移动

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

进入Game1的LoadContent

添加到组件意味着只要Game1是,就会调用snowDude的Update和Draw。老实说,不是百分之百地按照什么顺序。我相信也应该调用加载内容,但我认为在同一个地方(在主文件中)导入所有声音/动画/精灵是更好的练习(至少在你学习的时候),这样你才能确切地知道什么叫做什么,什么时候。

而不是Components.Add(snowDude);

你可以在Game1的Draw Method中调用snowDude.Draw(游戏时间)。和GameD的Update方法中的snowDude.Update()。

否则我同意布伦特。如果只有雪人,那么你应该只有一个班级,但如果你开始增加更多会有很多重叠,所以制作一个敌人类

public class Enemy: DrawableGameObject{}

将SnowMan改为

public class SnowMan:Enemy{}

应该是合适的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您希望自己的游戏大幅增长,可以考虑使用实体系统:

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/

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