|
|
2006/5/5(Fri) 14:14:52|NO.609
こんにちは
以前障害物について質問した者です
障害物作成
http://hsp.tv/play/pforum.php?mode=all&num=237
障害物作成 {改訂版}
http://hsp.tv/play/pforum.php?mode=all&num=469
障害物作成 {改訂2版}
http://hsp.tv/play/pforum.php?mode=all&num=544
障害物作成 {改訂2版}
の最後の投稿をさせてもらった次の日に気がついたのですが
正面から障害物に突っ込むと
きちんととまるのに
裏側から障害物に突っ込むと
すりぬけてしまう+タンク本体がスピードアップする
という現象が発生しました
当たり判定の部分はこんな感じです
getcoli RET,RBOBJ,1.0f
if RET!-1 {
if kY&1:addpos RBOBJ,-0.3f,0.0f,0.0f
if kY&2:addpos RBOBJ,0.0f,0.0f,-0.3f
if kY&4:addpos RBOBJ,0.3f,0.0f,0.0f
if kY&8:addpos RBOBJ,0.0f,0.0f,0.3f
}
障害物のz座標より値が大きくなったら
またはちいさくなったら
addposのパラメーターを変えるみたいなことをするのかなぁ
みなさんの意見をお聞かせください
よろしくお願いします
|
|
2006/5/5(Fri) 14:41:12|NO.610
基本的には2Dと変わらないけど。多分。
getcoli RET,RBOBJ,1.0
if RET!-1 {
front=-0.3
back=0.3
left=0.3
right=ー0.3
addpos RBOBJ,front,0.0,0.0
addpos RBOBJ,0.0,0.0,back
addpos RBOBJ,left,0.0,0.0
addpos RBOBJ,right,0.0,0.0
}
値に変数を使うようにする。衝突を検知したら進行方向に対応している変数に0をいれるように組む。(障害物に接触しながらの移動は出来ないけど)
そいえば、のほほんズさんはどうやって移動の制御をしているんですか?
移動の制御の仕方によって衝突判定も異なるので。
|
|
2006/5/5(Fri) 15:41:55|NO.611
だからさ、なんで接触した後にどう動かしたいか言わないのよ
getpos RBOBJ,oldx,oldy,oldz ;キーによる移動処理前の座標を保存
;-----------------------------------------------------------
getcoli RET,RBOBJ,1.0f
if RET!-1 {
setpos RBOBJ,oldx,oldy,oldz ;接触したので接触前の座標に戻す
}
これは試したの?接触した時に止めるだけならDripさんのと得られる結果は同じ
だけど、Dripさんのは回転した方向に進む物には適用しない
自分は移動方法を、知ってたから回転しても大丈夫な方法を挙げたのに・・・
でも、自分の方法は、へたしたら動けなくなる可能性もある
安全にするなら getpos RBOBJ,oldx,oldy,oldzの所を
if RET=-1:getpos RBOBJ,oldx,oldy,oldz ;接触してなかった時だけ保存
他の動作にする時も接触前の座標は重要です。
ここから色んな方法にもっていけます。
#障害物との距離を一定にして止まったり、擦りながら進んだり
|
|
2006/5/5(Fri) 16:33:30|NO.613
さっきのやつの改良してみる
徐々に障害物に近づける
getcoli RET,RBOBJ,1.0f :保存直前に接触物がないか判定(重要)
if RET=-1:getpos RBOBJ,oldx,oldy,oldz ;キーによる移動処理前の座標を保存
;-----------------------------------------------------------
getcoli RET,RBOBJ,1.0f
if RET!-1 {
getpos RBOBJ,x,y,z
ssped=0.1 ;sspedは調整が必要
x=oldx-(oldx-x)*ssped ;徐々に障害物に近づける
y=oldy-(oldy-y)*ssped
z=oldz-(oldz-x)*ssped
setpos RBOBJ,x,y,z
}
接触前に戻すのが理解できたらこんなのとかも簡単
|
|
2006/5/5(Fri) 22:36:35|NO.619
Dripです。
こんにちは。これは本質的な問題解決の話ではないのですが、当たり判定に留まらず今回のような
ケースの不具合は、プログラムのさなか何発も連続で発生します(特に3Dでは)。
初心者のうちは浮動小数点による数値の誤差に惑わされることもよくありますし(これはプロでも時たまやります;)、
深いサブルーチンに眠るたった1バイトの文字がプログラム全体の挙動を狂わせることもあります。
・・これを解決していくのがプログラミングの醍醐味であり面白さなのですが・・
苦痛に感じてわからない事を質問し続けていると、永久にサンプル改造の域を出ず、
オリジナルを作ることができません;・・余談でした。的外れ&関係なかったら無視してください。
さて本題ですが、前回私が提示したプログラムは様々な面(汎用性等)において問題があるプログラムです。
(そのかわり理解には苦しまなかったはずです。)のほほんズさんのプログラムが現在どうなっているのか
見て取ることはできないので前回以上の回答は差し上げられないのですが、必ずどこかに見落としや
間違いがあるはずです。
どうしても煮詰まってしまったらアルゴリズムそのものを変更してしまうのも手です。
当たり判定用のポリゴンモデルを作り、当たり判定してしまえば、でこぼこ地形にも対応した
スリリングな戦車ゲームも作れます。
連休などがあれば、お茶でも飲みながら是非じっくり粘って研究してみてください。
きっと良いものができると思いますよ。^^
|
|
2006/5/7(Sun) 12:57:40|NO.624
みなさんご回答ありがとうございます
まずHKさんの方法でやってみました
前回よりかは
いい感じがするのですが
たまにすりぬけてしまう+タンク本体がスピードアップする
という現象が発生します
移動の制御のスクプリトは下に記載しました
stick KY,15
selpos RBOBJ:objgetfv FV
selang RBOBJ
if KY&4:addang RBOBJ,0.0,-0.05,0.0
if KY&1:addang RBOBJ,0.0,0.05,0.0
objgetfv FV2
FV2.1=-FV2.1
if KY&2: {
fvdir FV2, 0.0f, 0.0f, 0.3f
fvadd FV, FV2.0, FV2.1, FV2.2
}
if KY&8: {
fvdir FV2, 0.0f, 0.0f, -0.3f
fvadd FV, FV2.0, FV2.1, FV2.2
}
objgetfv FV2
FV2.1=-FV2.1
「↑」で前進「↓」で後退
「←」で左回転「→」で右回転します
次にKさんの方法でやってみました(最初の投稿)
障害物と接触してもすり抜けてしまいます
※自分のやり方が悪いのかもしれません
だからまだKさんの改良スクプリトは確かめていません
あと接触した後にどう動かしたいかということですが
たとえばまん前に障害物があったら
前進できないとかそんなかんじです
何度も申し訳ありませんが
みなさんの意見をお聞かせください
よろしくお願いします
|
|
2006/5/7(Sun) 15:15:53|NO.626
Dripです。
こんにちは。いつものほほんズさんの投稿されるスクリプトと質問意図は、なぜか全く違ったものなので
皆さんも回答に困っているのだと思うのですが、こういうことをやりたいのではないでしょうか。
#include "hgimg3.as"
randomize 20:mapx=8:mapy=7:size=20:vl=5.0:intm=120:hgini:newevent ev
event_wait ev,30:event_pos ev,intm,0.0,0.0,0.0:event_ang ev,intm,0.0,-2.0,0.0
event_wait ev,intm:setang foxHound,-1.5708:setpos foxHound,mapx/2*size,-200.0,mapy/2*size
setevent foxHound,ev:dim map,mapx,mapy:setuv 0,0,64,64:addbox box,size,size
texload "sample\\hgimg3\\btex.bmp":addmesh ground,mapx,mapy,0,mapx*size,mapy*size
setuv 0,0,64,64:texload "sample\\hgimg3\\q.bmp":regobj a,ground
setpos a,mapx*size/2,size/2,mapy*size/2:repeat 16:tx=rnd(mapx):ty=rnd(mapy):map(tx,ty)=1
regobj a,box:selpos a:objset3 tx*size+size/2,0,ty*size+size/2:loop:repeat intm+30
hgdraw:hgsync 15:loop:selang foxHound:objgetfv fv:ang=fv(1):repeat:hgdraw:stick ky,15
selang foxHound:if ky&1:{ang+=0.04}:if ky&4:{ang-=0.04}:objset1 1,ang:selpos foxHound
fis=0.0:if ky&2:{fis=vl}:if ky&8:{fis=-vl}:objgetfv fv:fv-=sin(ang)*fis:fv(2)-=cos(ang)*fis
if fv>=0.0 & fv(2)>=0.0 & fv<mapx*size & fv(2)<mapy*size:{
if map(int(fv/size),int(fv(2)/size))=0:{objadd3 -sin(ang)*fis/vl,0.0,-cos(ang)*fis/vl}
}else{objadd3 -sin(ang)*fis/vl,0.0,-cos(ang)*fis/vl}:hgsync 15:loop
質問の際には、自分の考えていることがよく相手に伝わるスクリプトを提示しましょう。
質問者より、回答者の方がはるかに状況を把握するのは難しいためです。
特にスクリプトをかいつまんだものではなく、F5を押すだけで実行でき、
正しく動かないことがわかるものを提示すべきです。
プログラムの正しい提示例)
アクションゲームを作っているのですが、画面がチラチラしてとても見にくいです。
それにキャラクタを斜めに移動させることができません。(下のプログラムが今の状態です。)
初めてのアクションゲームなので何か重要なことを見落としているのかもしれません。
チラつきの原因や移動について、ご指摘いただければ幸いです。
px=320:py=240
repeat
cls //画面クリア
stick ky,15
if ky=1:px-=10 //ここが移動部分
if ky=2:py-=10
if ky=4:px+=10
if ky=8:py+=10
pos 0,0:mes "十字キーで操作します。"
pos px,py:mes "●" //キャラクタ描画
await 30
loop
プログラムのよくない提示例)
アクションゲームを作っているのですが、画面がチラチラしてとても見にくいです。
それにキャラクタを斜めに移動させることができません。(下のプログラムが問題があると思われる部分です。)
初めてのアクションゲームなので何か重要なことを見落としているのかもしれません。
チラつきの原因や移動について、ご指摘いただければ幸いです。
stick ky,15
if ky=1:px-=10
if ky=2:py-=10
if ky=4:px+=10
if ky=8:py+=10
| |
|
2006/5/7(Sun) 19:10:37|NO.630
NO.613のは書き間違いがあったので修正
#include "hgimg3.as"
randomize :cls 4
hgini
clscolor $6060
RBOBJSIZ=3.0:setsizef RBOBJSIZ,RBOBJSIZ:setcolor 200,200,0:addbox mdid:regobj RBOBJ,mdid:setcoli RBOBJ,1,2
texload dir_exe + "\\sample\\hgimg3\\btex.bmp" ; テクスチャの登録
BOXSIZ=6.0:setsizef BOXSIZ,BOXSIZ:addbox mdid2,,,stat
repeat 10
regobj BOXOBJ,mdid2:setpos BOXOBJ,10,0,0:setcoli BOXOBJ,2,1:setpos BOXOBJ,BOXSIZ*(rnd(9)+1),0,BOXSIZ*(rnd(9)+1)
loop
setpos HGOBJ_CAMERA,20,-40,80:setang HGOBJ_CAMERA,-0.8,0,0
BOX_RB_COLSIZ=(RBOBJSIZ+BOXSIZ)/2 ;障害物と自分の判定サイズを足す
repeat
getcoli RET,RBOBJ,BOX_RB_COLSIZ;保存直前に接触物がないか判定(重要)
if RET=-1:getpos RBOBJ,oldx,oldy,oldz ;キーによる移動処理前の座標を保存
stick KY,15
selpos RBOBJ
objgetfv FV
selang RBOBJ
if KY&4:addang RBOBJ,0.0,-0.05,0.0
if KY&1:addang RBOBJ,0.0,0.05,0.0
objgetfv FV2
FV2.1=-FV2.1
if KY&2: {
fvdir FV2, 0.0f, 0.0f, 0.3f
fvadd FV, FV2.0, FV2.1, FV2.2
}
if KY&8: {
fvdir FV2, 0.0f, 0.0f, -0.3f
fvadd FV, FV2.0, FV2.1, FV2.2
}
setpos RBOBJ,FV.0, FV.1, FV.2
getcoli RET,RBOBJ,BOX_RB_COLSIZ
if RET!-1 {
getpos RBOBJ,x,y,z
ssped=0.1;sspedは調整が必要
x=oldx-(oldx-x)*ssped ;徐々に障害物に近づける
y=oldy-(oldy-y)*ssped
z=oldz-(oldz-z)*ssped
setpos RBOBJ,x,y,z
}
hgdraw
hgsync 10
loop
#hsp3.1β3でしか試してないからBOXが暗いかも
#暗かったら setang HGOBJ_LIGHT,0,0,0 で適当にライトを動かして
>障害物と接触してもすり抜けてしまいます
これじゃ、接触後の処理がうまく行かないのか衝突判定がダメなのか分かりません
if RET!-1 {
を、抜けたらRETの内容をそのまま表示とかしてます?。
それで、判定は望み通り行ってるか確かめてください
>たとえばまん前に障害物があったら
>前進できないとかそんなかんじです
これでも、はっきりは分からないんですが
本当に進行方向に障害物があったら止まるだけなら今回のでもいいと思うけど
多分障害物に衝突する角度によっては不満も出てくるんじゃないかな・・・
| |
|
2006/5/8(Mon) 15:36:26|NO.646
ご回答ありがとうございます
Kさんのスクプリトを改良したら
ちゃんと障害物の機能を果たしました
Dripさん
次回質問するときは
プログラムの正しい提示例を参考に
質問をするよう勤めてまいります
|
|
2006/5/9(Tue) 17:05:23|NO.672
hsp3.1β3で追加された仕様を使ってた
hsp3.0aの場合
>texload dir_exe + "\\sample\\hgimg3\\btex.bmp" ; テクスチャの登録
>BOXSIZ=6.0:setsizef BOXSIZ,BOXSIZ:addbox mdid2,,,stat
を
BOXSIZ=6.0:setsizef BOXSIZ,BOXSIZ:addbox mdid2 ;3.0aではtexIDの設定は出来なかった(でもhsp3.0aでエラーにならなかった・・・)
texload dir_exe + "\\sample\\hgimg3\\btex.bmp" ; テクスチャの登録
setang HGOBJ_LIGHT,0.0,-1,0 ;とりあえず、色が分かる
に(他にも消し忘れとかあるけど・・・)
>ちゃんと障害物の機能を果たしました
コピペするだけじゃ無くて何をしてるかを解析して
今まで何がダメだったかを考えながら実装してみてください
|
|