とりあえずなんか書いとけ

Python3系とかアイワナ(GM8.1 Standard)とか読書とか

アイワナ:継承のすゝめ

イワナでボスとか作る時に継承という機能を使うと便利ですよって話です.
たぶん使ったことがある機能だとは思いますが,使い方によってはもっと便利だよっていう記事になります.

継承とは?

親オブジェクトの動作などを子オブジェクトに引き継ぐことができる機能です.
継承をするとどうなるかというと,

  1. 上書きされていないイベント(Create, Step, etc...)が子オブジェクトにも適用される
  2. 他のオブジェクト中のCollision[親オブジェクト]イベントが,子オブジェクトに接触したときにも動作する

ということが起こります.
ということで,ここからはこの2つの動作について詳しく説明します.

オブジェクト編集画面のParentってとこから継承をすることができます.

f:id:toki_0177:20191215111401p:plain
How to 継承

イベントの継承

簡単な例で説明します.
object_pを作成し,Createイベントに以下のようなコードを書き込んだとします.

//object_p create event
image_speed = 0

次に,object_pを継承したobject_cを作成します.
『object_pを継承する』というのは,Parentがobject_pになっている状態です.
このとき,object_cのCreateイベントは親から継承したものとなっているため,image_speed = 0が適用された状態となっています.

ではここで,イベントの上書きをしたらどうなるでしょう?
object_cのCreateイベントに以下のようなコードを書き込んだとします.

//object_c create event
depth = 10

この状態では,親オブジェクトのCreateイベントは上書きされ,depth = 10という部分のみが動作する状態となります.

では,「object_cのCreateイベントだけではなくobject_pのCreateイベントも実行したい」というときはどうすればいいでしょうか?
これは,event_inherited()という命令によって実現できます.
この命令は,親オブジェクトの同じイベントを実行するというものなので,object_cのCreateイベントを以下のようにすることで両方のCreateイベントが実行されることになります.

//object_c create event
event_inherited()
depth = 10

Collisionイベントの動作

これは,実際のオブジェクトを使って説明します.
某エンジンのPlayerオブジェクトの中を見てみると,Collision[playerKiller]イベントがあります.

f:id:toki_0177:20191215115752p:plain
某エンジンのPlayerオブジェクト
このCollisionイベントの中身は以下のようになっています.

//collision playerKiller event
killPlayer()

playerKillerオブジェクトに接触したときにプレイヤーが死ぬという簡単なコードです.
しかし,アイワナを作成するときにステージ上にplayerKillerオブジェクトを配置することはありません.
ではなぜ針やリンゴに接触したら死ぬのか?
これは針やリンゴのオブジェクトがplayerKillerを継承しているからです.

f:id:toki_0177:20191215120451p:plain
針のオブジェクトの中身
つまり,触れたら死ぬオブジェクトを作成したいときにいちいちPlayerのCollisionイベントに追加する必要はなく,playerKillerを継承すればいいだけになります.
イメージとしてはplayerKillerを継承しているspikeDownは,spikeDownであると同時にplayerKillerである,みたいな感じです.

継承を使うと何ができるの?

ここまでの話を聞いててもそんなの知ってるし今更いらんわっていう意見あると思いますが,もうちょっと工夫するともっと便利になります.
え?これも知ってるって?すいません...

実際に使ってみる

「複数体のボスを作る」という場面を考えます.
このとき,どのボスにも弾が当たったときに

  • HPを減らす
  • 効果音を鳴らす
  • ヒットエフェクトを出す
  • 無敵時間を発生させる
  • 当たった弾を消す

などの共通する処理を書くことになると思います.
ボスを作るたびにこれらの処理全てを書いてもいいのですが,さすがにめんどくさいし無駄じゃないですか?
そこで,ボスの基本形となるオブジェクトを作り,それを継承することでボスの作成が少し簡単になります.

ボスの基本形を作る

ボスの基本形となるオブジェクトboss(playerKillerを継承)を作成し,必要な処理を書いていきます.
ちなみに,playerKillerを継承しているbossを継承すると,playerKillerも継承された状態になります.
bossのCollision[bullet]イベントと,無敵時間を解除するためのalarm[11]はこんな感じ.

//collision bullet event
if(image_blend != c_gray){
    hp -= 1
    image_blend = c_gray
    alarm[11] = 60
}
sound_play(sndBossHit)
with(other){
    repeat(3) instance_create(x, y, hit_effect)
    instance_destroy()
}
// alarm[11] event
image_blend = -1

だいたいさっきボスに必要だといった処理を書いてますが,ちょっと変な処理としてはimage_blendを使っているところです.
以下の記事でも書いていますが,image_blendを使うと簡単に色をちょっとだけ変えることができます.
toki0177.hatenablog.com
ここでは無敵時間中にちょっと見た目が暗くなるようにしています.

そしてここで作ったbossオブジェクトを継承して実際のボスを作成することで,弾が当たったときの処理とかをいちいち書く必要がなくなるわけです.
HPバーを表示するとかも全部のボスに共通する処理だと思うので,親オブジェクトに書いておくと楽ですね.

まとめ

継承って機能を使うと,いろいろ楽になるし便利なのでどんどん使いましょうって話でした.
ここではボスの作成のみについて話しましたが,道中にザコ敵を出すみたいな,似たようなオブジェクトを複数作る予定があるなら積極的に使っていきましょう.
あとimage_blendも便利だよ.