Я делаю игру, могу ли я создать класс "Враг"? - PullRequest
1 голос
/ 13 декабря 2011

Я делаю игру для своего финального проекта в классе XNA, который я беру, это будет FPS.Для того, чтобы генерировать врагов, я подумал, что мог бы написать класс, который импортирует модель и определяет случайный размер и расположение «врага», а также его движения и действия.Затем я бы вызвал этот класс из моего файла Game.cs.Однако у меня возникли некоторые трудности с этим.

Моя главная проблема заключается в том, что я не уверен, где / как вызвать врага (который является снеговиком) в файле игры.

Вот что у меня есть для класса Snowmen.cs (враг)содержит LoadContent() и Draw() методы.Вражеский класс совершенно не нужен?

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Возможно, вы захотите использовать 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" ); 

в LoadContent Game1

Добавление к компонентам означает, что обновление и рисование snowDude вызываются всякий раз, когда используется Game1.Честно говоря, я не на 100% в каком порядке.Я считаю, что Load Content также следует вызывать, но я думаю, что лучше (по крайней мере, пока вы учитесь) импортировать все ваши звуки / анимации / спрайты в одном месте (в вашем основном файле), чтобы вы точно зналичто и когда вызывается.

ИЛИ вместо Components.Add (snowDude);

Вы можете просто вызвать snowDude.Draw (gametime) в методе рисования в Game1.и snowDude.Update () в методе обновления Game1.

В остальном я согласен с Brent.Если есть только снеговики, то у вас будет хорошо только с одним классом, но если вы начнете добавлять больше, будет много совпадений, поэтому создайте вражеский класс

public class Enemy: DrawableGameObject{}

и измените SnowMan на

public class SnowMan:Enemy{}

должно быть уместно.

0 голосов
/ 13 декабря 2011

Если вы ожидаете, что ваша игра значительно вырастет, вы можете рассмотреть систему сущностей:

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

http://t -machine.org / index.php / 2007/09/03 / объектная-система, является, заместителем будущего из-MMOG-разработки частей-1 /

Система сущностей может помочь вам преодолеть некоторые проблемы проектирования, свойственные традиционным объектно-ориентированным решениям (глубокие иерархии, объекты бога и т. Д.), А также сохранить гибкость вашей игры перед лицом изменений.

0 голосов
/ 13 декабря 2011

Если у вас есть только снеговики, это нормально.Когда вы добавляете других врагов или подобные объекты, добавление родительского класса, такого как Enemy, полезно как структурно, так и позволяет вам централизовать код и уменьшить / исключить дублирование кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...