1

HTML5 キャンバス スペース インベーダー ゲームに取り組んでおり、Game.ts クラスで、プレイヤー クラスのシュート メソッド (gameObject モジュール ファイル内) からイベントを受け取りたいと考えています。Game.ts には playerBullets という変数があり、これを更新する必要があります。プレイヤーが撃つたびに!

module GameObjects {

    // Class
    export class   Player {
        color: string = "#00A";
        x: number = 50;
        y: number = 270;
        width: number = 20;
        height: number = 30;

        constructor () {
        }
        draw(canvas) {
            canvas.fillStyle = this.color;
            canvas.fillRect(this.x, this.y, this.width, this.height);
        }

        shoot() {
            // Sound.play("shoot");

            var bulletPosition = this.midpoint();

            playerBullets.push(Bullet({
                speed: 5,
                x: bulletPosition.x,
                y: bulletPosition.y
            }));
        };

         midpoint() {
            return {
                x: this.x + this.width / 2,
                y: this.y + this.height / 2
            };
        };

           explode() {
            //  this.active = false;
            // Extra Credit: Add an explosion graphic and then end the game
        };

    };


}

そしてgame.ts:

class game {


constructor () {
}
var playerBullets: Array = new Array[40];
FPS: number = 30;

何か案は?


純粋なjsでこれを行っていた場合、すべてのものをグローバルにしてイベントを必要としないようにするのは簡単ですが、維持するのは難しいでしょう..

4

1 に答える 1

1

別のイベント対応の oo 言語 (c# など) と同じように処理します。プレーヤーでイベント アクションを作成し、Main.ts でそれをサブスクライブします。

たとえば、プレーヤーにメソッド メンバーを追加します。

public OnShoot: Function;

次に、シュート メソッドに次の行を追加します。

if(OnShoot) {
    OnShoot(new Bullet({
            speed: 5,
            x: bulletPosition.x,
            y: bulletPosition.y
        }));
}

次に、Main.ts で、プレーヤーを作成したら、その OnShoot を登録するだけです。例:

var player = new GameObjects.Player();

player.OnShoot = function(bullet: Bullet) {
    playerBullets.push(bullet);
}

お役に立てれば。

注: イベント リスナーを介して「真の」イベント ベースの実装をいつでも行うことができます (JQuery にはこのための優れたセットアップがあります) が、実装にはサブスクライブ可能な関数で十分です。さらに、その方が適切な気がします。

于 2012-12-11T00:40:00.293 に答える