xla*_*8or 16 c# architecture xna xna-4.0
我对我正在制作的XNA游戏有疑问,但它也是未来游戏的一般问题.我正在制作Pong游戏而且我不确切知道要在哪里更新,所以我会更好地解释我的意思.我有一个类Game,Paddle和Ball,例如,我想验证球与屏幕限制或桨之间的碰撞,但我遇到了两种方法来做到这一点:
更高级别的方法 - 将桨和球属性公开,并在Game.Update上检查碰撞?
低级方法 - 我提供我需要的每个信息(屏幕限制和拨片信息)到球类(通过参数,或在公共公共静态类)和Ball.Update我检查碰撞?
我想我的问题以更通用的方式是:
对象是否需要知道如何更新和绘制自己,甚至是从某种程度上提供给它们的更高级别的依赖项?
要么
最好在Game.Update或Game.Draw中使用更高级别处理它,还是使用Managers来简化代码?
我认为这是一个适用于每个游戏的游戏逻辑模型问题.我不知道我的问题是否清楚,如果没有,请随意提问.
And*_*ell 46
回答你的问题的困难部分是你要问两个:"我现在应该做什么,对于乒乓球"和"我应该做些什么,以后,在某些通用游戏上".
要制作Pong你甚至不需要Ball和Paddle课程,因为他们基本上只是位置.在你的Game类中坚持这样的东西:
Vector2 ballPosition, ballVelocity;
float leftPaddlePosition, rightPaddlePosition;
Run Code Online (Sandbox Code Playgroud)
然后只需更新并以适合您的游戏Update和Draw功能的顺序绘制它们.简单!
但是,假设你要创建多个球,和球的许多性质(位置,速度,旋转,颜色等):你可能想使一个Ball类或结构,你可以实例(同样适用于拨片).您甚至可以将某些函数移动到它们自包含的类中(Draw函数就是一个很好的例子).
但保持设计概念相同 - 所有对象 - 对象交互处理(即:游戏玩法)都发生在您的Game班级中.
如果您有两个或三个不同的游戏元素(或类),这一切都很好.
但是,让我们假设一个更复杂的游戏.让我们采取基本的乒乓球比赛,添加一些弹球元素,如多球和球员控制的脚蹼.让我们从Snake中添加一些元素,比如我们有一个AI控制的"蛇"以及一些球或蛇可以击中的拾取物.并且为了更好的衡量,我们可以说桨也可以像太空侵略者一样射击激光器,激光螺栓根据它们击中的东西做不同的事情.
Golly这是一个巨大的互动混乱!我们如何应对呢?我们不能把它全部放在游戏中!
简单!我们创建一个接口(或抽象类或虚拟类),我们的游戏世界中的每个"东西"(或"演员")将来自.这是一个例子:
interface IActor
{
void LoadContent(ContentManager content);
void UnloadContent();
void Think(float seconds);
void UpdatePhysics(float seconds);
void Draw(SpriteBatch spriteBatch);
void Touched(IActor by);
Vector2 Position { get; }
Rectangle BoundingBox { get; }
}
Run Code Online (Sandbox Code Playgroud)
(这只是一个例子.没有" 一个真正的演员界面 "适用于每个游戏,你需要自己设计.这就是我不喜欢的原因DrawableGameComponent.)
拥有一个通用界面允许Game只谈论Actors - 而不需要知道游戏中的每一种类型.只剩下每种类型的共同事物 - 碰撞检测,绘图,更新,加载,卸载等.
一旦你的演员,你就可以开始担心特定类型的演员.例如,这可能是以下方法Paddle:
void Touched(IActor by)
{
if(by is Ball)
((Ball)by).BounceOff(this.BoundingBox);
if(by is Snake)
((Snake)by).Kill();
}
Run Code Online (Sandbox Code Playgroud)
现在,我喜欢让球被桨反弹,但这真的是一个品味问题.你可以反过来做.
最后,您应该能够将所有演员都放在一个大型列表中,您可以在游戏中轻松迭代.
实际上,出于性能或代码简单性的原因,最终可能会有多个不同类型的actor列表.这没关系 - 但总的来说,我只是坚持游戏的原则只知道通用演员.
演员也可能想要查询出于各种原因存在的其他演员.因此,给每个演员提供一个游戏参考,并在游戏中公开演员列表(当你编写游戏代码并且它是你自己的内部代码时,不需要对公共/私人超级严格.)
现在,您甚至可以更进一步,拥有多个接口.例如:一个用于渲染,一个用于脚本和AI,一个用于物理等.然后有多个实现可以组成对象.
本文将对此进行详细介绍.我在这个答案中有一个简单的例子.如果您开始发现您的单个actor接口开始变成更多抽象类的"树",那么这是一个合适的下一步.
| 归档时间: |
|
| 查看次数: |
6746 次 |
| 最近记录: |