第16回:豊作「穀物神の約束」 3
赤レーザーの発射
今回は赤レーザーを発射する処理を実装しましょう。
レーザーを発射する処理は単純なのでかるーく説明することにします。
レーザーを発射するには、[CreateLaser01]を使います。
CreateShot01にレーザーの長さと太さを設定する引数が増えたものです。
とりあえず発射する関数を作ってみましょう。
function Tlaser01
{
let angle = rand(0, 360);
loop(48)
{
CreateLaser01(GetX, GetY, 2, angle, 150, 8, RED01, 10);
angle+=360/48;
}
}
150がレーザーの長さ、
8がレーザーの太さです。
これを組み込んでみましょう。
{
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);
y = GetY + offsetY(radius, angle);
CreateObjectLaser(x, y, 0, rand(0, 360), YELLOW01, 464, 8);
}
wait(60);
Tshot01(1);
Tshot01(-1);
wait(60);
Tlaser01;
wait(60);
wait(60);
}
}
〜略〜
function Tlaser01
{
let angle = rand(0, 360);
loop(48)
{
CreateLaser01(GetX, GetY, 2, angle, 150, 8, RED01, 10);
angle+=360/48;
}
}
敵を動かす
これでほぼ完成ですが、もっと本家に似せるために敵を動かす処理を追加してみましょう。
弾幕風wikiで公開されている、「位置指定型の減速する移動」を応用して作ります。
といっても、「とりあえずこうしておけば動く」程度の認識でいいと思います。
task Move01(BossY, time1, time2)
{
let frame = 0;
SmoothMove(
GetX+(Qif(Qif(1,-1,GetX<326),Qif(-1,1,GetX>122),GetX<=GetPlayerX))*rand(50,60),
rand(BossY-40,BossY+40), time1, time2);
task SmoothMove(X,Y,Time,Time2) {
// X x座標
// Y y座標
// Time 等速で移動する時間
// Time2 減速して移動する時間
let Distance = ((Y-GetY)^2+(X-GetX)^2)^0.5;
let Speed = Distance/(Time*2+Time2)*2;
SetAngle(atan2(Y-GetY,X-GetX));
SetSpeed(Speed);
loop(Time) {yield;}
loop(Time2) {
SetSpeed(GetSpeed-(Speed/(Time2*2)));
yield;
SetSpeed(GetSpeed-(Speed/(Time2*2)));
}
SetSpeed(0);
}
function Qif (YesR,NoR,Quest)
{
if (Quest) {return(YesR)}else{return(NoR)}
}
}
これが、「(Time+Time2)フレームかけて自機に寄るようなランダムな位置に敵が移動する処理」となります。
#東方弾幕風
#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;
SetScore((10+1*3)*180000);
SetTimer(45);
CutIn(YOUMU, "豊作「穀物神の約束」", "", 0, 0, 0, 0);
Concentration01(60);
wait(60);
loop
{
loop(64)
{
radius = rand(0, 100);
angle = rand(0, 360);
x = GetX + offsetX(radius, angle);
y = GetY + offsetY(radius, angle);
CreateObjectLaser(x, y, 0, rand(0, 360), YELLOW01, 464, 8);
}
wait(60);
Tshot01(1);
Tshot01(-1);
wait(60);
Tlaser01;
wait(60);
Move01(GetClipMinY+120, 40, 20);
wait(60);
}
}
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);
}
task Tshot01(i)
{
let x;
let y;
let radius = 0;
let angle = rand(0, 360);
loop(60)
{
x = GetX + offsetX(radius, angle);
y = GetY + offsetY(radius, angle);
CreateShot02(x, y, 6, rand(0, 360), -0.2, rand(1, 2), RED12, 10);
CreateShot02(x, y, 6, rand(0, 360), -0.2, rand(1, 2), RED11, 10);
angle+=24*i;
radius++;
wait(2);
}
}
function Tlaser01
{
let angle = rand(0, 360);
loop(48)
{
CreateLaser01(GetX, GetY, 2, angle, 150, 8, RED01, 10);
angle+=360/48;
}
}
task Move01(BossY, time1, time2)
{
let frame = 0;
SmoothMove(
GetX+(Qif(Qif(1,-1,GetX<326),Qif(-1,1,GetX>122),GetX<=GetPlayerX))*rand(50,60),
rand(BossY-40,BossY+40), time1, time2);
task SmoothMove(X,Y,Time,Time2) {
// X x座標
// Y y座標
// Time 等速で移動する時間
// Time2 減速して移動する時間
let Distance = ((Y-GetY)^2+(X-GetX)^2)^0.5;
let Speed = Distance/(Time*2+Time2)*2;
SetAngle(atan2(Y-GetY,X-GetX));
SetSpeed(Speed);
loop(Time) {yield;}
loop(Time2) {
SetSpeed(GetSpeed-(Speed/(Time2*2)));
yield;
SetSpeed(GetSpeed-(Speed/(Time2*2)));
}
SetSpeed(0);
}
function Qif (YesR,NoR,Quest)
{
if (Quest) {return(YesR)}else{return(NoR)}
}
}
function wait(w){loop(w){yield}}
function offsetX(radius,angle)
{
return radius*cos(angle);
}
function offsetY(radius,angle)
{
return radius*sin(angle);
}
}
これで、豊作「穀物神の約束」は完成です。
次回は、召喚「豪族乱舞」を再現してみましょう。