创建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.

创建c# &Monster Dash'就像游戏

毫无疑问,因为它是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;
    }