Как реализовать ускорение долгим нажатием клавиши в фреймворке фазера

Я разрабатываю свою первую фазерную игру для клиента. Игра представляет собой автомобиль, который движется вперед, и у него есть две минуты, чтобы забить гол.

Я хочу постепенно увеличивать скорость автомобиля, пока нажата клавиша «Вверх», пока не будет достигнуто ограничение скорости.

Я двигаю гоночную трассу, а не машину, делая:

this.highway2 = game.add.tileSprite(game.world.centerX,game.world.height/2,   game.cache.getImage('highway').width, game.cache.getImage('highway').height, 'highway');
this.highway2.anchor.setTo(0.5,0.5);
this.highway2.autoScroll(0,1000);

Итак, мои вопросы:
как я могу контролировать скорость автопрокрутки, чтобы имитировать ускорение? Есть ли способ узнать, сколько времени была нажата клавиша? Это правильный подход, чтобы сделать это?

Заранее спасибо.


person saRca    schedule 09.10.2014    source источник
comment
GameAlchemist, ты не прав. Мне просто нужно какое-то направление. Это мой первый раз с фазером и разработкой игры. Я не прирожденный оратор, поэтому я не знаю, носит ли ваш комментарий дружеский тон, но я думаю, что последняя часть (если я правильно угадал, ваш вопрос: «Не могли бы вы написать код для меня?») не добавляет ценности. Спасибо.   -  person saRca    schedule 09.10.2014
comment
@GameAlchemist, еще раз спасибо за ваши комментарии. Сосредоточимся на вопросах. Можете ли вы помочь с некоторыми из них?   -  person saRca    schedule 09.10.2014


Ответы (2)


Ну, я не знаю, лучший ли это способ сделать это, но он работает довольно хорошо. Просто установите ограничение скорости и отслеживайте его в функции обновления.

var playState = {
create: function(){

    this.setInitialValues();


    game.physics.startSystem(Phaser.Physics.ARCADE);        
    this.cursor = game.input.keyboard.createCursorKeys();

    //highway       
    this.highway2 = game.add.tileSprite(game.world.centerX,game.world.height/2, game.cache.getImage('highway').width, game.cache.getImage('highway').height, 'highway');
    this.highway2.anchor.setTo(0.5,0.5);
    this.highway2.autoScroll(0,0);

    //car
    this.player = game.add.sprite(game.world.centerX+10, game.world.height-150, 'player');
    this.player.anchor.setTo(0.5,0.5);
    game.physics.arcade.enable(this.player);

    //other things

},
update: function(){
    this.movePlayer();  
},
movePlayer: function(){
    // move left and right
    // If the left arrow key is pressed 
    if (this.cursor.left.isDown) 
    {
        // Move the player to the left
        this.player.body.velocity.x = -200; 
    }
    // If the right arrow key is pressed
    else if (this.cursor.right.isDown) 
    { // Move the player to the right 
        this.player.body.velocity.x = 200;
    }
    // If neither the right or left arrow key is pressed
    else 
    {
        // Stop the player 
        this.player.body.velocity.x = 0;
    }

    //speed up and speed down
    if (this.cursor.up.isDown)
    {
        if(this.currentSpeed < this.maxSpeed )
        {
            this.currentSpeed+=10;
            this.highway2.autoScroll(0,this.currentSpeed);
        }

    }
    else{
            if(this.currentSpeed > 0 )
        {
            this.currentSpeed-=10;
            this.highway2.autoScroll(0,this.currentSpeed);
        }
    }

    if (this.cursor.down.isDown)
    {
        if(this.currentSpeed > 0 )
        {
            this.currentSpeed-=30;
            this.highway2.autoScroll(0,this.currentSpeed);
        }
    }
},
setInitialValues: function(){
    this.maxSpeed=1500;
    this.currentSpeed=0;
}
}   
person saRca    schedule 09.10.2014

Вы должны применять строгое разделение задач: 1) упростить кодирование 2) упростить тонкую настройку и даже сделать игру более интересной и 3) легко «подключить» свою логику к другому контроллеру (событие касания вместо клавиатуры).

Таким образом, у вас есть две отдельные задачи:
* измерить, как долго пользователь ускоряется.
* учитывая текущую скорость, минимальную/максимальную скорость, время тяги, решить, каково текущее ускорение (== изменение скорости).

Для 1) это довольно прямолинейно: запишите время начала ввода, теперь продолжительность - это текущее время - время начала. Вам лучше использовать игровое время, если оно у вас есть (а не Date.now()), чтобы избежать неожиданностей после возобновления игры после долгого перерыва.

Для 2) Вы должны точно настроить ускорение / замедление вашей игры, это сделает ее более интересной.
Наиболее очевидным является отсутствие постоянного ускорения: должно быть все труднее и труднее достичь последнего % от максимальной скорости. . Таким образом вы даете и стимул/вознаграждение игроку за то, чтобы он не касался препятствия.
Что делать, если игрок не толкается, я не знаю : медленно тормозить или быстро возвращаться к нормальной скорости ?
Также вы Придется решить, будет ли ускорение бесконечным или нет, и, возможно, время охлаждения.

Таким образом, функция, вычисляющая текущее ускорение, зависит от тяги (bool), времени тяги (double) и RegularSpeed, maxSpeed, minAcc, maxAcc.

Здесь есть много вариантов, но код для вычисления ускорения может выглядеть так:

 if (thrusting) {
     // if we're not even at regular speed, max acceleration
     if (speed<regularSpeed) { acc = maxAcc; return; }
     // if we are above maxSpeed, no acceleration  (?? or friction ??)
     if (speed>maxSpeed) { acc=0; return; }
     // compute current speed ratio
     // a figure in [0;1] representing where is the speed in [minSpeed; maxSpeed]
     var speedRatio = (currSpeed-regularSpeed)/(maxSpeed-regularSpeed);
     // ease this ratio as you like
     speedRatio = Math.sqrt(speedRatio);
     // compute acceleration : the more speed, the less acceleration
     // you might want to put one/some threshold this formula.
     acc= minAcc + (1-speedRatio)*(maxAcc-minAcc);
     return;
 } else {
     // do nothing if <= regularSpeed.
     if (speed<=regularSpeed) { acc=0 ; return;}
     // reduce speed if above regular speed
     acc = breakAcc ; // or with friction =>  acc = - k * currSpeed;
     return;
 }
person GameAlchemist    schedule 10.10.2014
comment
Спасибо за ваш подход. Это лучше моего. Постараюсь реализовать и сообщу как работа. - person saRca; 10.10.2014