创建一个C#& XNA'Monster Dash'喜欢游戏

时间:2011-09-27 17:21:51

标签: c# .net visual-studio xna

我认为我去年的C#项目将是一个'Monster Dash'类游戏,我会用C#和XNA开发它,它将针对PC,我使用的是Microsoft Visual Studio 2010, XNA Game Studio 4.0。游戏将是2D游戏,而不是3D游戏。

对发展过程的思考,出现了一些问题:

首先,我需要创建一个“平台排序”,玩家将在其上运行,并且它们之间会有漏洞和间隙(这将随机出现)我不知道如何要做到这一点!我发现的唯一一个可能解释的问题是微软的一个名为“Platformer”的示例代码,我不明白(有人可以解释他们在那里使用的方法,或者更好/更简单的方法)。

第二次,我需要玩家跳(为了避免间隙和洞并继续跑)我不知道如何接近该功能的物理部分,我会非常高兴,如果有人可以建议一种方法来处理,或指向一段有用的代码。

非常感谢,iLyrical。

2 个答案:

答案 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;

    }