ソースコードの記述
シーンパネルからgame画面の[シーンプロパティ]ダイアログを開き、[アクション]タブの「Enter Scene」の動作を「カスタム」に設定して次のスクリプトコードを記述します。
1: //Init Variables And Objects;
2: var sW:Number = Stage.width;
3: var sH:Number = Stage.height;
4: var eNum:Number = 0;
5: var MaxEnemySpeed:Number = 12;
6: var MinEnemySpeed:Number = 5;
7: var movePix:Number = 5;//Fighter'Speed
8: var interVal:Number = 150;
9: var bcObj:Object = new Object();
10: var hitCheck:Boolean = false;
11: var score:Number = 0;
12: //Initiarize Game
13: AsBroadcaster.initialize(bcObj);
14: exp._alpha = 0;
15: exp._xscale = exp._yscale = 0;
16: var intID:Number = setInterval(this, "xCreateEnemy", interVal);
17: xShowScore();
18: //Set Event Handler
19: fig.onEnterFrame = function():Void{
20: if (Key.isDown(Key.RIGHT)) {
21: this._x += movePix;
22: }else if (Key.isDown(Key.LEFT)) {
23: this._x -= movePix;
24: }
25: score++;
26: xShowScore();
27: };
28: this.onEnterFrame = function():Void{
29: bcObj.broadcastMessage("xFall");
30: if (!hitCheck){
31: bcObj.broadcastMessage("xHitTest");
32: if (hitCheck){
33: xExplode();
34: }
35: }
36: };
37: //Define Functions
38: function xCreateEnemy():Void{
39: eNum++;
40: var newEnemy:MovieClip = enemy.duplicateMovieClip("e" + eNum, eNum);
41: newEnemy._x = Math.random() * sW;
42: bcObj.addListener(newEnemy);
43: var sp:Number = Math.random() * (MaxEnemySpeed - MinEnemySpeed + 1);
44: newEnemy.speed = Math.floor(sp) + MinEnemySpeed;
45: newEnemy.xTest = function():Void{
46: trace(this._name);
47: };
48: newEnemy.xFall = function():Void{
49: this._y += this.speed;
50: if (this._y > sH + 40){
51: ewEnemy.xRemove();
52: }
53: };
54: newEnemy.xHitTest = function():Void{
55: if (this.hitTest(fig)){
56: hitCheck = true;
57: }
58: };
59: newEnemy.xRemove = function():Void{
60: bcObj.removeListener(this);
61: this.removeMovieClip();
62: };
63: }
64: function xShowScore():Void{
65: txtScore = String(score);
66: }
67: function xGameOver():Void{
68: clearInterval(intID);
69: bcObj.broadcastMessage("xRemove");
70: nextScene();
71: }
72: function xExplode():Void{
73: delete fig.onEnterFrame;
74: exp._x = fig._x;
75: exp._y = fig._y;
76: exp.onEnterFrame = function(){
77: this._alpha += 20;
78: this._xscale = this._yscale += 20;
79: if (this._alpha >= 100){
80: this.cnt = 0;
81: this.onEnterFrame = function(){
82: fig._visible = false;
83: _xExplode1();
84: };
85: }
86: };
87: }
88: function _xExplode1():Void{
89: exp.cnt++;
90: if (exp.cnt >= 5){
91: exp.onEnterFrame = function(){
92: _xExplode2();
93: };
94: }
95: }
96: function _xExplode2():Void{
97: exp._alpha -= 20;
98: exp._xscale = exp._yscale -= 10;
99: if (exp._alpha <= 0){
100: exp.onEnterFrame = function(){
101: delete this.onEnterFrame;
102: xGameOver();
103: };
104: }
105: }
以下、簡単なコードの解説です。
2~11行目:変数の宣言やオブジェクトの生成を行っています。
13~17行目:ゲームの初期化処理です。複数の障害物を扱うためにAsBroadcasterクラスを使っています。インターバル処理で実行しているxCreateEnemy()は障害物を発生させる関数です。
19~36行目:イベント処理の設定です。ここでは自機の移動用にfigのonEnterFrameイベントハンドラメソッドを、障害物の移動と接触判定にメインタイムラインのonEnterFrameイベントハンドラメソッドを使っています。38行目以降は関数の定義です。完成ファイルは「game2.gla」です。
すでに述べた通り、Web Effectでは入れ子構造のムービークリップを作成・編集できません。そのためある程度複雑なコンテンツを作ろうと思うと、その分プログラミングでフォローすることになります。これは本来のWeb Effectの使い方を越えたものなので、Web Effectを責めるのは酷でしょう。本来想定された範囲のコンテンツ制作を行っている分には非常にコストパフォーマンスが高く、それを越えた範囲でも対応する余地があると考えるのが適切です。