no.6 マイクロスレッドと弾オブジェクトの基礎(1)
練習と説明がてらに風神録EXTRA
「諏訪大戦 ~ 土着神話 vs 中央神話」をパクりましょう。
めんどくさいので発狂はさせません。各自させてください。
エフェクトも当然無いです。ボス画像はルーミアで行きましょう。
ざっと見て、下から生えて来る藤の蔦と上から降って来る鉄の輪を交互に出していくスペル。
全部taskで組むとして、
task 全体のタイミング {
wait(120);
loop {
藤蔦;
wait(必要なだけ);
鉄の輪;
wait(必要なだけ);
}
}task 藤蔦 {
}task 鉄の輪 {
}
みたいにして、「全体のタイミング」を@Initializeで呼び出します。@Mainloopで呼び出すと大変なことになるので注意。
とりあえず、
task MAIN {
wait(120);
loop {
FUJI;
wait(400);
IRON;
wait(400);
}
}task FUJI {
}task IRON {
}
とします。楽な方、IRONから作っていきます。25個ぐらいの弾が5秒くらいでごろごろ出て来る。画面外に消えたものを含めて30個にしましょう。中玉と小玉13個から出来ています。
10フレームごとにfunction circle_1 を実行。
function circle_1は鉄の輪をランダムなX座標から下方向若干ランダムに撃つ関数です。
一度に撃ったら最後まっすぐ飛んでいくので、functionを使います。
function circle_1 {
let fujiX = rand(0,right((no.2のテンプレで、right=GetStgFrameWidthで定義しています。左端の座標=0なので、フレーム幅=右端座標です)));
let fujiA = 90+rand(-15,15); //角度
CreateShotA1(fujiX,-30, 4, fujiA, DS_BALL_M_ORANGE,0);
ascent( i in 0..11) {
CreateShotA1(fujiX+20*cos(i*360/11),-30+20*sin(i*360/11), 4, fujiA, DS_BALL_S_ORANGE,0);
}
}
ちょっと見栄えが違いますが細かいことは気にしない。この段階で見ための確認もかねて一回circle_1のテストを適当にしましょう。全部作ってからバグ取りは無謀。
あ、「//ほにゃらら」でコメントアウトできます。スクリプトは//の後ろの部分(改行まで)が無視されます。何行かコメントアウトしたい場合は、/* */で囲みます。
さてこれを5秒=300フレームで30個撃ち出してみましょう。
task IRON {
loop(30) {
circle_1;
wait(10);
}
}
ついでに自機狙いタイプ(赤)も作ります。
function circle_2 {
let fujiX = rand(0,right);
let fujiA = atan2(GetPlayerY-(-30), GetPlayerX-fujiX);
CreateShotA1(fujiX,-30, 4, fujiA, DS_BALL_M_RED,0);
ascent( i in 0..11) {
CreateShotA1(fujiX+20*cos(i*360/11),-30+20*sin(i*360/11), 4, fujiA, DS_BALL_S_RED,0);
}
}
atan2は座標から角度を得る関数。
circle_1とcircle_2が交互に出るようにするのは…
task MAIN {
let count = 0;
wait(120);
loop {
FUJI;
wait(400);
IRON(count%2);
wait(400);
count++;
}
}
task IRON(i) {
if(i==0) {
loop(30) {
circle_1;
wait(10);
}
}
else {
loop(20) {
circle_2;
wait(15);
}
}
}
若干調整しつつこれでいいでしょう。
(circle_1と_2を統合するとかを書き方はもっと色々やり方がありますが)
オブジェクト使ってないって?
次で使いますとも。ぬふふ。