2

Я создаю 2D-платформерную игру. У меня проблемы с моими столкновениями. Когда мой персонаж попадает, он стоит на вершине платформы, он останется там на 2,5 секунды, затем провалится через все другие платформы на первый этаж. Я думаю, что он должен что-то сделать с моей функцией гравитации, а функция столкновения не работает вместе должным образом. Я действительно не могу понять, что любая помощь будет оценена.AS3-символ падает через платформы, столкновение не работает должным образом

это = fireboy1

Вот гравитация код из моего класса персонажа:

public var gravity:int = 0; 
public var floor:int = 461; 

public function adjust():void 
    { 
     //applying gravity 
     this.y += gravity; 
     if(this.y + this.height <floor) 
      gravity++; 
     else 
     { 
      gravity = 0; 
      this.y = floor - this.height; 
     } 

и вот код для моих столкновений с основного класса:

//collision detection of platform1 
    public function platform1Collision():void 
    { 
     if(fireboy1.hitTestObject(Platform1)) 
     { 
      if(fireboy1.y > Platform1.y) 
      { 
       fireboy1.y = Platform1.y + Platform1.height; 
      } 
      else 
      { 
       fireboy1.y = Platform1.y - fireboy1.height; 
      } 
     } 
+0

пытается сделать: если ((this.y + this.height) <этаж) гравитации ++; ... – tziuka

+0

, который ничего не менял :( –

+1

просто касательный, но гораздо проще использовать физическую структуру для этого. Как box2d и т. Д. Выполняет ли 'adjust()' и 'platform1Collision()' запуск каждого кадра В идеале они должны быть в одной и той же функции, и вы должны НЕ запускать гравитацию ('this.y + = gravity'), если возникает столкновение. Обновите свой вопрос, чтобы включить область вашего кода (например, что это такое в первый блок и как он относится ко второму блоку кода) – BadFeelingAboutThis

ответ

0

Ваш вопрос, вероятно, что положение y увеличивается каждый кадр (независимо от любых столкновений)

Лучшим подходом было бы создать один игровой цикл/Enter Frame handler вместо одного для игрока, по одному для каждой платформы и т. Д. У вас также была некорректная математика с вычислением позиции игроков относительно платформы и пола.

public var gravity:int = 0; 
public var floor:int = 461; 

//add this in your constructor or init of the class 
this.addEventListener(Event.ENTER_FRAME, gameLoop); 

function gameLoop(e:Event):void { 

    //start with all your platform collisions 
    if(fireboy1.hitTestObject(Platform1)) 
    { 
     if(jumping){ //some flag that indicates the player is jumping at the moment 
      //place fireboy right under the platform 
      fireboy1.y = Platform1.y + Platform1.height; 
     }else{ 
      //place fireboy on the platform perfectly 
      fireboy1.y = (Platform1.y + Platform1.height) - fireboy1.height; //changed your math here 
      return; //there's no use checking any other platforms or doing the gravity increment, since the player is already on a platform, so exit this method now. 
     } 
    } 

    //any other platform checks (should be done in a loop for sanity) 

    //if we made it this far (no returns), then do the gravity adjustments 
    fireboy1.y += gravity; 
    if(fireboy1.y - fireboy1.height < floor){ //changed your math here 
     gravity++; 
    } else 
    { 
     gravity = 0; 
     fireboy1.y = floor - fireboy1.height; 
    } 
} 
+0

это работает, но когда fireboy1 попадает на платформу из-под нее, прыгает на платформе –

+0

. Вы можете либо сделать то, что было раньше (используйте позицию, чтобы определить, находится ли платформа выше или ниже игрока), либо лучший способ отслеживать направление игрока (перемещаются ли они вверх или вниз) и основывается на размещении что. – BadFeelingAboutThis