第14回:豊作「穀物神の約束」 1
今回は[豊作「穀物神の約束」(Lunatic)]です。
新しくスクリプトファイルを作ってください。以前用意したテンプレートを使っているものとして話が進みます。
さあ、弾幕の基本情報から見て行きましょう。
基本情報
出典:東方風神録Stage1
使用者:秋穣子
制限時間:45秒
攻撃方法:
1: 64条の設置型黄レーザー(0f目)
2: 赤米粒弾を2f間隔で60回発射(60f目)
3: 48way赤レーザーを発射して移動(120f目)
4: 最初に戻る(240f目)
この攻撃は4秒で1ループします。
本家だと最初の1セットの前に1秒のチャージエフェクトがあるので制限時間内で11回ほどループします。
まずは設置型黄レーザーを実装しましょう。設置型レーザーはオブジェクトレーザーを使います。
オブジェクトレーザー
オブジェクトレーザーは、オブジェクト弾の亜種みたいなもんです。
オブジェクト弾って何ぞやとか言う人は前回の講座を見てくるといいでしょう。
オブジェクト弾と違うところは、長さや太さの設定する項目があるというくらいです。
task CreateObjectLaser(x, y, angle, graphic, delay, length, width) {
let obj = Obj_Create(OBJ_LASER);
Obj_SetPosition(obj, x, y);
Obj_SetSpeed(obj, 0);
Obj_SetAngle(obj, angle);
ObjLaser_SetLength(obj, length);
ObjLaser_SetWidth(obj, width);
ObjLaser_SetSource(obj, true);
ObjShot_SetGraphic(obj, graphic);
ObjShot_SetDelay(obj, delay);
loop(delay){ yield; }
while(!Obj_BeDeleted(obj)) {
yield;
}
}
ObjLaser_SetLength: 長さの設定
ObjLaser_SetWidth: 太さの設定
ObjLaser_SetSource: 発射源のエフェクトを表示するか(true,する/false,しない)
黄レーザーの挙動を設定しましょう。
予告線が60fで伸びてくる→120fの間実体化し続ける→60fかけて細くなり消滅
という流れです。
task CreateObjectLaser(x, y, speed, angle, graphic, length, width) {
let obj = Obj_Create(OBJ_LASER);
Obj_SetPosition(obj, x, y);
Obj_SetSpeed(obj, speed);
Obj_SetAngle(obj, angle);
ObjLaser_SetLength(obj, 0);
ObjLaser_SetWidth(obj, width);
ObjLaser_SetSource(obj, false);
ObjShot_SetGraphic(obj, graphic);
ObjShot_SetDelay(obj, 60);
let length2 = length/50;
length = 0;
loop(50)
{
ObjLaser_SetLength(obj, length);
length+=length2;
yield;
}
wait(10);
wait(120);
Obj_SetCollisionToPlayer(obj, false);
loop(60)
{
ObjLaser_SetWidth(obj, width);
width*=0.80;
yield;
}
Obj_Delete(obj);
}
今回の発射遅延時間(=レーザーが実体化するまでの時間)は60f固定です。
そのうち50fを予告線を伸ばす時間にあてます。
ObjLaser_SetLength(obj, 0);//レーザー設置時点での長さを0に
let length2 = length/50;//長さの変化量を設定
length = 0;
loop(50)
{
ObjLaser_SetLength(obj, length);//レーザーの長さの設定
length+=length2;//レーザーを一定量ずつ伸ばす
yield;//1f待機
}
wait(10);//最後に10f分待機
これで50fの間レーザーを伸ばし、レーザーが伸びきってから10f後に実体化するという処理となります。
その後120fの間実体化し続け、最後に60fかけてレーザーが細くなって消滅します。
次はその部分です。
wait(120);//120fの間待機
Obj_SetCollisionToPlayer(obj, false);//プレイヤーへの当たり判定を無くす
loop(60)
{
ObjLaser_SetWidth(obj, width);//レーザーの太さを設定
width*=0.80;//太さを2割ずつ細くする
yield;//1f待機
}
Obj_Delete(obj);//オブジェクトレーザーを削除
これをスクリプトに組み込んでみましょう。
#東方弾幕風
#Title[豊作「穀物神の約束」]
#Text[]
#ScriptVersion[2]
script_enemy_main{
let imgBoss= "script\img\exrumia.png";
@Initialize{
SetLife(2000);
LoadGraphic(imgBoss);
SetTexture(imgBoss);
SetGraphicRect(0, 0, 63, 63);
Tmain;
}
@MainLoop{
SetCollisionA(GetX, GetY, 24);
SetCollisionB(GetX, GetY, 24);
yield;
}
@DrawLoop{
DrawGraphic(GetX, GetY);
}
@Finalize{
DeleteGraphic(imgBoss);
}
task Tmain
{
SetMovePosition02(GetCenterX, GetClipMinY+120, 60);
wait(60);
let x;
let y;
let angle;
let radius;
loop
{
loop(64)
{
radius = rand(0, 100);//設置する位置までの距離を設定
angle = rand(0, 360);//敵から見てどの向きから撃つかの指定
x = GetX + offsetX(radius, angle);//X座標の指定
y = GetY + offsetY(radius, angle);//Y座標の指定
CreateObjectLaser(x, y, 0, rand(0, 360), YELLOW01, 464, 8);
}
wait(240);//240f待機
}
}
task CreateObjectLaser(x, y, speed, angle, graphic, length, width) {
let obj = Obj_Create(OBJ_LASER);
Obj_SetPosition(obj, x, y);
Obj_SetSpeed(obj, speed);
Obj_SetAngle(obj, angle);
ObjLaser_SetLength(obj, 0);
ObjLaser_SetWidth(obj, width);
ObjLaser_SetSource(obj, false);
ObjShot_SetGraphic(obj, graphic);
ObjShot_SetDelay(obj, 60);
let length2 = length/50;
length = 0;
loop(50)
{
ObjLaser_SetLength(obj, length);
length+=length2;
yield;
}
wait(10);
wait(120);
Obj_SetCollisionToPlayer(obj, false);
loop(60)
{
ObjLaser_SetWidth(obj, width);
width*=0.80;
yield;
}
Obj_Delete(obj);
}
function wait(w){loop(w){yield}}
function offsetX(radius,angle)
{
return radius*cos(angle);
}
function offsetY(radius,angle)
{
return radius*sin(angle);
}
}
これを実行すると4秒ごとにレーザーが設置→消滅を繰り返すようになります。
次回は赤米粒弾を発射する処理を実装しましょう。