#東方弾幕風
#Title[SampleC04]
#Text[SampleC04:レーザーに当たった弾の軌道を変える]
#Image[]
#BackGround[User]
#ScriptVersion[2]
script_enemy_main
{
let count= -90 ;//弾を出す間隔を制御するための変数
let cx=GetCenterX();//変数cxに中心x座標を代入
let cy=GetCenterY();//変数cxに中心y座標を代入
let imgExRumia=GetCurrentScriptDirectory~"img\ExRumia.png";
let arrayLaser=[];//LaserObjectのオブジェクトを保存しておく
@Initialize()
{
SetLife(1000);//敵のライフを1000に設定
SetGraphicRect(64,1,127,64);//描画元の矩形を(64,1)-(127,64)に設定
LoadGraphic(imgExRumia);//画像「img\ExRumia.png」を読みこむ
SetMovePosition02(cx,cy,60);//座標(cx,60)に60フレームで移動
}
@MainLoop()
{
if(count>0 && count%10 == 0)
{//30フレーム毎に弾をばらまく
let angle = 0;
while(angle<360)
{
ShotObject(GetX(), GetY(), 3, angle+count*5, AQUA21, 5);
angle+=10;
}
}
if(count == 60)
{//弾の軌道を変えるレーザー作成
LaserObject(0,RED01);
LaserObject(1,BLUE01);
LaserObject(2,GREEN01);
}
if(count == 360)
{//レーザー削除
let i=0;
loop(length(arrayLaser))
{
ObjShot_FadeDelete(arrayLaser[i]);
i++;
}
count=0;//カウンタを0にする
}
SetCollisionA(GetX(),GetY(),32);//敵の座標に当たり判定を登録
SetCollisionB(GetX(),GetY(),24);//敵の座標に当たり判定(体当たり用)を登録
count++;//1フレーム毎にcountが1増加
yield;//毎フレームタスク復帰
}
@DrawLoop()
{
SetTexture(imgExRumia);
DrawGraphic(GetX(),GetY());//敵の座標にExルーミアを描画;
}
@Finalize()
{
DeleteGraphic(imgExRumia);
}
task LaserObject(let num, let grf)
{//弾の軌道を変えるレーザー
//numは0-2のセットで敵を中心に三角形にレーザーを出現させる
//レーザータスク初期化
let r=120;
let angle=210+120*num;
let obj = Obj_Create(OBJ_LASER);
arrayLaser = arrayLaser~[obj];//オブジェクトをarrayLaserに登録
Obj_SetX(obj, GetX() + r*cos(angle-150));
Obj_SetY(obj, GetY() + r*sin(angle-150));
Obj_SetAngle(obj, angle);
ObjShot_SetGraphic(obj, grf);
ObjShot_SetDelay(obj, 120);//遅延時間:120フレーム
ObjLaser_SetLength(obj, (3^0.5)*r);//円に内接する正三角形の辺の長さ:√3*r
ObjLaser_SetWidth(obj, 12);//レーザーの幅:12
while( !Obj_BeDeleted(obj) )
{
angle+=1;//レーザーを回転
Obj_SetX(obj, GetX() + r*cos(angle-150));
Obj_SetY(obj, GetY() + r*sin(angle-150));
Obj_SetAngle(obj, angle);
yield;
}
let i=0;
loop(length(arrayLaser))
{//オブジェクトを削除
if(arrayLaser[i] == obj)
{//配列arrayLaserからi番目の要素を削除
arrayLaser = erase(arrayLaser, i);
break;
}
i++;
}
}
task ShotObject(let x, let y, let speed, let angle, let grf, let delay)
{//レーザーに当たったら軌道を変える弾
//弾タスク初期化
let obj = Obj_Create(OBJ_SHOT);
Obj_SetX(obj, x);
Obj_SetY(obj, y);
Obj_SetSpeed(obj, speed);
Obj_SetAngle(obj, angle);
ObjShot_SetGraphic(obj, grf);
ObjShot_SetDelay(obj, delay);
while( !Obj_BeDeleted(obj) )
{//削除されるまでループを実行
let i=0;
loop(length(arrayLaser))
{//レーザーとの当り判定を調査
if(Collision_Obj_Obj(arrayLaser[i], obj))
{//Laserと接触したら
//連続で判定されないよう普通の弾と入れ替える
//角度も変えておく
//数フレーム触れないようにカウンタで管理してもよいかも
x = Obj_GetX(obj);
y = Obj_GetY(obj);
CreateShot01(x, y, 3, Obj_GetAngle(arrayLaser[i])+90, grf, 0);
Obj_Delete(obj);
break;
}
i++;
}
yield;
}
}
}