1

我正在开发一个 HTML5 画布空间入侵者游戏,并希望从我的玩家类拍摄方法(在我的 gameObject 模块文件中)接收我的 Game.ts 类中的事件 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 回答