【アイワナ製作メモ】マ○オ風の隠しブロックを作る | スーベニあいわな製作所

スーベニあいわな製作所

アイワナ作ってます

アイワナ製作用のエンジンには恐らくどのエンジンにも
「普段は透明だけど触れると見えるようになるブロック」
がデフォルトで搭載されていると思います。

そのブロックは存在しないわけではなく透明になっているだけで、また上下左右どの方向から触れても見えるようになります。

しかし、そうではなくマ○オブラザーズに登場するような
「下から触れたときにのみ現れ、それまでは存在していないブロック」
の作り方を紹介します。

隠しブロックの作り方

まずはスプライトを用意します。デザインはご自由にどうぞ。


次にオブジェクトを作るのですが、1つのオブジェクトで隠しブロックを再現するのは難しいというかおそらく不可能なので
隠しブロックのオブジェクト隠しブロックを作るオブジェクトの2つのオブジェクトを使います。

まずは隠しブロックのオブジェクトkakushiblockとします)を作ります。
下の写真のように設定してください。


隠しブロックとは言っても出現した後はただのブロックなのでイベントを設定する必要はありません。

次に隠しブロックを作るオブジェクト(kakushiblockmakerとします)を作ります。
スプライトは隠しブロックのオブジェクトと同じもの、もしくは同じ判定のものにしてください。
またvisibleとsolidにはチェックをつけず、parentには何も設定しないでください。

playerとのcollisionイベントに以下のコードを入力。

flag = 1;

stepイベントに以下を入力。

if(player.vspeed < 0){
      if(place_meeting(x,y-player.vspeed,player)){
            if(flag = 0){
               instance_create(x,y,kakushiblock);
               instance_destroy();
            }
      }
}

if(flag > 0){
   flag = 0;
}

あとは
kakushiblockmakerをルーム内に置くだけで完成です。

仕組みの解説

最初に隠しブロックの仕様について下の図を見ながら整理します。


①ブロックより下側から上に向かって触れたときに出現する。
②下以外の方向から触れたときには出現しない。
③ブロックに触れた状態から上に向かって移動しても出現しない。
この3つを表現するために
kakushiblockmakerに入力するコードについて解説します。

まずstepイベントに入力したコードについて。
if(player.vspeed < 0){
   //playerの速度が上向きかを判定
if(place_meeting(x,y-player.vspeed,player)){
   //playerがブロックの下にぶつかったかを判定
これは①と②を表現するためのコードです。

次に③を表現するためのコードです。
collisionイベントに入力した
   flag = 1;
stepイベントに入力した
   
if(flag > 0){
      flag = 0;
   }
これによりplayerが
kakushiblockmakerに触れているときは変数flagを1に、触れていないときは0になります。
そして以下のように入力することでflagが0のときにだけ、つまりplayerが触れていないときにだけブロックが出現するようになります。
      if(flag = 0){
         instance_create(x,y,kakushiblock); //オブジェクトkakushiblockを生成


以上が隠しブロックの作り方と解説です。