黒の時代

弾幕風ph3初心者による弾幕風講座。まだ難しいことは出来ませんが、質問要望あればコメントにどうぞ。

no.2 とりあえず

テンプレートを作ります。話はそれから。
単発スペルカード。
スクリプトは全て[script]フォルダ内に置きます。ph3以降は自機スクリプトも。
とりあえず、フォルダを[script]内に作って、[script>ExRumia>ExRumia.png]をコピー。敵画像はとりあえずルーミアにしておきます。*1

引用部分を全部コピペすれば、敵が突っ立ってるスペルカードが出来ます。

#東方弾幕風[Single]
#ScriptVersion[3]
#Title["ほにゃらら"] 
#Text["説明ー。"]

#include"script/default_system/Default_ShotConst.txt"  

単発スクリプト、バージョンの宣言、スペカ名、説明書き。
#include〜はデフォルト弾画像の読み込み。放置。

let imgExRumia = GetCurrentScriptDirectory~"ExRumia.png"; 

let objPlayer = GetPlayerObjectID();
let objEnemy;
let frame = 0;
let ex; let ey; let cx = GetStgFrameWidth() / 2;
let right = GetStgFrameWidth;
let bottom = GetStgFrameHeight;

let は変数の宣言。変数ってのは、数字(とか)と名前を関連づけたものです。

wikipedia変数(プログラミング)」より引用:「プログラミングにおいて、変数(へんすう、variable)とは、プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。」

説明しやすいframeを例にとると、
frameは0が代入されていますね。この後、スクリプト実行中、毎フレームごとに値を1増やしていくことにします。そうすることで、frameに代入された値を使えば、今、このスペルカードが始まってから何フレーム目かいつでもわかるようになります。
そうやって、何らか意味のある値が代入されてるのが変数ってやつです。中学高校でならう変数とは、ちょっと意味合いが違いますね。
最も弾幕風ではオブジェクト、文字、文字列、真偽値、その他諸々何でもletで宣言します。くわしくは→ここ。てかその章に大体すべてがあります。

@Event {  
   alternative(GetEventType())
   case(EV_REQUEST_LIFE) { SetScriptResult(3000); }
}

何か起きる時の為の@Event。よくわかんないから放置。ここでボスライフが設定されてる。

@Initialize {
   objEnemy = ObjEnemy_Create(OBJ_ENEMY_BOSS);
   ObjEnemy_Regist(objEnemy);  
   ObjPrim_SetTexture(objEnemy, imgExRumia); 
   ObjSprite2D_SetSourceRect(objEnemy, 64, 1, 127, 64); 
   ObjSprite2D_SetDestCenter(objEnemy); 

   ObjMove_SetDestAtFrame(objEnemy, cx, 130, 60);
   ObjEnemy_SetLife(OBJ_ENEMY_BOSS,3000);
}

最初の1フレームだけに行われる動作。敵画像の設定とか、最初にどこに動くかとか設定されてる。ここでも敵の体力が設定されてる理由は後々。

@MainLoop {
   ex = ObjMove_GetX(objEnemy);
   ey = ObjMove_GetY(objEnemy); 
   ObjEnemy_SetIntersectionCircleToShot(objEnemy, ex, ey, 32);
   ObjEnemy_SetIntersectionCircleToPlayer(objEnemy, ex, ey, 24);
   frame++;
   yield;
   if(ObjEnemy_GetInfo(objEnemy, INFO_LIFE) <= 0) { Obj_Delete(objEnemy); CloseScript(GetOwnScriptID()); return; }
 }

このMainLoopが毎フレームごとに実行される所。ex = Obj〜はボスの座標を変数exに代入してる。別にexを使わずに毎回ObjMove_GetX(objEnemy)を使えばいいんだけど、長いから見辛いし打つのが面倒なので、exを代わりに使います。

@Finalize {  }

最後のフレームに実行するヤツ。撃破時に点数をあげるとかそういうの。

 

保存は.txtです。.dnhにしてテキストエディタと関連づけるのも好し。
.dnhってのは弾幕風専用の拡張子。中身はテキストファイルだから、見た目だけです。

 

さて次は@MainLoopを弄って実際に弾を発射させていきます。

*1:別にコピーしたから敵画像が表示されるのではないです。使うモノはまとめておく、と言う意味ですのん。

>>目次:no.0