ここでは、「game01」というディレクトリ内で作業しているという前提で説明しています。
敵を出す
敵を出して、ゲームとして見栄えが良くなるようにします。
まず、敵キャラのクラスファイルを生成します。
ゲームディレクトリ(game01直下)で、
$ enforce derive enemy01
と実行し、「src」ディレクトリに「enemy01.coffee」が生成されているのを確認してください。
監視スクリプトが実行されている場合は、生成と同時に自動的にコンパイルされます。
監視スクリプトは、ゲームディレクトリ(game01直下)で、
$ enforce build -w
です。
次に、「enemy01.coffee」を開き「behavior」メソッドを下記のように修正します。
behavior:->
super()
switch @_processnumber
when 0
@xs = 4
@nextjob()
when 1
if (@x > SCREEN_WIDTH)
@x = SCREEN_WIDTH
@xs *= -1
else if (@x < 0)
@x = 0
@xs *= -1
上から説明して行きます。
「when 0」で敵キャラの最初の移動量を設定しています。
「@xs = 4」なので、右へ4づつ移動しろと設定し「@_processnumber」をインクリメント(@nextjob())しています。
「when 1」がメインループになります。
画面の右端か左端に達したらx座標の移動量をプラスマイナス逆にするという処理をし続けます。
次に、下記のインスタンスメソッドを追記してください。
burn:->
enemyObj = addObject
motionObj: enemy01
type: SPRITE
x: rand(SCREEN_WIDTH)
y: rand(SCREEN_HEIGHT / 2)
image: 'bear'
width: 32
height: 32
animlist: [
[50, [0, 1, 0, 2]]
]
GLOBAL['enemy'] = enemyObj
removeObject(@)
これは後で「bullet.coffee」に追記する処理から呼ばれます。
新しい敵キャラを生成し、敵キャラとして設定し、自分を削除します。
ここで重要な配列変数(オブジェクト)が出てきます。
「GLOBAL」です。
これはこのシステムが持つ唯一のユーザーグローバル変数です。
この配列にはすべてのクラスファイルからアクセスすることが出来るので、オブジェクトで共通に参照する必要のあるデータを格納します。
ここで、敵を「bullet.coffee」内から参照出来るように「GLOBAL」に設定します。
次に、「enforceMain.coffee」に下記のソースを追記してください。
enemyObj = addObject
motionObj: enemy01
type: SPRITE
x: rand(SCREEN_WIDTH)
y: rand(SCREEN_HEIGHT / 2)
image: 'bear'
width: 32
height: 32
animlist: [
[50, [0, 1, 0, 2]]
]
GLOBAL['enemy'] = enemyObj
ゲーム起動時に敵キャラを生成します。
ここでも、「GLOBAL」に敵キャラを設定しています。
動作を定義するクラスとして「enemy01」を指定しています。
最後に、「bullet.coffee」の「behavior」を下記のように修正します。
behavior:->
super()
switch @_processnumber
when 0
if (@y < 0)
removeObject(@)
# 以下追記分
enemy = GLOBAL['enemy']
if (@isIntersect(enemy))
enemy.burn()
removeObject(@)
追記された部分で、敵キャラのオブジェクトを取り出し、「@isIntersect(オブジェクト)」で指定したスプライトとの当たり判定を取っています。
もし、敵キャラと当たっていたら、その敵キャラオブジェクトの「burn」メソッドを呼び、自分自信を削除しています。
すべての作業・修正が終わりましたら、保存してコンパイルしブラウザをリロードしてください。
敵キャラが左右に動き、弾に当たったら消えて新たな敵キャラが出てくれば正解です。
チュートリアル(6) <--- ⬛︎ ---> チュートリアル(8)