簡體   English   中英

C#中的基本沖突代碼-未檢測到沖突

[英]Basic Collision Code in C#- Collision not Detecting

我在嘗試制作一個相當基本的平台游戲時遇到一些問題。 我正在嘗試編寫碰撞代碼,以便玩家可以在列表中的各個隨機平台上着陸,但是盡管我嘗試了各種方法,但我用來控制角色是否正在經歷重力的布爾值不是當角色離開平台時不會達到false的值,因此角色可以沿任一方向在空中漂浮。 它們也沉入平台中,但我想使它們站在頂部。

播放器類采用位置矢量,速度矢量,方向字符串和布爾值作為是否登陸的參數。 update方法中的代碼如下,但我還將放入確定對象是否位於頂部的代碼。

character.position += character.velocity;

 if (character.landed == false)
                    character.velocity.Y = character.velocity.Y + 0.15f;
                else character.velocity.Y = 0;
            foreach (Platform p in Platforms)
            {
                for (int i = 0; i < p.size; i++)
                {
                    if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
                        || (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true))
                    {
                        character.landed = true;
                    }
                    if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true) 
                        && character.position.X + 3f > p.xPos + (32*p.size)
                      || (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
                        && character.position.X -3f < p.xPos)
                    {
                        character.landed = false;
                    }

                } 

            }
            if (InputHandler.KeyPressed(Keys.Left))
            {
                character.velocity.X = -3f;
                character.direction = "Left";
            }
            if (InputHandler.KeyPressed(Keys.Right))
            {
                character.velocity.X = +3f;
                character.direction = "Right";
            }
            if ((InputHandler.KeyPressed(Keys.Space) || InputHandler.KeyPressed(Keys.W)) && character.landed == true)
            {
                character.position.Y = character.position.Y - 10f;
                character.velocity.Y = -7.5f;
                character.landed = false;
            }
            if (character.position.Y > 3000)
            {
                GameRef.Exit();
            }
        }

碰撞布爾值如下:

    public bool isOnTopOf(Vector2 item1Position, Texture2D item1Sprite, Vector2 item2Position, Texture2D item2Sprite)
    {
        area1.X = (int)item1Position.X;
        area1.Y = (int)item1Position.Y;
        area2.X = (int)item2Position.X;
        area2.Y = (int)item2Position.Y;
        area1.Width = item1Sprite.Width;
        area1.Height = item1Sprite.Height;
        area2.Width = item2Sprite.Width;
        area2.Height = item2Sprite.Height;

        return (area1.Bottom >= area2.Top - 3 && area1.Bottom <= area2.Top + 3 && area1.Right >= area2.Left - 3 
            && area1.Left <= area2.Right + 3);
    }

我非常感謝您提供的幫助,這些幫助不需要我刪除到目前為止已經完成的所有代碼,但是可以讓我稍加修改。 我受到時間限制...此外,以下代碼(包含在第一個代碼段中)是我添加的部分,以阻止角色從平台上空走,由於某種原因,該代碼未返回true。

if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true) 
                    && character.position.X + 3f > p.xPos + (32*p.size)
                  || (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
                    && character.position.X -3f < p.xPos)
                {
                    character.landed = false;
                }

循環瀏覽每個平台,並選擇與玩家的速度/位置最近的平台進行碰撞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM