Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル(7)敵を出す

More than 5 years have passed since last update.

ここでは、「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)


enforceチュートリアル一覧

digitarhythm
いろいろ作っています。 フルスタックフレームワーク「ViewllerJS」 https://www.digitarhythm.net/viewllerjs ブラウザでWebゲーム開発「enforceIDE」 https://www.prominence.tv/enforceIDE WebブラウザでProcessing「InstaProc」 https://processing.fun/
http://www.digitarhythm.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away