動け敵@シューティング

おはようございます。
先ほど、書きかけたエントリが自動バックアップされないまま消えてしまいました。
ログイン期限が切れた感じでした。自動バックアップもされてないしOrz
くぞう。まけないぞっ

というわけで、
全エントリで敵の動作をスクリプトで書きましたが、今回は画面に反映させたいと思います。

敵にはスピードがあって、X移動量とY移動量に影響を与えるんだ!
と、勢いよくはじまったわけですが、やっぱり壁は数学っぽいところ。
角度と移動量に関して再勉強しました。
その結果がこれ。

雨がふるように敵が左下に移動しています。

なぜかというと、スクリプトにこんな記述が。

###相対座標 -100,+100へ移動
RMOVE -100,100;

移動方向は間違ってないですね!

そして、下は移動量計算ロジックです。

double tx = (double)atoi(enemies->commands->param1);
double ty = (double)atoi(enemies->commands->param2);
double rad = atan2(ty,tx);
double mx = cos(rad) * enemies->speed;
double my = sin(rad) * enemies->speed;
enemies->move.x = (float)mx;
enemies->move.y = (float)my;
printfDx("RMOVE >> target:%f,%f move:%f,%f\n",tx,ty,mx,my);

あとは、指定座標に移動したら止まるようにしないと。
〜時間経過〜
というわけで、Enemy構造体に移動フレーム数を追加しました。
さきほどの移動量計算ロジックに移動フレーム計算ロジックを追加。
ついでにコマンド実行フラグと実行コマンドインデックスをつけて、

double tx = (double)atoi(enemies->commands[enemies->command_index].param1);
double ty = (double)atoi(enemies->commands[enemies->command_index].param2);
double rad = atan2(ty,tx);
double mx = cos(rad) * enemies->speed;
double my = sin(rad) * enemies->speed;
double tmove = sqrt((tx * tx) + (ty * ty));//総移動距離
double mmove = sqrt((mx * mx) + (my * my));//1フレーム移動距離
double flame = tmove / mmove;
enemies->move_flame = (int)flame;
enemies->move_target.x = enemies->pos.x + tx;
enemies->move_target.y = enemies->pos.y + ty;
enemies->move.x = (float)mx;
enemies->move.y = (float)my;
printfDx("RMOVE >> target:%.2f,%.2f move:%.2f,%.2f flame:%d\n",tx,ty,mx,my,(int)flame);
enemies->command_act_flg = COMMAND_ACT;
enemies->command_index++;

移動終了ロジックはこちら。
移動フレームを減算していって、0になれば、目的の座標に移動させます。フレーム数や小数誤差の関係があるので、そうしたほうがいいのかなと。

if(enemies->move_flame > 0){
     enemies->move_flame--; 
        if(enemies->move_flame == 0){//移動終了
            enemies->pos.x = enemies->move_target.x;
            enemies->pos.y = enemies->move_target.y;
            enemies->move.x = 0;
            enemies->move.y = 0;
            enemies->command_act_flg = COMMAND_NOACT;
            printfDx("移動終了\n");
        }
    }
}

で、敵のスクリプトはこうなってます。

###相対座標 -100,+100へ移動後、相対座標+20,-100へ移動
RMOVE -100,100;
RMOVE 20,-100;

おほーーーうごいた
画面だとちょっとわかりにくいですが、左下に移動した後、若干戻りながら上に移動しています

絶対座標は簡単でした。絶対座標を相対座標に変換して相対座標処理に乗っけただけ。

っと、ここで問題発生。先頭の敵が最後のコマンドを終了処理したあと、後続の敵がコマンドを終了処理しませんでした。=2〜x体目は動き続けます
問題は、1体目のコマンド終了後、ポインタが後続の敵へ飛んでいませんでした。
修正して、スクリプトも遊びながら作って。

AMOVE 0,0;
AMOVE 640,0;
AMOVE 0,480;
AMOVE 640,480;
AMOVE 0,0;
###相対座標
RMOVE 300,200;
RMOVE -200,0;
###絶対座標
AMOVE 500,400;

おお、隊列を成してうごいてます。

最後に1箇所にすべての敵が納まる。いい感じです。