2015-06-21 2 views
1

В настоящее время я создаю 2D-платформер на Java. Я новичок, так что успокойся. У меня проблема с гравитацией в игре. Я использую разные переменные для падения и прыжков. Я использую черепичную карту. Поэтому давайте перейдем к делу. Моего метод падения работает как это -Java 2D Platformer Gravity

if(collisionDown == false) { 
    characterY += fall; 
    fall ++; 
{ 

падение равно 4. Если и collisionDown правды он сбрасывает обратно 4.

Моего метод прыжка почти то же самый:

if(key.E == true && collisionDown == true) { 
    characterY -= jump; 
    jump --; 
} 

прыжок равен 16. И если значение collisonDown истинно, оно сбрасывается до 16.

Теперь проблема заключается в следующем: представьте, что персонаж прыгает. его в воздухе и при спуске характерY + = падение; скажем, characterY = 250, а падение равно - 15 в этот точный момент. Следующая сплошная плитка под символом начинается с Y-позиции 255. Символ находится на 250 и НЕ обнаруживает столкновение, поэтому в следующем кадре он добавляет 15 к символуY, который равен 250 + 15 = 265. В этот момент символ «ввел» сплошную черепицу который находился в позицииY 255.

У меня есть «исправлено», чтобы персонаж вернулся в верхнюю часть сплошной плитки (и это видно и раздражает.) Это не идеальное решение, потому что оно замедляет символ 1 кадр каждый время, когда он входит в сплошную плитку (потому что он обнаруживает левое и правое столкновение, и персонаж не может двигаться). Характер явно заикается, если я могу так сказать.

Мне нужно решение этой проблемы, но не может придумать. Итак, если вы сделаете предложение, я буду счастлив. Спасибо.

ответ

0

я бы, вероятно, использовать что-то вроде следующего.

if(collisionDown == false) { 
    characterYnext = characterY + fall;   //Get Next Position 
    if(NextMovementCollides()){     //Basically if next position is too far. 
    characterYnext += difference_between(CharacterY,Ground);  //This should move the character to the ground state. 
    fall = 0;             //No longer falling so reset the value. 
    } 
    else{characterY += fall; fall++;}  //Otherwise continue falling like normal. 
} 

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не программист на Java, поэтому мой синтаксис может быть немного выключен.

Это должно работать, просто подключите логику игры, где это будет иметь смысл.

+0

Простой и эффективный. благодаря –

0

Как я обычно справиться с этим, чтобы предварительно проверить движение:

private int moveDown(int fall){ 
     if (isSolidBlock(characterX, characterY + fall)){ 
      //Knowing the height of your block, calculate some kind of reduction. If your block height is 40, it's probably something like (characterY + fall)%40 
      fall = 4; 
      collisionDown = true; 
      return maxFallUntilSolidBlockReached(); 
     } 
     fall++; 
     return fall; 
    } 

private boolean isSolidBlock(int x, int y){ 
     //Implement some kind of check if at (x,y) there's a solid block. 
    } 

Тогда просто сделать это для расчета падения:

if(collisionDown == false) { 
      characterY += moveDown(fall); 
     } 
+0

Hm. Это кажется разумной идеей, но я действительно не понимаю return maxFallUntilSolidBlockReached(); –

+0

Если вы используете сетку, при этом все блоки имеют статическую ширину и высоту, вы знаете y-координату блока под вами. Предположим, что ваши блоки имеют высоту 20 пикселей и characterY + fall = 122. Вы можете вычесть 20 из 122, пока не будет число <20, или просто используйте 122 mod 20. Это приведет к 2, что означает, что вы также упадете на 2 пикселя глубокий. Чтобы исправить это, просто уменьшите characterY + падайте на 2 и используйте это как свое обновление! Это предполагает, что вы используете сетку, конечно. Если это не так, есть другие варианты, но мне нужно будет увидеть, как ваша реализация карты действительно поможет вам тогда =) –

+0

Спасибо за помощь: D, но парень предложил более легкое решение, которое сработало. Спасибо в любом случае –

Смежные вопросы