HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0430
のほほんズ障害物作成 {改訂2版}12解決


のほほんズ

リンク

2006/4/30(Sun) 17:28:30|NO.544

こんにちは
以前障害物について質問した者です
障害物作成
http://hsp.tv/play/pforum.php?mode=all&num=237
障害物作成 {改訂版}
http://hsp.tv/play/pforum.php?mode=all&num=469
あれから2Dの当たり判定を勉強して
ついでにスクリーンセーバーを作ってしまいました
2Dはほとんどマスターしたのですが
3Dにしようとするとエラーが出てしまいまったくできません
※エラーは文法が間違っていますが主です
なんども申し訳ございませんが
3Dの障害物についてもう少しヒントをいただけないでしょうか
よろしくお願いします



この記事に返信する


K

リンク

2006/4/30(Sun) 19:08:20|NO.545

・・・
まず、自分なりにやった結果を出し
本当は、こうしたいんだけど、実際はこうなるってのを示して
何処がダメなのかを聞くべきです。(手がかりすら分からない訳じゃないんだから・・・)

1、2Dでやったスクリプトを見せる
2、それを3Dにしようとしていたスクリプトを見せる
3、1,2、の動きの仕様を書く(障害物に当たると止まるだけとか)
4、1,2、の実際の動きを書く(通りすぎたりするとか)


スクリプトは、なるべく必要ない物をそぎ落として
それだけでも動かせる方が答える方は楽が出来る。
どこで、何をしてるかもちゃんと書く

答える方は、分かりやすいように答えようと努力するんですから
貴方も、回答者に自分の状況を分かるように説明する努力をしてください



Drip

リンク

2006/4/30(Sun) 19:23:57|NO.546

Dripです。

 のほほんズさん、こんにちは。
当たり判定が2Dで成功しているのであれば、3Dでもエラーせずに正しく動作します。
理由は、実数がサポートされたHSP3であれば、2Dも3Dも判定の仕方は一字一句変わらないからです。
(正しく当たり判定がされなくても、エラーは発生しないはずです。)
恐らくエラーする原因は、当たり判定ではなく物体の配置や、自分のプログラム用に新たに
書き加えた部分等で何らかのエラーが発生しているものと考えられます。

 のほほんズさんが書いた3Dの当たり判定を行うスクリプトをお見せ頂ければ、
何かアドバイスができるかもしれません。



HK

リンク

2006/4/30(Sun) 19:37:39|NO.547

文法が間違ってるってことは命令の誤入力か、無くなった命令を入力していないか
関数と命令を間違えてないか、拡張プラグインのファイルはインクルードできているか。
ってとこかな。

どういう仕組みで衝突判定を行っているかが書いてあるともっと確実に答えられるかも。



のほほんズ

リンク

2006/5/2(Tue) 16:46:42|NO.560

皆さん回答ありがとうございます
文法が間違っていますエラーは出なくなったのですが
今度は障害物をすり抜けてしまいます
実は障害物に円柱みたいなのを使っているので
getcoliでがんばろうと思っています
前回2Dのスクプリトを公開してくれた
Dripさん風にやってみたのですがだめです
そのダメスクプリトが下のスクプリトです(3D)

if RET!-1 { getang RBOBJ,x,y,z x=-x y=-y z=-z }
RBOBJというのは
タンク本体のオブジェクトIDです
スクプリトがたぶん
根本的にちがうかもしれませんが
よろしくお願いします



のほほんズ

リンク

2006/5/2(Tue) 16:49:19|NO.561

すいません
if RET!-1 {
の上に
getcoli RET,RBOBJ,1.0f
を投稿するのを忘れました



のほほんズ

リンク

2006/5/2(Tue) 17:09:52|NO.565

あと一応作ったスクリーンセーバーのスクプリトを公開します
長くなるから
本当はこういうのやめたほうがいいのかな

#packopt type 2 unknown=dir_cmdline saver=strmid(unknown,1,1) if (saver="P")or(saver="p"):goto *sspre if (saver="S")or(saver="s"):goto *ssfull if (saver="C")or(saver="c"):goto *sscfg screen 0,300,200,0 title "のほほんズスクリーンセーバー" pos 10,10 mes "Unknown switch"+dir_cmdline+"" pos 220,160 objsize 70,30 button "OK",*ssend stop *sscfg screen 0,300,200,0 title "のほほんズスクリーンセーバー" pos 10,10 mes "のほほんズのスクリーンセーバーです。" mes "OKボタンをおして閉じてください。" pos 220,160 objsize 70,30 button "OK",*ssend stop *sspre x=ginfo_winx:y=ginfo_winy goto *ssmain *ssfull chgdisp 1,1360,768 if stat=1:goto *ssend if stat=2:goto *ssend x=ginfo_dispx:y=ginfo_dispy bgscr 1,x,y,0 *ssmain color 255,255,255:boxf font "MSゴシック",100,1 ms="のほほんズ" ax=160:ay=160:px=4:py=4 repeat redraw 0 hsvcolor cnt/2,255,255 gmode 0,200,200 grect ax,ay,double(cnt)*0.07 pos 450,340:color 0,0,0:mes ms pos 455,345:color 255,255,255:mes ms await 15 redraw 1 ax+=px:if (ax=0)or(ax=x):px=-px ay+=py:if (ay=0)or(ay=y):py=-py loop *ssloop await 2 goto *ssloop *ssend end
これはサンプルにあったやつをスクリーンセーバーにしたものです
ご回答よろしくお願いします
連続で投稿して申し訳ございません



K

リンク

2006/5/2(Tue) 19:08:18|NO.574

>2Dはほとんどマスターしたのですが

全然マスターしたようには見えないのですが・・・
なぜ、自動で動くキャラじゃなくてキーで動かせるキャラと固定のキャラを表示させて
試さないんでしょうか・・

障害物に対する動きは、全て自分で組むしかありません
障害物制作の命令が、あるわけでも無いので、教えてくれと言われても
のほほんズさんの考える障害物とは何なのか不明で
接触した後の動きも不明です。

なんで、接触後にどう動かしたいかを書かないんですか?
接触後の動作によってはgetcoliで判定した後に自分で改めて判定処理をする
必要も出てきます。

ただ、動きを停止させたいだけなら

getpos RBOBJ,oldx,oldy,oldz ;キーによる移動処理前の座標を保存 ;----------------------------------------------------------- getcoli RET,RBOBJ,1.0f if RET!-1 { setpos RBOBJ,oldx,oldy,oldz ;接触したので接触前の座標に戻す }


この方法には色々問題もあります。
その問題の原因を探し出せれば解決も出来ると思います。

後、getcoliは正方形で回転を考慮しない判定のようです。
(回転を考慮しない判定だから上の方法が出来るんだけど・・・)



Drip

リンク

2006/5/2(Tue) 21:21:23|NO.575

Dripです。

 ・・・ちょっと気になったのですが、のほほんズさんは当たり判定の質問をされていらっしゃるのですよね?
当たり判定の実験のはずが、提示されたスクリプトには全く障害物が存在していないのでちょっと謎です。
3Dの当たり判定は試みていないのでしょうか。
ひょっとしたら障害物の意味が間違って伝わっているのかも・・

 のほほんズさんは2Dは殆どマスターしたとのことですので、もうサンプル改造の
必要性は無いように思えます。うまく動作しないという当たり判定のスクリプトを書いて
質問すれば、適切な回答を受け取れる可能性が高まると思います。
がんばってください。



K

リンク

2006/5/2(Tue) 21:51:46|NO.577

>当たり判定の実験のはずが、提示されたスクリプトには全く障害物が存在していないのでちょっと謎です。

たぶん560見ると聞きたいのは当たった後の事だと思う
接触判定だけじゃ次の行動をさせるにも限界があるんだけど
その辺が分かってないんだと思う
(皆はその辺を考えてアドバイスしてるんだけどね・・・)



Drip

リンク

2006/5/3(Wed) 01:01:26|NO.578

Dripです。

 移動したことが原因でgetcoliを使ってヒット判定が下されたら、
今の移動をキャンセルすれば済むことなのですが・・この方法だと
カニ歩き処理もできなければ完全な壁の接面もできません;
それらをすべて犠牲にするならば、処理はとても簡単です。

 以下にわかりやすさを重視したため問題がある当たり判定のサンプルを示します。
尚、実行したことで画像ファイルをHSPディレクトリに生成しますが、終了と同時に削除
しますのでご安心ください。

#define file "このファイルは削除しても問題ありません。.bmp" buffer 3,256,256:cls 4 repeat 32 color cnt*8,cnt*8,cnt*8:circle cnt,cnt,256-cnt*2,256-cnt*2 loop bmpsave file onexit *exit #include "hgimg3.as" hgini texload file:tex=stat gsel 0 addbox box,10,10 regobj ball,box:setcoli ball,4 regobj box,box:setcoli box,1,4 selpos HGOBJ_CAMERA:objset3 0,0,100 clscolor $111133 setpos box,-30,-20,0 repeat hgdraw stick ky,15 if ky&1:addpos box,-1 if ky&2:addpos box,,-1 if ky&4:addpos box,1 if ky&8:addpos box,,1 gmode 2,256,256 pos 320,240:hgrotate tex,0,0,0.0,256,256 selpos box:objgetfv fv getcoli tmp,box,20:if tmp>-1:{ //★ここで当たり判定 if ky&1:addpos box,1 if ky&2:addpos box,,1 if ky&4:addpos box,-1 if ky&8:addpos box,,-1 } hgsync 15 if cnt\20=0:{ if cnt\40=0:title "カーソルキーで移動します。":else:title "" } loop *exit exist file if strsize>0:delete file hgbye end
とりあえずこれで簡単な当たり判定はできます。
次にこのプログラムの問題性に気づき、修正することを目指してみてくださいね。



Drip

リンク

2006/5/3(Wed) 01:14:27|NO.579

 Kさんのアドバイスで気づいたんですがgetcoliの判定距離は物体の半径ではないようですね。
HSPのマニュアルには「半径」としっかり書かれているのに・・今まで騙されてました;
のほほんズさんすみません;球体や円柱の正確な判定にはピタゴラスの定理とか使ってください;_(_ _;



のほほんズ

リンク

2006/5/3(Wed) 14:57:53|NO.586

みなさんご回答ありがとうございます
Dripさんのスクプリトを修正したら
望んでいた結果がでました
みなさん
ご協力ありがとうございました



ONION software Copyright 1997-2023(c) All rights reserved.