Обнаружение столкновений Пакмана - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь создать игру pacman для изучения XNA, но у меня возникают некоторые проблемы, связанные с обнаружением столкновений.Игра основана на плитке, где 1 - стена, а 0 - проходимая.Затем он берет плитку, на которой вы стоите, плюс 4 вокруг нее, и если он сталкивается с одним из них, а значение плитки не равно 0, он сбрасывает положение до того, что было до перемещения.Однако по какой-то причине он просто не работает, он случайно зависает, и иногда я могу даже двигаться сквозь стены.enter image description here

Вот мое обнаружение столкновений:

    var oldPos = Position;
    // Updates the Position
    base.Update(theGameTime, mSpeed, mDirection);

    // Test Collidetion
    Rectangle objRect = new Rectangle((int)Position.X, (int)Position.Y, 32, 32);
    bool isCollided = false;
    Vector2 curTitle = GetCurrentTitle();

    // Test UP, DOWN, LEFT, RIGHT
    int tile;
    Rectangle testRect;

    if ((int)curTitle.Y < 0 || (int)curTitle.X < 0 || (int)curTitle.Y >= map.MapSizeWidth - 1 || (int)curTitle.X >= map.MapSizeHeight - 1)
        isCollided = true;

    if (!isCollided)
    {
        tile = map.Tiles[(int)curTitle.Y, (int)curTitle.X];
        testRect = new Rectangle(((int)curTitle.X) * map.TileSize, ((int)curTitle.Y) * map.TileSize, map.TileSize, map.TileSize);
        if (tile != 0 && rectangle_collision(testRect, objRect))
            isCollided = true;

        if (curTitle.Y != 0)
        {
            tile = map.Tiles[(int)curTitle.Y - 1, (int)curTitle.X];
            testRect = new Rectangle(((int)curTitle.X) * map.TileSize, ((int)curTitle.Y - 1) * map.TileSize, map.TileSize, map.TileSize);
            if (tile != 0 && rectangle_collision(testRect, objRect))
                isCollided = true;
        }

        tile = map.Tiles[(int)curTitle.Y + 1, (int)curTitle.X];
        testRect = new Rectangle(((int)curTitle.X) * map.TileSize, ((int)curTitle.Y - 1) * map.TileSize, map.TileSize, map.TileSize);
        if (tile != 0 && rectangle_collision(testRect, objRect))
            isCollided = true;

        if (curTitle.X != 0)
        {
            tile = map.Tiles[(int)curTitle.Y, (int)curTitle.X - 1];
            testRect = new Rectangle(((int)curTitle.X - 1) * map.TileSize, ((int)curTitle.Y) * map.TileSize, map.TileSize, map.TileSize);
            if (tile != 0 && rectangle_collision(testRect, objRect))
                isCollided = true;
        }

        tile = map.Tiles[(int)curTitle.Y, (int)curTitle.X + 1];
        testRect = new Rectangle(((int)curTitle.X + 1) * map.TileSize, ((int)curTitle.Y) * map.TileSize, map.TileSize, map.TileSize);
        if (tile != 0 && rectangle_collision(testRect, objRect))
            isCollided = true;
    }
    if (isCollided)
        Position = oldPos;

Кто-нибудь может понять, почему мое обнаружение столкновений не работает?

РЕДАКТИРОВАТЬ: Я загрузил весь проект на http://sogaard.us/Pacman.zip

Ответы [ 2 ]

1 голос
/ 30 января 2012

Я не уверен, что это вызывает полную проблему.Но на третьей проверке плитки (где вы проверяете плитку ниже) вы проверяете плитку выше.

Эта часть здесь:

tile = map.Tiles[(int)curTitle.Y + 1, (int)curTitle.X];

На следующей строке у вас все еще есть это внутрипараметры для testRect:

((int)curTitle.Y - 1) * map.TileSize

Должно быть:

((int)curTitle.Y + 1) * map.TileSize

Полный исправленный фрагмент:

tile = map.Tiles[(int)curTitle.Y + 1, (int)curTitle.X];
    testRect = new Rectangle(((int)curTitle.X) * map.TileSize, ((int)curTitle.Y + 1) * map.TileSize, map.TileSize, map.TileSize);
    if (tile != 0 && rectangle_collision(testRect, objRect))
        isCollided = true;

Надеюсь, это помогло:)

0 голосов
/ 25 января 2012

Эта строка выглядит для меня странно:

testRect = new Rectangle(
    ((int)curTitle.X) * map.TileSize, 
    ((int)curTitle.Y) * map.TileSize, 
    map.TileSize, 
    map.TileSize);

Почему вы умножаете координаты X и Y на TileSize?

Я не знаю, что должны означать параметры для Rectangle, но я предполагаю, что первые два - это позиции, а последние две - ширина и высота.Я думаю, ты хотел написать

testRect = new Rectangle(
    ((int)curTitle.X), 
    ((int)curTitle.Y), 
    map.TileSize, 
    map.TileSize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...