スクリプト記述方法
これも勝手に命名しています。前記の方法で複雑な動きをプログラムした結果、同じようなプログラムが連続するのであれば、それらをまとめて別コード(スクリプト)化して、Switch文で分岐させれば良効率が良くなります。
(例)敵の移動
class enemy extends unit {
main ap;
<中略>
enemy(vectol a,imageman b,int c[],int e[][],main d){
super(a);
super.mode=0;
<中略>
start();//スレッドの開始
}
public void run(){
vectol tmp=new vectol(super.pos);
int i,l;
try{
while(flag){
cnt--;//次のイベント処理までのインターバル
if(cnt<0){
cnt=ivent[index];//インターバル取得
if(cnt < 0){
index+=cnt*4;//インターバル値がマイナスの場合はジャンプとみなす。4はスクリプト1単位のバイトサイズ
cnt=0;
} else {
cmd=ivent[index+1];//移動コマンドの取得
switch(cmd){
case 0://各種移動コマンド
super.pos.setVectol(ivent[index+2],ivent[index+3]);
break;
case 1:
super.pos.setVectol(ivent[index+2],ivent[index+3],ap.vect);
break;
<中略>
}
index+=4;
}
} else {
switch(cmd){
case 70://分岐コマンドはアイドル中に処理
i=ivent[index+2-4] * super.pos.scale;
if(
ap.ppos.x < super.pos.x + i &&
ap.ppos.y < super.pos.y + i &&
ap.ppos.x > super.pos.x - i &&
ap.ppos.y > super.pos.y - i
){
index+=ivent[index+3-4]*4;
cnt=0;
}
break;
<中略>
}
}
super.pos.move(); //スプライトの移動
if(anime != null){ //アニメーション処理
motion_row=super.pos.getRad(anime.length);
if(anime[motion_row].length <= motion_column){
motion_column=0;
}
super.pat=anime[motion_row][motion_column];
motion_column+=1;
}
if(super.pos.checkPoint(super.size,ap.min,ap.max)){ //画面外クリッピング処理
super.mode=0;
flag=false;
}
sleep(1000/60); //スレッドの切り替え
}
} catch(InterruptedException e) {}
}
<中略>
}
あまりにもデカかったので、中略だらけです。Switch文でスクリプトのフォーマットにしたがって各種コマンドを処理するようになっています。この方法であれば、プログラム1つでスクリプトを変えればどんな動きでも表現できます。動きの修正やバグ取りも楽です。処理速度に対するオーバーヘッドもあまり大きくありません。ポイントは単純なコマンドを組み合わせる様な記述ではなく、複雑な処理も1つのコマンドにする事です。そうしないと、Switch文を何度も処理することになりオーバーヘッドが出てくる恐れがあるからです。(単純なコマンドで複雑な処理をさせると、例の場合は特に無駄なスプライト移動、クリッピング処理、アニメーション処理も発生してしまいます。)