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の呪いか?