第15回:豊作「穀物神の約束」 2
赤米粒弾の発射
今回は赤米粒弾を発射する処理を実装してみましょう。
この処理はマイクロスレッドを使って分けて作ります。
本家だと、
「高速で発射されてその後弾速が落ちて普通のスピードになる」
「後に発射される弾ほど敵から離れて撃たれる」
「発射位置は時計回りに発射されるものと反時計回りに発射されるものが同時に撃たれる」
「米粒弾は2種類(明&暗)ある」
こうなっていますが、まずは2f間隔で60回発射する部分を作ってみましょう。
task Tshot01(i)
{
loop(60)
{
CreateShot01(GetX, GetY, rand(1, 2), rand(0, 360), RED12, 10);
CreateShot01(GetX, GetY, rand(1, 2), rand(0, 360), RED11, 10);
wait(2);
}
}
これで2f間隔で60回発射する処理は出来ました。
仮引数の[i]は、時計回りにするか反時計回りにするか設定するのに使用します。
次は、「後に発射される弾ほど敵から離れて撃たれる」処理を実装します。
task Tshot01(i)
{
let x;//発射X座標
let y;//発射Y座標
let radius = 0;//敵からどれだけ離れて撃たれるか指定するのに使用
let angle = rand(0, 360);//敵から見てどの向きから撃つかの指定するのに使用
loop(60)
{
x = GetX + offsetX(radius, angle);
y = GetY + offsetY(radius, angle);
CreateShot01(x, y, rand(1, 2), rand(0, 360), RED12, 10);
CreateShot01(x, y, rand(1, 2), rand(0, 360), RED11, 10);
angle+=24*i;
radius++;
wait(2);
}
}
これで、弾の発射速度以外の部分は出来ました。
次は弾の速度ですが、CreateShot01では作ることは出来ません。
なので、違う関数を使って実装しましょう。
使う関数は[CreateShot02]です。
CreateShot02(x, y, speed, angle, a, speed2, color, delay)
x,y:発射座標
speed:弾速(初速)
angle:発射角
a:加速度
speed2:最高(最低)速度
color:弾の種類
delay:発射遅延時間
CreateShot01と比べると引数が二つ増えています。
増えた引数はそれぞれ、弾の加速度と最高(最低)速度を指定するものです。
これをCreateShot01と置き換えたものが下のものになります。
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);
}
}
これを前回作ったものに組み込んでみましょう。
#東方弾幕風
#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);
y = GetY + offsetY(radius, angle);
CreateObjectLaser(x, y, 0, rand(0, 360), YELLOW01, 464, 8);
}
wait(60);
Tshot01(1);
Tshot01(-1);
wait(180);
}
}
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 wait(w){loop(w){yield}}
function offsetX(radius,angle)
{
return radius*cos(angle);
}
function offsetY(radius,angle)
{
return radius*sin(angle);
}
}
これで赤米粒弾が発射されるようになります。
次回は赤レーザーを発射させてみましょう。