第16回

prev slash top slash next

第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がレーザーの太さです。

これを組み込んでみましょう。

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(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);
 }
}

これで、豊作「穀物神の約束」は完成です。
次回は、召喚「豪族乱舞」を再現してみましょう。


top
prev slash next
inserted by FC2 system