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