创建c# &Monster Dash'就像游戏
本文关键字:游戏 Dash Monster 创建 | 更新日期: 2023-09-27 18:09:44
我决定我的最后一个c#项目将是一个类似于《Monster Dash》的游戏,我将使用c#和XNA开发它,它将针对pc,我使用Microsoft Visual Studio 2010和XNA game Studio 4.0。游戏应该是2D游戏,而不是3D游戏。
思考发展过程中出现的几个问题:
首先,我需要创建一个"某种平台",玩家将在其上运行,它们之间将有洞和间隙(这将随机出现),我不知道如何做到这一点!我所发现的唯一能够解释这一问题的是一段来自微软的名为"Platformer"的示例代码,我不理解它(如果有人能够解释他们在那里使用的方法,或者更好/更简单的方法,那就太好了)。
第二个,我需要玩家跳跃(为了避免空隙和洞并继续奔跑),我不知道如何处理该功能的物理部分,如果有人能建议一种处理方法,或者指出一段有用的代码,我会非常高兴。
谢谢你,iLyrical.
毫无疑问,因为它是2D游戏,所以创造平台游戏并不容易。所以我建议你使用任何你能得到的第三方库帮助,使用XNA和c#已经是一个很好的起点。下一件事是,这就是你们的问题所在,如何解决物理问题?你可以自己写,这是一个很好的学习经验,但如果时间紧迫,它可能会很困难和令人沮丧。所以我建议使用第三方库,比如Farseer。也许这个小教程也会派上用场。
但是,这绝对不是一件容易的事。根据你的技能,我当然不知道,我建议你选择更简单的游戏,如果它真的是游戏的话。游戏可能是你能想象到的最困难的编程任务。同时处理多个子系统(图形、AI、声音、输入、物理);让它们一起工作已经是一项艰巨的任务,但拥有内容(精灵,波浪,音乐,菜单gfx等)则是另一项艰巨的任务。
最后的建议是,如果你不理解平台游戏代码;一遍又一遍地读;如果你不明白某些部分,那就去读,直到你明白为止。如果你在c#上有问题,首先学习它,永远不要停止学习。同时也要阅读尽可能多的游戏教程和代码。重要的是要了解其他人如何以及为什么用他们的方式解决问题。
微软网站上的平台示例是一个很好的开始。
我做了一些类似的东西,有点基于这个例子。这是一种基于平铺的方法,你有一个二维的"贴图"列表(一个包含贴图列表的列表),你为贴图设置一个静态的大小(比如16x16像素),然后它只是通过列表来循环绘制/进行碰撞检测等问题。只是考虑一下,如果我考虑一下,我可以稍后发布一些代码,如果你想的话,它在家里。
我通常处理运动物理的一个简单方法是使用3个Vector2对象,一个用于位置,一个用于速度,一个用于加速度。如果你熟悉简单的物理,位置=速度* deltaTime,速度=加速度* 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;
}