Тема: PlayCanvas
Показать сообщение отдельно
Старый 26.06.2015, 19:00   #76
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: PlayCanvas

Сообщение от 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.0;
                    
this.playerVelocity.0;
                    
                    var 
ls this.lastRayEntity.getLocalScale().this.player.getLocalScale().y;
                    
pos.this.lastRayEntity.getPosition().ls ;
                    
//pos.x = this.lastRayEntity.getPosition().x;
                    
this.player.setPositionpos );
                    
this.playerOnGround true;
                }
                
                var 
yJVel this.gameG this.jumpTime 2;
                
                if(
app.keyboard.wasPressed(pc.KEY_UP)) {
                    
this.playerVelocity.yJVel;
                }
                
                if(
app.keyboard.wasPressed(pc.KEY_LEFT)) {
                    
this.playerVelocity.=  yJVel;
                    
this.playerVelocity.x  = -this.jumpdV.this.jumpTime;
                }
                
                if(
app.keyboard.wasPressed(pc.KEY_RIGHT)) {
                    
this.playerVelocity.=  yJVel;
                    
this.playerVelocity.this.jumpdV.this.jumpTime;
                }
                
            } else {
                
                
this.playerOnGround false;
                
this.playerVelocity.-= this.gameG  *  dt;
                
console.log("[game] fall");
                if(
pos.< -) {
                    
this.playerReset();
                }
            }
            
            
this.player.translate(this.playerVelocity.dtthis.playerVelocity.dt ,0);

        }, 
__________________
Сайт: http://iexpo.ml

Последний раз редактировалось RegIon, 26.06.2015 в 21:21.
(Offline)
 
Ответить с цитированием