В настоящее время я разрабатываю 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
Если у кого-то есть какие-либо идеи, пожалуйста, дайте мне знать!
РЕДАКТИРОВАТЬ: исправлены некоторые грамматики в посте и добавлено еще несколько тегов