#東方弾幕風[Player] //自機スクリプトであることを示します #ScriptVersion[2] //スクリプトバージョン2が必須です #Menu[Bombing] //自機選択画面で表示されるメニューです #Text[プレイヤーサンプルです。闇符] //自機選択画面で表示されるテキストです #Image[.\RumiaSelect.png] //自機選択画面で表示される画像ファイルへのパスです #ReplayName[Rumia] //リプレイ選択時に表示される文字です。8文字以内です。 script_player_main { let current = GetCurrentScriptDirectory();//カレントディレクトリを取得 let imgRumia = current~"Rumia.png"; let imgRumiaCutIn = current~"RumiaCutIn.png"; let shotCount = -1;//弾を連続で発射するための変数 let bNextShot = false;//ちょん押しでも自弾を連続発射するための変数(説明しづらい) let objShot = NULL;//誘導弾 task slowShot() { //低速移動時の誘導弾 //敵を追尾してダメージを与える if(!Obj_BeDeleted(objShot)){return;}//1個しか存在しない objShot = Obj_Create(OBJ_SHOT); Obj_SetX(objShot, GetPlayerX);//x座標設定 Obj_SetY(objShot, GetPlayerY);//y座標設定; Obj_SetSpeed(objShot, 5);//速度設定 ObjShot_SetGraphic(objShot, 2);//画像設定 ObjShot_SetDamage(objShot, 2);//ダメージを設定 ObjShot_SetPenetration(objShot, 1000000);//貫通力は適当に大きく while( !Obj_BeDeleted(objShot) ) {//削除されるまでループを実行 //ホーミング let toAngle=atan2(GetEnemyY()-Obj_GetY(objShot), GetEnemyX()-Obj_GetX(objShot)); Obj_SetAngle(objShot, toAngle); yield; } } @Initialize { //自機の初期化時に一回だけ呼び出される部分です SetPlayerLifeImage(imgRumia, 1, 5, 49, 60);//残機数の画像 LoadGraphic(imgRumia); SetSpeed(4, 1.6);//移動速度を設定 LoadPlayerShotData(current~"RumiaShotData.txt"); SetItemCollectLine(128);//アイテム回収ラインを設定 } @MainLoop { //毎フレーム実行される部分です // if((GetKeyState(VK_SHOT)==KEY_PUSH || GetKeyState(VK_SHOT)==KEY_HOLD || bNextShot==true) && shotCount==-1) { shotCount = 0; bNextShot = false; } if(GetKeyState(VK_SHOT)==KEY_HOLD && shotCount>0) { bNextShot = true; } if(GetKeyState(VK_SLOWMOVE)==KEY_PUSH || GetKeyState(VK_SLOWMOVE)==KEY_HOLD) { //低速移動時の自弾 if(shotCount != -1) { slowShot(); } if(shotCount%5 == 0) { CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 265, 1.3, 2, 1); CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 270, 1.5, 3, 1); CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 275, 1.3, 2, 1); } } else { //高速移動自の自弾発射 Obj_Delete(objShot);//高速移動時は低速移動時の特殊弾を削除 if(shotCount%5 == 0) { CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 255, 1.3, 1, 1); CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 265, 1.5, 2, 1); CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 270, 1.7, 3, 1); CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 275, 1.5, 2, 1); CreatePlayerShot01(GetPlayerX(), GetPlayerY(), 15, 285, 1.3, 1, 1); } } if(shotCount >= 0) { shotCount++; } if(shotCount == 30) { shotCount=-1; } SetIntersectionCircle(GetPlayerX, GetPlayerY, 1);//当たり判定登録 yield; } @Missed{} @SpellCard { UseSpellCard("Demarcation", true); //カットイン //CutIn(KOUMA,"Something goes here", imgRumiaCutIn); } @DrawLoop { //描画ループ。スキップされない限り1フレームに1回実行されます SetColor(255, 255, 255); SetRenderState(ALPHA); SetTexture(imgRumia); if(GetKeyState(VK_LEFT)==KEY_PUSH || GetKeyState(VK_LEFT)==KEY_HOLD) { SetGraphicRect(1, 133, 49, 188); } else if(GetKeyState(VK_RIGHT)==KEY_PUSH || GetKeyState(VK_RIGHT)==KEY_HOLD) { SetGraphicRect(1, 69, 49, 124); } else { SetGraphicRect(1, 5, 49, 60); } DrawGraphic(GetPlayerX(), GetPlayerY()); } @Finalize { //スクリプト終了時に一回だけ呼び出される部分です DeleteGraphic(imgRumia); } } script_spell Demarcation { let current = GetCurrentScriptDirectory(); let imgEffect = current~"RumiaSpell.png"; @Initialize { LoadGraphic(imgEffect); run; } @MainLoop { yield; } @Finalize { DeleteGraphic(imgEffect); } task run() { //loop(48){yield;} SuperNaturalBorder(400); loop(2) { yield; } while(GetTimeOfSuperNaturalBorder > 0) { if(GetKeyState(VK_BOMB)==KEY_PUSH) { ShootDownPlayer; } yield; } effect; loop(60){yield;} End(); } task effect { let tv=0; let angle=0; let alpha=0; task alphaState { //α値を変更するためのタスク alpha=0; loop(15){alpha+=255/15; yield;} loop(60-15-10) { yield; } loop{alpha-=255/10;yield;} } alphaState; let obj = Obj_Create(OBJ_SPELL);//スペルオブジェクトを作成 ObjEffect_SetTexture(obj, imgEffect);//テクスチャを設定 ObjEffect_SetRenderState(obj, ADD);//描画方法を設定 ObjEffect_SetPrimitiveType(obj, PRIMITIVE_TRIANGLESTRIP);//プリミティブタイプを設定 ObjEffect_CreateVertex(obj, 10);//頂点を10個つくる ascent(i in 0..5) { let angle = -45+i*90; let x; let y; x = 512*cos(angle); y = 512*sin(angle); ObjEffect_SetVertexXY(obj, i*2, x, y);//頂点の座標を設定 ObjEffect_SetVertexXY(obj, i*2+1, 0, 0); ObjEffect_SetVertexColor(obj, i*2, 0, 255, 255, 255);//頂点カラーを設定 } let r = 0; while(!Obj_BeDeleted(obj)) { tv-=1; angle+=4; ObjEffect_SetAngle(obj, 0, 0, angle); Obj_SetPosition(obj, GetPlayerX, GetPlayerY); SetIntersectionCircle(GetPlayerX, GetPlayerY, r, 7, true); ObjEffect_SetScale(obj, r/300, r/300); r+=9; ascent(i in 0..5) { ObjEffect_SetVertexUV(obj, i*2, 16*i,tv);//テクスチャの座標を設定 ObjEffect_SetVertexUV(obj, i*2+1 ,32, 64+tv); ObjEffect_SetVertexUV(obj, i*2, 16*i, tv); ObjEffect_SetVertexUV(obj, i*2+1, 32, 64+tv); ObjEffect_SetVertexColor(obj, i*2+1, alpha, 255, 255, 255); } yield; } } }