Столкновение двигателя плитки - PullRequest
2 голосов
/ 25 марта 2012

Итак, я делаю небольшую игру на основе плиток, теперь я хочу сделать столкновение. Как бы я поступил правильно? Я знаю, как проверить, сталкивается ли игрок с плиткой, но я не знаю, как на самом деле заставить игрока остановиться, когда он столкнется со стеной.

enter image description here

Это игра, у меня здесь 20x20 плиток.

Это код, который я использую atm:

            foreach (Tile tiles in allTiles)
        {
            if (ply.rect.Intersects(tiles.rect))
            {
                if (tiles.ID != -1 && tiles.ID != 1)
                {
                    if (ply.X > tiles.X)
                    {
                        Console.WriteLine("Right part.");
                        ply.X = tiles.pos.X + 30;
                    }

                    if (ply.X <= tiles.X)
                    {
                        Console.WriteLine("Left part.");
                        ply.X  = tiles.pos.X - 30;
                    }

                    if (ply.Y > tiles.Y) 
                    {
                        Console.WriteLine("Bottom part.");
                        ply.Y = tiles.pos.Y + 30;
                    }

                    if (ply.Y <= tiles.Y) 
                    {
                        Console.WriteLine("Upper part.");
                        ply.Y = tiles.pos.Y - 30;
                    }
                }
            }
        }

1 Ответ

1 голос
/ 25 марта 2012

Какой тип обнаружения столкновений вы используете?

Если вы используете Rectangles и метод .intersects, вы всегда можете объявить bool, чтобы убедиться, что ваш персонаж касается пола. Если это не так, вы применяете гравитационный вектор, чтобы заставить его упасть на следующую плитку с другим прямоугольником, поэтому, когда он ударит по нему, он перестанет падать.

Если вы хотите заблокировать его из стороны в сторону, просто проверьте, с какой стороны прямоугольника он касается, и заблокируйте его движение по оси X. Например, если он идет направо и пересекается с левой частью прямоугольника, блок - это движение «GoingRight».

    if(myCharacterRectangle.Intersects(tileRectangle)
    {

        if(myCharacterPosition.X > (tilePosition.X)
       {
         //You know the character hits the Right part of the tile.
       }

        if(mycharacterPosition.X <= tilePosition.X)
       {
         //You know the character hits the Left Part of the tile.
       }

    }

То же самое относится и к Position.Y, если вы хотите проверить вершину или низ.

Если вы хотите использовать Pixel by Pixel для обнаружения столкновений с использованием Matrices, я знаю хороший учебник здесь . Обнаружение вернет «Vector2 (-1, -1)», если столкновения нет. Если он есть, метод возвращает координаты столкновений, что еще более облегчает определение того, к какой части тайла касается ваш персонаж.

Надеюсь, это поможет. Удачи в игре.

...