Как я могу применить различные силы, используя векторы? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь сделать простую игру с боковым скроллером в p5.js.Насколько я понял, мне нужны векторы, имитирующие физику реального мира.Все, что мне действительно нужно, это сила, которая толкает игрока вниз, и сила, которая заставляет его прыгать при нажатии клавиши.Я смотрел видео с YouTube на эту тему, и я почти уверен, что следовал ему в точности так, как было описано, но я получаю другой результат.Мои ключи не всегда обнаруживаются, а также имеют разную силу.Заранее спасибо.

// This is a part of a player class that I have
update(){
  this.pos.add(this.vel)
  this.vel.add(this.acc)
}

applyForce(force){
  this.vel.add(force)
}

earth(){
  if (this.pos.y > height - 100){
    this.pos.y = height - 100
    this.acc.y *= 0
  }
}

// This is where I detect the pressed key
function keyPressed(){
  let jump = createVector(0,-10)
  player.applyForce(jump)
}

// And then in the draw function i have this
player.applyForce(gravity)
player.earth()

1 Ответ

0 голосов
/ 27 декабря 2018

Основные проблемы:

  • applyForce должен добавить вектор силы к ускорению , а не к скорости.
  • Вы не должны обновлять физику вфункция рисования, но в update.
  • . В играх прыжковая механика обычно реализуется как импульс (т.е. изменение скорости) вместо силы.Для этого вы можете добавить функцию applyImpulse.
  • Вы должны всегда сбрасывать ускорение после обновления, чтобы силы не накапливались.

Измененный код:

// move all updates to here
update(){
  this.acc.add(gravity)
  this.pos.add(this.vel)
  this.vel.add(this.acc)

  this.earth()

  this.acc = createVector(0, 0)
}

// add to acceleration, not velocity
applyForce(force){
  this.acc.add(force)
}

// impulse for jumping
applyImpulse(imp){
  this.vel.add(imp)
}

// set vertical *velocity* to zero, not acceleration
earth(){
  if (this.pos.y > height - 100){
    this.pos.y = height - 100
    this.vel.y = 0
  }
}

// apply the impulse to jump
function keyPressed(){
  let jump = createVector(0,-10)
  player.applyImpulse(jump)
}

// no updating in the draw function
...