基本2

8 スペルカードの作成 凍符「パーフェクトフリーズ」 *

そろそろ、簡単な弾幕は作れるようになったと思うので、
今回は、スペルカードを作っていきます。

書き方の変更
  スクリプトを毎回全て表示すると長くなるので、
   今回は一部をサブルーチンで書いていきます。

スペルカード宣言 *

スペルカードとは「バーン」と音が鳴って、
名前(とカットイン:今回は画像がないのでなし)が出ます。
そして、一度も弾に当たらなければボーナスが出ます。
今回はこれを作ります。

簡単な流れ
効果音「バーン」 > 名前(とカットイン) > ボーナス



関数サンプル



CutIn(引数7)
1.カットインタイプ( KOUMA か YOUMU ) 2.スペルカード名
3.カットイン画像のパス 4.描画元矩形左 5.描画元矩形上 
6.描画元矩形右 7.描画元矩形下
スペルカード宣言をする

SetTimer(引数1)
1.時間(秒)
制限時間を設定する

SetScore(引数1)
1.得点
スペルカードボーナスを設定する

解説


止まって動き出す弾 *

スペルカード宣言ができたので、ここから凍符「パーフェクトフリーズ」の処理に入っていきます。

凍符「パーフェクトフリーズ」の処理
  1.動きながら、ランダムにカラフルな弾を撃つ
   2.カラフルな弾が白色になり動きが止まる
   3.動きながら、自機狙いの5way線状弾を撃つ
   4.白い弾がいろんな方向に動く
   5.1に戻る

途中で止まったり、動いたりする弾は「CreateShotA」で作ります。

sub Action1{
    SetMovePosition02(GetCenterX+rand(-90,90),
    GetClipMinY+(GetClipMaxY-GetClipMinY)/4+rand(-30,30),180);//移動
    let time=240;//変数timeを作成
    loop(45){
        loop(4){
            let color=[RED04,ORANGE04,YELLOW04,GREEN04,AQUA04,BLUE04,PURPLE04];//配列colorを作成
            CreateShotA(1,GetX+rand(-10,10),GetY+rand(-10,10),15);//特殊な弾を作成
            SetShotDataA(1,0,rand(2,4),rand(0,360),0,0,0,color[rand_int(0,6)]);//はじめの設定
            SetShotDataA(1,time,0,NULL,0,0,0,WHITE04);//timeフレーム後の設定
            SetShotDataA(1,time+120,0,rand(0,360),0,0.05,2,WHITE04);//time+120フレーム後の設定
            FireShot(1);//特殊な弾を発射
        }
        loop(4){
            time--;//timeに1を減算
            yield;//マイクロスレッドを中断
        }
    }
}

CreateShotA(引数4)
1.弾のID 2.弾のX座標 3.弾のY座標 4.遅延時間
やや複雑な動きをする弾を作る

SetShotDataA(引数8)
1.弾のID 2.開始時間 3.速度 4.角度 5.加速角度 6.加速度 7.最大(最低)速度 8.弾の色
「CreateShotA」で作った弾の動きを設定する

FireShot(引数1)
1.弾のID
「CreateShotA」と「SetShotDataA」で設定した弾を撃つ

rand_int(引数2)
1.最小値 2.最大値
最小値~最大値の乱数を整数で取得する

解説

5way線状弾 *

5way線状弾とは、「5wayの線状弾」という意味です。
これは、n_way弾と線状弾が作れるなら簡単に作れます。

sub Action2{
    SetMovePosition02(GetCenterX+rand(-90,90),
    GetClipMinY+(GetClipMaxY-GetClipMinY)/4+rand(-30,30),60);//移動
    loop(6){//5way線状弾を撃つ回数のループ
        let angle=GetAngleToPlayer-60;//変数angleを作成
        loop(5){//5way弾にするループ
            let speed=3;//変数speedを作成
            loop(3){//線状弾にするループ
                CreateShot01(GetX,GetY,speed+rand(-0.1,0.1),angle+rand(-3,3),BLUE01,10);
                speed+=0.5;//speedに0.5を加算
            }
            angle+=30;//angleに30を加算
        }
        loop(10){yield;}//10フレーム休む
    }
}

解説


現在の全体スクリプト


  

関数サンプル

耐性をつける *

スペルカード宣言のときに攻撃すると分かると思いますが、体力がみるみる削られていきます。
これだと、一波目が終らないままスペルカードが取得されてしまいます。
これを防ぐために、攻撃に耐性をつけましょう。

task StartTask{
    SetDamageRate(20,20);
    SetMovePosition02(GetCenterX,GetClipMinY+(GetClipMaxY-GetClipMinY)/4,60);//移動
    loop(90){yield;}
    MainTask;
}
 
task MainTask{
    loop{
        Action1;
        loop(90){yield;}
        Action2;
        loop(90){yield;}
        SetDamageRate(50,50);
    }
}

SetDamageRate(引数2)
1.自弾の耐性(デフォルトは100) 2.ボムの耐性(デフォルトは100)
敵の耐性を設定する

点符を作る *

スペルカード後にアイテム(点符)を出したいと思います。

@Finalize{//後処理
    loop(30){
        CreateItem(ITEM_SCORE,GetX+rand(-60,60),GetY+rand(-60,60));//アイテムを作成
    }
    DeleteGraphic(img);//画像を削除する
}


CreateItem(引数3)
1.アイテムの種類(ITEM_1UP,ITEM_BOMB,ITEM_SCORE) 2.X座標 3.Y座標
アイテムを作る

CreateItem( ITEM_SCORE, GetX+ rand(-60,60), GetY+ rand(-60,60));
で四角形でアイテムを出します。

完成したスクリプト

  

関数サンプル

9 スペルカードの作成 QED「495年の波紋」 *

QED「495年の波紋」は画面端(下以外)で反射する弾を全方位に撃つスペルカードです。
下のスクリプトをベースに作っていきます。


  

関数サンプル

画面端で反射する弾 *

画面端で反射する弾はCreateShot系の関数では作ることができません。
これは、オブジェクト弾を使えば作ることができます。

//task ObjShot以外省略
    task ObjShot{
        let obj = Obj_Create(OBJ_SHOT);//オブジェクト弾の作成
    }


Obj_Create(引数1)
1.オブジェクトの種類(OBJ_SHOT、OBJ_LASERなど)
オブジェクトを作る

Obj_Createだけでは動作しないので、 CreateShot01と同じデータを設定します。
CreateShot01の引数は、X座標、Y座標、速度、角度、弾の色、遅延時間でした。
これを一気に作っていきます。

    
//task ObjShot以外省略
    task ObjShot(x,y,speed,angle,color,delay){
        let obj = Obj_Create(OBJ_SHOT);//オブジェクト弾の作成
        Obj_SetPosition(obj,x,y);//オブジェクト弾の初期位置
        Obj_SetSpeed(obj,speed);//オブジェクト弾の初期速度
        Obj_SetAngle(obj,angle);//オブジェクト弾の初期角度
        ObjShot_SetGraphic(obj,color);//オブジェクト弾の色
        ObjShot_SetDelay(obj,delay);//オブジェクト弾の遅延時間
 
        loop(delay){yield;}//遅延時間フレームだけ休む
 
        while(!Obj_BeDeleted(obj)){//弾の動き
            yield;
        }
    }


Obj_SetX(引数2)
1.操作するオブジェクト 2.X座標
オブジェクトのX座標を設定する

Obj_SetY(引数2)
1.操作するオブジェクト 2.Y座標
オブジェクトのY座標を設定する

Obj_SetPosition(引数3)
1.操作するオブジェクト 2.X座標 3.Y座標
オブジェクトのX座標とY座標を設定する

Obj_SetSpeed(引数2)
1.操作するオブジェクト 2.速度
オブジェクトの移動速度を設定する

Obj_SetAngle(引数2)
1.操作するオブジェクト 2.角度
オブジェクトの角度を設定する

ObjShot_SetGraphic(引数2)
1.操作するオブジェクト 2.弾の色
オブジェクト弾(レーザー)の色を設定する

ObjShot_SetDelay(引数2)
1.操作するオブジェクト 2.遅延時間
オブジェクト弾(レーザー)の遅延時間を設定する

Obj_BeDeleted(引数1)
1.オブジェクト
オブジェクトが削除済みか調べる



「loop」と「while」の違い


上の状態であれば、CreateShot01同様に弾を撃つことができます。
この弾を画面端(下以外)で反射させてみましょう。

        
//task ObjShot以外省略
    task ObjShot(x,y,speed,angle,color,delay,count){
        let obj = Obj_Create(OBJ_SHOT);//オブジェクト弾の作成
        Obj_SetPosition(obj,x,y);//オブジェクト弾の初期位置
        Obj_SetSpeed(obj,speed);//オブジェクト弾の初期速度
        Obj_SetAngle(obj,angle);//オブジェクト弾の初期角度
        ObjShot_SetGraphic(obj,color);//オブジェクト弾の色
        ObjShot_SetDelay(obj,delay);//オブジェクト弾の遅延時間
 
        loop(delay){yield;}//遅延時間フレームだけ休む
 
        while(!Obj_BeDeleted(obj)&&count>0){//弾の動き
            //左端
            if(Obj_GetX(obj)<GetClipMinX){
                Obj_SetX(obj,GetClipMinX*2-Obj_GetX(obj));
                Obj_SetAngle(obj,180-Obj_GetAngle(obj));
                count--;
            }
            //右端
            if(Obj_GetX(obj)>GetClipMaxX){
                Obj_SetX(obj,GetClipMaxX*2-Obj_GetX(obj));
                Obj_SetAngle(obj,180-Obj_GetAngle(obj));
                count--;
            }
            //上端
            if(Obj_GetY(obj)<GetClipMinY){
                Obj_SetY(obj,GetClipMinY*2-Obj_GetY(obj));
                Obj_SetAngle(obj,360-Obj_GetAngle(obj));
                count--;
            }
/*          //下端
            if(Obj_GetY(obj)>GetClipMaxY){
                Obj_SetY(obj,GetClipMaxY*2-Obj_GetY(obj));
                Obj_SetAngle(obj,360-Obj_GetAngle(obj));
                count--;
            }*/
            yield;
        }
    }

Obj_GetX(引数1)
1.オブジェクト
オブジェクトのX座標を取得する

Obj_GetY(引数1)
1.オブジェクト
オブジェクトのY座標を取得する

Obj_GetXSpeed(引数1)
1.オブジェクト
オブジェクトの速度を取得する

Obj_GetAngle(引数1)
1.オブジェクト
オブジェクトの角度を取得する

解説


全方位に反射弾を撃つ *
「端の座標*2-反射前の座標」で求めることができます。

全方位弾とは


仕組みはn_way弾より簡単です。

    
//function n_wayObjShot以外省略
    function n_wayObjShot(x,y,speed,angle,color,delay,way){
        loop(way){
            ObjShot(x,y,speed,angle,color,delay,1);//反射弾を撃つ
            angle+=360/way;//変数angleに360をway等分した値を加算する
        }
    }
ここまで読んでくださったほとんどの方が、上のスクリプトを理解されていると思うので、
解説は省略させていただきます。

現在の全体スクリプト

  

関数サンプル

発狂させる(弾を撃つ間隔を短くさせる) *

このスペルカードは、体力が減ったり、時間が経ったりすると弾を撃つ間隔が短くなります。
また、弾の速度が速くなります。
新しいマイクロスレッドを作り、発狂させたいと思います。

let life_delay = 300;//体力で間隔を管理する変数
let time_delay = 300;//時間経過で間隔を管理する変数
let life_speed = 1;//体力で弾速を管理する変数
let time_speed = 1;//時間経過で弾速を管理する変数
let delay;
let speed;
 
task MainTask{
    loop{
        delay=[life_delay,time_delay][life_delay>time_delay];//値が小さいほうをdelayに代入
        speed=[life_speed,time_speed][life_speed<time_speed];//値が大きいほうをspeedに代入
        n_wayObjShot(GetX+rand(-128,128),GetY+rand(-32,32),speed,rand(0,360),BLUE12,10,90);
        loop(delay){yield;}//delayフレーム休む
    }
}
 
task Life_SpeedUp{//体力で発狂
    while(GetLife>500){yield;}//体力が500未満になるまで休む
    life_delay=180;//間隔を3秒間に設定
    life_speed=1.4;
    while(GetLife>250){yield;}//体力が250未満になるまで休む
    life_delay=60;//間隔を1秒間に設定
    life_speed=1.8;
}
 
task Time_SpeedUp{//時間経過で発狂
    let count=0;
    loop(60*60){yield;}//60秒間処理を行わない
    loop{
        time_delay--;//間隔を1フレーム短くする。
        time_speed=1+(0.8/120*count);
        count+=0.5;
        loop(30){yield;}
    }
}
完成したスクリプト
  

関数サンプル


  • 最終更新:2016-03-02 16:19:10

このWIKIを編集するにはパスワード入力が必要です

認証パスワード