Мне нужна помощь в создании системы столкновений в Java-платформерной игре - PullRequest
1 голос
/ 29 июня 2019

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

Я пытался установить скорость игрока равной нулю, когда он взаимодействует с платформой, но это создает проблему при попытке подняться на вершину платформы, где игрок будет опускаться, а не оставаться на вершине.

    public void setup() {
        background=loadImage("Sprites/Test Background-1.png.png");
        playerSprite= new AnimatedSprite("Idle animation", 8);
        blocks[0]= new BlockCollision();
        blocks[0].Sprite = loadImage("Sprites/Platform Small-1.png.png" );
        blocks[0].x = 250;
        blocks[0].y = 250;
        blocks[0].width = 64;
        blocks[0].height= 64;
        blocks[1]= new BlockCollision();
        blocks[1].Sprite = loadImage("Sprites/Platform Small-1.png.png" );
        blocks[1].x = 0;
        blocks[1].y = 0;
        blocks[1].width = 64;
        blocks[1].height = 64;
        blocks[2]= new BlockCollision();
        blocks[2].Sprite = loadImage("Sprites/Platform Small-1.png.png");
        blocks[2].x = 300;
        blocks[2].y = 400;
        blocks[2].width = 64;
        blocks[2].height = 64;

    }
    public void settings() {
        size (500, 500);
    }
    public void draw() {
        background(background);
        if(grounded==false){
            playerVelocity.y += 1;
        }
        playerPosition.x +=
                playerVelocity.x;
        playerPosition.y +=
                playerVelocity.y;
        if (playerPosition.y > 468) {
            playerPosition.y = 468;
            playerVelocity.y = 0;
            jumpAmount=0;
        }
        playerSprite.animate
                (playerPosition.x, playerPosition.y);
            //checks for if it touches any side of the platform
        if(playerPosition.y+ playerDimensions>= blocks[0].y
                && playerPosition.x+ blockDimensions>=blocks[0].x
                &&playerPosition.y<=blocks[0].y+blockDimensions
                && playerPosition.x<=blocks[0].x){
//sets velocity to zero to ensure that any other interaction with the platform works
            playerVelocity.x=0;
            playerVelocity.y=0;

            if(playerPosition.y+ blockDimensions<=blocks[0].y){
                grounded=true;
            }
            else grounded = false;
        }


        image(blocks[0].Sprite, blocks[0].x, blocks[0].y);
        image(blocks[1].Sprite,blocks[1].x,blocks[1].y);
        image(blocks[2].Sprite,blocks[2].x,blocks[2].y);
    }

Предполагается, что игрок все еще находится на платформе, но вместо этого он проваливается.

1 Ответ

0 голосов
/ 29 июня 2019

Одно решение может быть с Матрицей препятствий, заполненной 0 для разрешения (перемещения) и 1 с запретом движения (и оставаться там, если достигают) Размер матрицы может отражать размер экрана, например (800x600). Для гораздо большей простоты использования можно предположить, что 1 квадрат = 4x4 пикселей, и уменьшить размер матрицы с (800x600) до (200x150).

Другое решение может быть сделано с проверкой некоторой прямоугольной части другого объекта в сочетании с типом объекта (земля, враг, препятствие). В основном все объекты могут быть обернуты в различные прямоугольные формы (или более сложные, если нужны точные столкновения).

...