我认为我去年的C#项目将是一个'Monster Dash'类游戏,我会用C#和XNA开发它,它将针对PC,我使用的是Microsoft Visual Studio 2010, XNA Game Studio 4.0。游戏将是2D游戏,而不是3D游戏。
对发展过程的思考,出现了一些问题:
首先,我需要创建一个“平台排序”,玩家将在其上运行,并且它们之间会有漏洞和间隙(这将随机出现)我不知道如何要做到这一点!我发现的唯一一个可能解释的问题是微软的一个名为“Platformer”的示例代码,我不明白(有人可以解释他们在那里使用的方法,或者更好/更简单的方法)。
第二次,我需要玩家跳(为了避免间隙和洞并继续跑)我不知道如何接近该功能的物理部分,我会非常高兴,如果有人可以建议一种方法来处理,或指向一段有用的代码。
非常感谢,iLyrical。
答案 0 :(得分:3)
毫无疑问,仅仅因为它是2D,平台游戏并不是一件容易的事。所以我建议你使用任何第三方库帮助,使用XNA和C#已经是一个很好的起点。接下来就是,这就是你的问题所在,如何解决物理问题?你可以自己写,这是一个很好的学习经验,但如果时间至关重要,那将是困难和令人沮丧的。所以我建议使用第三方库,比如Farseer。也许this小教程也派上用场了。
但同样,这绝对不是一件容易的事。根据你的技能,我当然不知道,我会建议一个更简单的游戏,如果它必须是一个游戏。游戏可能是您可以想象的最困难的编程任务。 同时处理多个子系统(图形,AI,声音,输入,物理);让它们协同工作已经是一项艰巨的任务,但拥有内容(Sprites,Wavs,Music,Menu gfx等)本身就是另一种野兽。
最后的建议是,如果您不理解Platformer代码;再读一遍;如果你不理解某些部分,直到你了解它们。如果你有c#的问题,首先要学习它,永远不要停止学习它。还可以阅读有关您可以找到的游戏的许多教程和代码。重要的是要了解其他人如何以及为什么以他们的方式解决问题。
答案 1 :(得分:2)
微软网站上的平台游戏示例是一个很好的起点。
基于这个例子,我在某种程度上做了类似的事情。它是一个基于平铺的方法,你有一个二维的“Tiles”列表(一个列表列表列表>)你设置一个静态大小的瓷砖(比如16x16像素),然后它只是循环列表的问题绘制/做碰撞检测等等。只要考虑一下,如果我考虑一下,我可以在以后发布一些代码,如果你想要,它就在家里。
我通常接近运动物理学的一种简单方法是使用3个Vector2对象,一个用于位置,一个用于速度,一个用于加速。如果您熟悉简单物理,position = velocity * deltaTime,velocity = acceleration * deltaTime。当玩家跳跃时你只需增加玩家加速度,然后在更新循环中计算位置:
// On Jump
player.acceleration += someConstant
// On Update
this.velocity += this.acceleration * deltaTime
this.position += this.velocity * deltaTime
同样,我稍后会发布一些真实的代码。
希望这有助于您入门
编辑:
这是一些移动代码
public override void Update(GameTime gameTime)
{
float deltaTime = ((float)gameTime.ElapsedGameTime.Milliseconds) / 1000f;
currentState = Keyboard.GetState();
if (canMove)
{
// Input
if (currentState.IsKeyDown(Keys.Left))
Acceleration.X -= 1000;
if (currentState.IsKeyDown(Keys.Right))
Acceleration.X += 1000;
if (!airbourne && currentState.IsKeyDown(Keys.Space) && previousState.IsKeyUp(Keys.Space))
{
Acceleration.Y -= 25000;
airbourne = true;
}
// Friction in X to limit sliding
if (Velocity.X > 0)
{
Velocity.X -= X_FRICTION;
if (Velocity.X < 0)
Velocity.X = 0;
}
else
{
Velocity.X += X_FRICTION;
if (Velocity.X > 0)
Velocity.X = 0;
}
// Gravity
Acceleration.Y += 500;
}
Velocity += Acceleration * deltaTime;
if (Velocity.X > 0)
Velocity.X += speedMod;
else if (Velocity.X < 0)
Velocity.X -= speedMod;
// Move and check collisions in X
Position.X += Velocity.X * deltaTime;
if (game.checkCollisions(boundingBox()))
{
Position.X -= Velocity.X * deltaTime;
Velocity.X = 0;
}
// Move and check collisions in Y
Position.Y += Velocity.Y * deltaTime;
movingUp = Velocity.Y < 0;
if (game.checkCollisions(boundingBox()))
{
// If moving downwards, player not airbourne
if (Velocity.Y >= 0)
{
airbourne = false;
Position.Y = game.getCollisionDistance(boundingBox()) - 32;
}
else
{
Position.Y = game.getCollisionDistance(boundingBox()) + 32;
}
Velocity.Y = 0;
}
else
airbourne = true;
movingUp = false;
// Reset acceleration
Acceleration = Vector2.Zero;
previousState = currentState;
}