|
|
2008/11/22(Sat) 00:17:00|NO.20948
hgimg3を使って3Dのレースゲームを作っている最中です。
各あたり判定としてsetcoliを使ったコリジョン設定を使おうと思っているのですが、
なぜかうまく動きません。
setcoli (障害物のオブジェクトID),1,8
setcoli (障害物のオブジェクトID),1,2
setcoli (プレイヤーのオブジェクトID),8,1
setcoli (敵のオブジェクトID),2,1
setcoli (プレイヤーのオブジェクトID),8,2
setcoli (敵のオブジェクトID),2,8
「プレイヤーのオブジェクト」「敵のオブジェクト」「障害物のオブジェクト」の3種類を
コリジョン設定の三角関係(?)にする事は出来ないのでしょうか?
|
|
2008/11/22(Sat) 13:17:06|NO.20956
僕は、接触の判定するたびに、コリジョンの設定をしました。
こんなかんじです。
setcoli (障害物のオブジェクトID),1
repeat
;プレイヤーと敵との接触を調べる
setcoli (プレイヤーのオブジェクトID),8,2
getcoli val,(プレイヤーのオブジェクトID),検出半径
/* 衝突処理 */
;プレイヤーと障害物との接触を調べる
setcoli (プレイヤーのオブジェクトID),8,2
getcoli val,(プレイヤーのオブジェクトID),検出半径
/* 衝突処理 */
;敵と障害物との接触を調べる
setcoli (敵のオブジェクトID),2,1
getcoli val,(敵のオブジェクトID),検出半径
/* 衝突処理 */
loop
以下、ちょっと長いのですが、サンプルです。
カーソルキーで自分を、w,a,s,dで敵が動かせます。
接触していれば、titleバーの値が変わります。
#include "hgimg3.as"
hgini
setsizef 10,10
setcolor 255,0,0:addbox mdl1:regobj objPLAYER,mdl1 ;赤=自分
setcolor 0,255,0:addbox mdl2:regobj objENEMY,mdl2 ;緑=敵
setcolor 0,0,255:addbox mdl3:regobj objWALL,mdl3 ;青=障害物
setpos objPLAYER,10,0,0
setpos objENEMY,-10,0,0
setpos objWALL,0,0,0
setpos HGOBJ_CAMERA,0,-40,40
cammode CAM_MODE_LOOKAT
setcoli objWALL,1
repeat
getkey ky,37:if ky!0:addpos objPLAYER,-1,0,0
getkey ky,39:if ky!0:addpos objPLAYER, 1,0,0
getkey ky,38:if ky!0:addpos objPLAYER, 0,0,-1
getkey ky,40:if ky!0:addpos objPLAYER, 0,0,1
getkey ky,65:if ky!0:addpos objENEMY,-1,0,0
getkey ky,68:if ky!0:addpos objENEMY, 1,0,0
getkey ky,87:if ky!0:addpos objENEMY, 0,0,-1
getkey ky,83:if ky!0:addpos objENEMY, 0,0,1
;プレイヤーと敵との接触を調べる
setcoli objPLAYER,8,2
getcoli val1,objPLAYER,10
;プレイヤーと障害物との接触を調べる
setcoli objPLAYER,8,1
getcoli val2,objPLAYER,10
;敵と障害物との接触を調べる
setcoli objENEMY,2,1
getcoli val3,objENEMY,10
title "自と敵"+str(val1)+" 自と障"+str(val2)+" 敵と障"+str(val3)
hgdraw
hgsync 15
loop

| |
|
2008/11/23(Sun) 10:50:39|NO.20971
やっぱり何度もコリジョン設定をする方法しかありませんか。
ありがとうございました。
|
|
2008/11/23(Sun) 11:34:22|NO.20972
初期設定のbug
setcoli objWALL,1
の後に、
setcoli objPLAYER,8
setcoli objENEMY,2
も書いておかないと、最初のループでの衝突判定をしてくれない。はず!
|
|
2008/11/23(Sun) 18:54:00|NO.20984
setcoli命令のパラメータにおける
「衝突を検出する対象となるグループ値」
には、グループ値の和(論理和の方が望ましい)を指定すれば
複数のグループを同時に衝突の対象とすることができます。
また、自分が属するグループ値を指定するためだけに
用いることもできます。(その場合、衝突検出対象は無し)
なお、getcoli命令等による衝突の検出は一方的なものなので
setcoli命令で双方向の設定をする必要はありません。
#include "hgimg3.as"
//グループ値の定義
#define PLAYER_GROUP 1
#define WALL_GROUP 2
#define ENEMY_GROUP 4
//HGIMG3の初期化
screen 0,320,240
hgini
//player(青)
setcolor 0,0,255
addbox model,5,5
regobj player,model
setpos player,-10,5,0
//wall(緑)
setcolor 0,255,0
addbox model,5,5
regobj wall,model
setpos wall,10,5,0
//enemy(赤)
setcolor 255,0,0
addbox model,5,5
regobj enemy,model
setpos enemy,0,-10,0
//コリジョン設定
setcoli player,PLAYER_GROUP,WALL_GROUP|ENEMY_GROUP
setcoli wall,WALL_GROUP
setcoli enemy,ENEMY_GROUP
*main
//キー入力情報取得
stick ky,15
//ESCキーで終了
if ky&128:end
//矢印キーでplayerを移動
if ky&1:addpos player,-0.5
if ky&2:addpos player,,-0.5
if ky&4:addpos player,0.5
if ky&8:addpos player,,0.5
//playerに衝突しているオブジェクトを削除
getcoli obj,player,5
if obj>=0:delobj obj
//描画して*mainへ
hgdraw
hgsync 20
goto *main
|
|