爆撃機のクローン、爆弾を行うには?


8

私はボンバーマンのクローンをいじって、ゲーム開発を学びます。

これまでのところ、タイル、移動、衝突の検出、アイテムのピックアップを行いました。また、疑似爆撃を行っています(グラフィックスと衝突のみで、実際の機能はありません)。

私は現在持っている機能でゲームのjsFiddleを作りました。フィドルのコードは非常に醜いです。地図をスクロールすると、爆弾を配置する方法がわかります。

とにかく、私がやりたいのは、爆弾に関する一般的な情報が含まれているオブジェクトです。

function Bomb(){
  this.radius = player.bombRadius;
  this.placeBomb = function (){
    if(player.bombs != 0){
      // place bomb
    }
  }
  this.explosion = function (){
  // Explosion
  }
}

それをコードに組み込む方法は本当にわかりません。爆弾を置くたびにvar bomb = new Bomb();できるようにするために、スクリプトに常に必要がありますか。

爆弾はどのようにダメージを与えますか?半径がなくなるか、オブジェクトがそれを止めるまで、すべての方向にX、Yを行うのと同じくらい簡単ですか?タイマーとしてsetTimeout(bomb.explosion、3000)などを使用できますか?

理論の簡単な説明やフィドルに基づくコード例であっても、どんな助けでもありがたいです。私がオブジェクトの方法を試したとき、それはコードを壊します。

更新:爆弾を配置し、配置した位置に応じて、一定時間後に削除します。しかし、最初の爆弾が爆発する前に爆弾を配置した場合、爆弾は1つしか削除されません(明らかに、最初の爆弾が配置されてからbombXとbombYが変更されているためです)。

今、私はこの問題を修正する方法を知る必要があります、多分爆弾の位置すべてで新しいアレイを作成しますか?これを行う最良の方法は何ですか?

現在のコード:

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        bombX = player.X; bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
}
function explode(){
    alert('BOOM!');
    delete map[bombY][bombX].object;
    player.bombs++;
}

1
jsFiddle + Firebug->ゲームプロトタイピングツール?そのことを考えたことはなかった。私の心をとても気持ちよく吹くための+1!:)
Anko

回答:


6

見た目はそれほど悪くありませんが、タイミングと入力をよりよく制御する必要があります。移動速度はユーザーのマシンのキーストローク繰り返し設定に依存するため、これは正確には最適ではありません。

代わりに、現在押されているキーを追跡する必要があります。これは(擬似コードで)次のように実行できます。

keyisdown=false
keydown event{
    if(!keyisdown){
        //This is the 'real' keydown event, the one that only happens the moment the
        //key is pressed down. You may not need it, but this is how you construct it.
    }
    keyisdown=true
}

keyup event{
    keyisdown=false
}

次に、更新関数でプレーヤーを移動します keyisdownに、プレーヤーが移動した更新の数が少ない場合、プレーヤーが移動できないなど、他のいくつかの条件を適用できます。

更新されたカウンターまたはその他の時間を追跡する方法を維持して、コードが常にそれがどこまで進んだかを正確に把握できるようにします。

Da bomb
個人的にはシンプルに保ちます。実際に使用する必要はありませんthisnew便利なオブジェクトを作成するとJavaScript内の他のすべてのファンシーなもの。

あなたは次のようなことをすることができます:

bombobject = {} //That is all it takes to make an object.
bombobject.blowtime = currenttime + delay
bombobject.position = mapobject
mapobject.bomb = bombobject

次に、更新のたびにマップを循環させ、爆弾があるかどうか、爆破する時間かどうかを確認します。爆弾オブジェクトを爆破して削除します。

バグ追跡
コードはエラーを漏らしていますが、それらは非常に単純ですが、それらについて学習して対処しないと、後で問題が発生します。最近のすべてのブラウザーには、Firebugクローン開発者コンソールがあります。それを開いて、スクリプトコンソールのタブを見て、厄介な赤いテキストをすべて見て、修正します。

編集:計時に関する懸念
記録のために、setIntervalタイミングよりも少し高度なものが必要になる可能性があります。真剣に取り組む場合は、コードをタイムスリップに合わせて調整する必要があります。問題のおおよその説明については、最初のStack Overflowの回答を参照してくださいhttps : //stackoverflow.com/a/2549426/305545

編集:setTimeOutバージョンの修正
異なる爆弾に同じ変数を使用しているため、新しい爆弾が配置されるたびにそれらを上書きします。次のように、クロージャーを使用して爆弾ごとに個別の変数を作成できます。

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        var bombX = player.X;
        var bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
    function explode(){
        alert('BOOM!');
        delete map[bombY][bombX].object;
        player.bombs++;
    }
}

これでbombXbombY変数とexplode関数は、placeBombsによって作成されたクロージャのローカルになります。したがって、それはローカルインスタンスでありexplode、タイムアウトにアタッチされ、ローカル変数を読み取ります。電話するたびplaceBomb新しいクロージャーが作成されます。

私はこれにsetTimeoutを使用しなかったでしょう、更新をカウントし、爆弾が爆破する前に一定数の更新を確実にしたでしょうが、これは大丈夫だと思います。


ええ、フィドルは私のgame.jsと同じコードではなく、コピーペーストしてランダムに詰め込むだけです。実際のコードは、firebugまたはchromes開発者ツールでエラーを発生させません。私はあなたの爆弾を働かせようとします。ありがとう。:)
justanotherhobbyist

本当に、エラーはありませんか?マップから離れようとしても、
aaaaaaaaaaaa 2012

あなたがそれを言ったので、私はそれを手に入れましたが、最初のタイルはコンクリートのフレームなので、それは問題ではありません。:)簡略化されたフィドルマップだけです。
justanotherhobbyist 2012年

ええ、私はsetTimeoutの問題に気づきました、2つの爆弾で正常に動作する爆弾の配列ができました。さらに、それは中央の爆弾を削除しません。さらに、タイミングのようなものを行う必要があると思いますif(timer> = timeplaced)または似たようなもの。私は間違いを犯し、行くときにそれらを整理しなければならないことで多くを学びます:D、数日前、私はピンポンさえ作ることができませんでした。
justanotherhobbyist 2012年

どういたしまして。そして、あなたが学んでいることを聞くのは素晴らしいことです、そして時々人々の直接の問題を解決することが本当にどこへでも導くであろうと信じることが難しい場合があります。
aaaaaaaaaaaa 2012

0

あなたはかなり素敵な日除けを手に入れたようですが、爆発のための便利なコードを追加したかっただけです。

            for (int i = 0; i < actor.blasradius; ++i)
        {
            tiles[actor.tileX - i][actor.tileY].explode(); //left
            tiles[actor.tileX + i][actor.tileY].explode(); //right
            tiles[actor.tileX][actor.tileY -i].explode(); //up
            tiles[actor.tileX][actor.tileY + i].explode(); //down
        }

ええ、私は似たようなものを手に入れましたが、クレート、コンクリートなどの条件で破壊したり、それに応じて停止したりしました。コードはここで読むことができます:gamedev.stackexchange.com/questions/26065/...
justanotherhobbyist
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.