我正在为我正在参加的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()
方法。完全不需要敌人的阶级吗?
答案 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/
实体系统可以帮助您克服传统面向对象解决方案(深层次结构,神对象等)中固有的一些设计挑战,并在面对变化时保持游戏的灵活性。