繁体   English   中英

创建AC#和XNA类“ Monster Dash”游戏

[英]Creating A C# & XNA 'Monster Dash' Like Game

我决定,我去年的C#项目将是一个类似Monster Dash的游戏,我将使用C#和XNA开发它,并且它将针对PC,我正在使用Microsoft Visual Studio 2010和XNA Game Studio 4.0。 该游戏将是2D游戏,而不是3D。

考虑到开发过程,出现了一些问题:

首先 ,我需要创建一个“排序平台”,玩家将在该平台上运行并在它们之间存在漏洞和空隙(将随机出现),我不知道该怎么做! 我发现的唯一接近的东西可能是微软提供的名为“ Platformer ”的示例代码,我不理解(可能有人可以解释他们在此处使用的方法,或者更好/更简单的方法) )。

其次 ,我需要玩家跳跃(以避免间隙和漏洞并继续奔跑),而且我不知道如何处理该功能的物理部分,如果有人可以提出解决方法,我将非常高兴或指向一段有用的代码。

谢谢你,iLyrical。

毫无疑问,仅仅因为它是2D平台游戏并不是一件容易的事。 因此,我建议您使用任何可以获得的第三方库帮助,使用XNA和C#已经是一个不错的起点。 接下来是,这是您的问题出现的地方,如何解决物理问题? 您可以自己编写它,这是一次不错的学习经历,但是如果时间很紧迫,则可能会很困难且令人沮丧。 因此,我建议为此使用第三方库,例如Farseer 也许这个小教程也会派上用场。

但是,这绝对不是一件容易的事。 根据您的技能,我当然不知道,我建议您使用一种更简单的游戏,如果它一定是一款游戏。 游戏可能是您可以想象的最困难的编程任务。 同时处理多个子系统(图形,人工智能,声音,输入,物理); 使它们协同工作已经是一项艰巨的任务,但是拥有内容(Sprites,Wavs,Music,Menu gfx等)本身就是另一种野兽。

最后的建议是,如果您不理解Platformer代码; 再读一次; 如果您不了解某些部分,请先阅读有关它们的内容。 如果您在使用c#时遇到问题,请先学习它,然后再停下来学习。 还请阅读您可以找到的尽可能多的有关游戏的教程和代码。 重要的是要了解其他人如何以及为什么以他们的方式解决问题。

Microsoft网站上的平台程序示例是一个很好的起点。

基于该示例,我在不久前做了类似的事情。 它是一种基于图块的方法,其中有一个二维的“图块”列表(图块列表列表List>),您为图块设置了静态尺寸(例如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;

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM