Сообщение от Igor
ну, добавить параметры - время прыжка t, ускорение свободного падения g и расстояние между дорожками l.
Тогда горизонтальная скорость vx =l/t, вертикальная vy = g*t/2.
В принципе, позицию можно описать как функцию от времени и вообще не думать о скоростях.
|
расстояние фиксированное - 1, но если ступенька ниже - то + 1 на каждую ступеньку, собственно -1, если ступенька выше - это нужно тоже учесть.
Но спасибо, что-то зациклился на dt, dv, dx и т.д,
Моделька в момент приземления как-то резко дёргается - приземляется раньше, чем должно быть с точки зрения смотрящего на полёт игрока
|
это из-за того, что модель не долетает по x и центрируется на дорожку.
Cделал по совету Igor'a, получил гон - чем дольше двигаешься - тем дальше смещаешься по x, будто мир сужается.
Все перепроверил. Шаг между центрами линии - 2 метра, поворотов нет, формулы везде одинаковые. Грешу на нестабильность dt. При jumpTime < 0.3 начинает часто проваливаться сквозь линии, ну и сильнее разброс. Но если dt = 1/60 - так же. Теперь грешу на translate, не могу понять как он реализован, не могу найти в исходниках на GitHub. ( вот из-за этого мне и пришлось центрировать игрока)
Демка. Без визуала:
http://playcanv.as/b/79dqc4oE
Весь скрипт:
https://playcanvas.com/editor/code/348465/Game.js
Кусок кода:
movePlayer: function(dt) {
var dz = this.checkGround()
var pos = this.player.getPosition();
if(dz!==null && dz < 0.05 && dz > -.2) {
if(this.lastRayEntity !== null && !this.playerOnGround) {
this.playerVelocity.y = 0;
this.playerVelocity.x = 0;
var ls = this.lastRayEntity.getLocalScale().y + this.player.getLocalScale().y;
pos.y = this.lastRayEntity.getPosition().y + ls / 2 ;
//pos.x = this.lastRayEntity.getPosition().x;
this.player.setPosition( pos );
this.playerOnGround = true;
}
var yJVel = this.gameG * this.jumpTime / 2;
if(app.keyboard.wasPressed(pc.KEY_UP)) {
this.playerVelocity.y = yJVel;
}
if(app.keyboard.wasPressed(pc.KEY_LEFT)) {
this.playerVelocity.y = yJVel;
this.playerVelocity.x = -this.jumpdV.x / this.jumpTime;
}
if(app.keyboard.wasPressed(pc.KEY_RIGHT)) {
this.playerVelocity.y = yJVel;
this.playerVelocity.x = this.jumpdV.x / this.jumpTime;
}
} else {
this.playerOnGround = false;
this.playerVelocity.y -= this.gameG * dt;
console.log("[game] fall");
if(pos.y < -4 ) {
this.playerReset();
}
}
this.player.translate(this.playerVelocity.x * dt, this.playerVelocity.y * dt ,0);
},