2

私はクライアント向けの最初のフェイザー ゲームを開発しています。ゲームは前進する車で、ゴールまであと 2 分です。

アップキーを押している間、制限速度に達するまで徐々に車速を上げたい。

次のようにして、車ではなく競馬場を動かしています。

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);

だから、私の質問は次
のとおりです。加速をシミュレートするために autoScroll の速度を制御するにはどうすればよいですか? キーが押された時間を知る方法はありますか? これはこれを行うための正しいアプローチですか?

ありがとうございます。

4

2 に答える 2

3

これがこれを行うためのより良い方法かどうかはわかりませんが、かなりうまく機能しています。速度制限を設定し、更新機能で追跡するだけです。

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;
}
}   
于 2014-10-09T17:29:19.530 に答える
1

1) コーディングを簡素化する、2) 微調整を容易にし、ゲームをより面白くする、3) ロジックを別のコントローラー (キーボードではなくタッチ イベント) に簡単に「接続」するために、懸念事項を厳密に分離する必要があります。

したがって、ここでは 2 つの個別の懸念事項があります。
* ユーザーが加速している時間を測定します。
* 指定された現在の速度、最小/最大速度、推力時間、現在の加速度 (== 速度の変化) を決定します。

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;
 }
于 2014-10-10T14:18:19.970 に答える