Ошибка столкновения в 2D Java Platformer - PullRequest
0 голосов
/ 21 мая 2019

В настоящее время я разрабатываю 2D-платформер на Java без использования библиотек.У меня коллизии работают нормально, когда игрок движется влево и вправо и прямо вверх и вниз.Но когда игрок сталкивается с плиткой горизонтально, когда он падает или прыгает, он входит внутрь плитки и может перемещаться влево / вправо внутри нее, но не падает и не может прыгать.

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

protected boolean collision(double xa, double ya)
{
    boolean solid = false;

    for (int c = 0; c < 4; c++)
    {
        int xt = (int) Math.round(((x + xa) + c % 2 * 9 - 1) / Tile.SIZE);
        int yt = (int) Math.round(((y + ya) + c / 2 * 14 - 2) / Tile.SIZE);

        if (level.getTile(xt, yt).isSolid()) solid = true;
    }


    return solid;
}

Метод перемещения:

public void move(double xa, double ya)
{
    if (!collision(xa, ya))
    {
        x += xa;
    }

    if (!collision(0, ya))
    {
        y += ya;
    }
}

и метод обновления проигрывателя:

public void update()
{
    boolean left = Keyboard.isKeyDown(KeyEvent.VK_A);
    boolean right = Keyboard.isKeyDown(KeyEvent.VK_D);
    boolean jump = Keyboard.isKeyDown(KeyEvent.VK_SPACE);
    boolean mousePressed = Mouse.isMousePressed();

    double xa = 0;
    double ya = 0;

    if (left && !right)
    {
        moving = true;
        xFlip = true;
        xa -= currentSpeed;
    }
    else if (right && !left)
    {
        moving = true;
        xFlip = false;
        xa += currentSpeed;
    }
    else
    {
        moving = false;
    }

    if (onGround)
    {
        yVel = 0;
        currentSpeed = speed;
        jumped = false;
        this.jump.reset();

        if (jump)
        {
            yVel = -5;
            currentSpeed = speed + jumpSpeedIncrease;
            run.reset();
            idle.reset();
            idleTimer = 0;
            jumped = true;
        }
        else if (moving)
        {
            run.update();
            sprite = run.getSprite();
            idle.reset();
            idleTimer = 0;
        }
        else if (!moving)
        {
            if (idleTimer <= idleSleepTimeSeconds * Main.getDesiredUps())
            {
                idleTimer++;
                idle.update();
                sprite = idle.getSprite();
            }
            else
            {
                idle.reset();
                sprite = Sprite.PLAYER_IDLE4;
            }

            run.reset();
        }

        if (!punching && mousePressed && ++punchTimer >= punchTimerSeconds * Main.getDesiredUps())
        {
            punchTimer = 0;
            punching = true;
        }

        if (punching && (!punch.finished() || punch.isReset()))
        {
            punch.update();
            sprite = punch.getSprite();
        }
        else if (punching && punch.finished())
        {
            punching = false;
            punch.reset();
        }
    }
    else
    {
        yVel += .25;

        if (!jumped)
        {
            ya += yVel;
        }

        if (collision(0, yVel)) yVel = 0;
    }

    if (jumped)
    {
        this.jump.update();
        sprite = this.jump.getSprite();
        ya += yVel;
    }

    groundYA = ya + .5;
    onGround = collision(0, groundYA) && groundYA > 0;
    move(xa, ya);
}

Вот видео, которое я разместил о том, что происходит: https://www.youtube.com/watch?v=JIoKMuTeuow

Если у кого-то есть какие-либо идеи, пожалуйста, дайте мне знать!

РЕДАКТИРОВАТЬ: исправлены некоторые грамматики в посте и добавлено еще несколько тегов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...