HSPでEasy3dを使ってみる
以前、HSPは色々と使ってみたことがあって、書籍も二冊ほど持ってますが、
現在のHSPには3Dのライブラリが同梱されているらしく
開発者の人のサンプルに格闘ゲームもあったので試しに動かしてみました。
http://www5d.biglobe.ne.jp/~ochikko/e3dhsp_samples.htm
ソースコードを読むと、
アクション毎にモデリングモーションファイルを読んでおいて、
あとはキーの入力の値によって、前進したり、猫パンチを繰り出したりしている。
ライブラリが優秀なのか、非常に簡単である(゚Д゚ )ウマー
カメラの位置の設定に「外積」を使っていたりした(外積・内積懐かしい←言葉は覚えているがなんだっけ?(汗)
それはさておき、このままでは人間vs人間の対戦しかできないので、
思考ゲーム開発者の端くれとして、格闘ゲームのAIについて考えてみよう。
うーん。よくわからん(w
相手との間合いを取りつつ、隙を見つけてけり込む、殴る。殴る蹴るの暴行。
そんなところだろうか。
まずはフェーズ1として、ランダムに行動するバージョンを作ってみた
対戦風景
元々あった猫姉の行動処理(*MoveChara2)のキー入力の部分を乱数にしただけである
*MoveChara2AI ;hsid2のキャラクタの動作制御 k=0 forwardstep = 100.0 backstep = -100.0 degstep = 5.0 mdegstep = -degstep ; VK_ が頭につく、定数の詳細は、e3dhsp_vk.as をご覧ください。 ; keybuf は、GetKeyboardState 命令で、セットされます。 E3DRand 200, rand if (rand<=5) : k+=1 ;前進 if (rand>10) & (rand<=15) : k+=2 ;後退 if rand = 40 : k+=4 ;左 if rand = 41 : k+=8 ;右 if rand = 51 : k+=16 ;ぱんち if rand = 52 : k+=32 ;キック if rand = 53 : k+=64 ;防御 E3DGetMotionKind hsid2, curmk2 newmk2 = curmk2 ;モーションのフレーム番号が、最大値に到達したら、モーションをidlingに戻す。 if (curmk2 = mk2_punch)&(frameno2 >= max2_punch) : newmk2 = mk2_idling if (curmk2 = mk2_kick)&(frameno2 >= max2_kick) : newmk2 = mk2_idling if (curmk2 = mk2_defense)&((k&64) = 0)&(frameno2 >= max2_defense) : newmk2 = mk2_idling ;if (curmk2 = mk2_act1)&(frameno2 >= max2_act1) : newmk2 = mk2_idling : E3DDestroyAfterImage hsid2 : E3DSetAlpha hsid2, 0 ;キーに応じて、新しいアクションをセットする。相手方向を向くようにする。 if (curmk2 = mk2_idling) & ((k&16) != 0) : newmk2 = mk2_punch : E3DDirToTheOtherXZ hsid2, hsid1 if (curmk2 = mk2_idling) & ((k&32) != 0) : newmk2 = mk2_kick : E3DDirToTheOtherXZ hsid2, hsid1 if (curmk2 = mk2_idling) & ((k&64) != 0) : newmk2 = mk2_defense : E3DDirToTheOtherXZ hsid2, hsid1 if (curmk2 = mk2_idling) & ((k&16) != 0) & ((k&32) != 0) : newmk2 = mk2_act1 : E3DDirToTheOtherXZ hsid2, hsid1 if newmk2 != curmk2 : E3DSetMotionKind hsid2, newmk2 ;if (newmk2 != curmk2) & (newmk2 = mk2_act1) : E3DCreateAfterImage hsid2, afterimagenum : E3DSetAlpha hsid2, 1 ;キーに応じて、移動、回転をする。 if newmk2 = mk2_idling { if k&1 : E3DPosForward hsid2, forwardstep if k&2 : E3DPosForward hsid2, backstep if k&4 : E3DRotateY hsid2, mdegstep if k&8 : E3DRotateY hsid2, degstep } ;confflagが0で無い場合、2体が重なりすぎないように、離す。 if (confflag != 0) & ( (newmk2 = mk2_idling) | (newmk2 = mk2_defense) ) : E3DSeparateFrom hsid2, hsid1 return
放っておくと殴り倒されたので良しとしよう(゚Д゚ )
あと、なぜかうちの環境だと肌色が白くなって、キョンシーみたいで気持ち悪いのだが、
たしかradeonX1650使ってる。ATIの呪いか?