JavaScript Maniax
■RPGの戦闘シーンをつくる その3
攻撃コマンド入力。
前回の改良により稀に勝利することが出来るようになった勇者氏ですが、やはり完全オートバトルは鬱憤がたまります。
敵の攻撃はオート、自分の攻撃はコマンド選択式にしてゆくことで、例えば体力が少なかったら回復魔法をつかわせる等の計略的な戦闘を繰り広げることが出来ます。
前回の講義で、攻撃選択部分と実際の攻撃部分の関数をわけましたので、今度は攻撃選択部分を、自分の攻撃の場合と敵の攻撃の場合に分けます。
//--sample--
//window.setTimeout("main()",2000) //変更前
//↓変更
if(af==0){ //変更後
window.setTimeout("mAttack()",2000)
}else{
window.setTimeout("eAttack()",2000)
}
//--sample--
これまでmainとしていた敵味方共有の攻撃選択関数を、味方攻撃用のmAttackと敵攻撃用のeAttackという2つの関数に分けました。
敵攻撃の関数はこれまでどおりオートなので特に変更はありません。mainに記載していた内容を写します。
問題は味方攻撃の場合です。
ひとまず単純に、自分の攻撃番のときはキーが押されるまで関数を再帰して、キーが押されたらどの攻撃を行うか判断させてみようと思います。
//--sample--
function mAttack(){
var m,kbn,ch;
ch=0;
kbn=0;
//攻撃内容選択
if(kCode[90]&&!kCode[88]&&!kCode[67]){m=mych.name+"の攻撃 ⇒ ";kbn=0;ch=1}
if(!kCode[90]&&kCode[88]&&!kCode[67]){m=mych.name+"は攻撃呪文を唱えた ⇒ ";kbn=1;ch=1}
if(!kCode[90]&&!kCode[88]&&kCode[67]){m=mych.name+"は回復呪文を唱えた ⇒ ";kbn=2;ch=1}
if(ch){
m="<BR>"+m;
setMess(m);
window.setTimeout("sub(" + kbn + ")",1000)
}else{
window.setTimeout("mAttack()",5)
}
}
//--sample--
これで、キーが押されるまで関数mAttackが呼ばれ続け、キーが押されたらそれに従い関数subが呼ばれます。
上記例だと、[z]キーが攻撃、[x]キーが攻撃呪文、[c]キーが回復呪文となります。
折角ですので、この情報も画面上に出しましょう。
ただし、関数に
//--sample--
m="キーを押してください>>[z]攻撃/[x]攻撃呪文/[c]回復呪文";
if(document.all.t.innerHTML!="")m="<BR><BR>"+m;
setMess(m);
//--sample--
だけ追記するとどうなるか、想像してみてください。
再帰するたびにこの箇所を通りますので、画面上の文字はすぐこの文言のみになってしまいます。
再帰の場合と、他関数からよばれた初回の場合で処理を切り分ける必要があります。
//--sample--
function mAttack(no){
〜〜中略〜〜
if(no==0){
m="キーを押してください>>[z]攻撃/[x]攻撃呪文/[c]回復呪文";
if(document.all.t.innerHTML!="")m="<BR><BR>"+m;
setMess(m);
}
〜〜中略〜〜
if(ch){
m="<BR>"+m;
setMess(m);
window.setTimeout("sub(" + kbn + ")",1000)
}else{
window.setTimeout("mAttack(1)",5)
}
}
//--sample--
関数に引数が増えました。この関数を他から呼ぶ場合は引数に0を、再帰する場合のみ引数に1を渡すことで、初回のみメッセージ表示することができました。
[