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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0423
のほほんズ障害物作成 {改訂版}4解決


のほほんズ

リンク

2006/4/23(Sun) 15:54:32|NO.469

こんにちは
以前障害物について質問した者です
http://hsp.tv/play/pforum.php?mode=all&num=237
あれから自分なりに調べて
下のスクプリトを作ってみました

*DRAWLOOP if TIME>0 { TIME=TIME-1 if TIME=0 :goto *OBSTACLE:else:goto *DRAWLOOP } getcoli RET,RBOBJ,1.0f if RET!-1 { TIME=1 goto *DRAWLOOP } 省略 *OBSTACLE end
衝突が検出されたら*OBSTACLEに飛ぶ仕組みになっています
何とか衝突に検出ができたのですが
障害物としての機能がありません
障害物の機能をつくるヒントを教えてください
よろしくお願いします



この記事に返信する


Drip

リンク

2006/4/23(Sun) 18:14:48|NO.470

Dripです。

 のほほんズさん、こんにちは。プログラマー駆け出しのころは、
当たり判定に皆苦労するものです。がんばってください。(^^;

 さて、のほほんズさんが行われている当たり判定(getcoliを利用したもの)は、
物体から見た直線距離を使用して判定しています。よって四角い物体ではなく、
球体のような当たり判定領域をもっていることになります。
四角い物体の当たり判定では、getcoliを使用すべきではありません。

 いきなり3Dで当たり判定をしようとせずに、まずは2Dから考え、
それを3D座標に置き換えて試行錯誤してみてください。
参考までに、以下に当たり判定のサンプルを示します。

//------------------------- ここから -------------------------//

screen 0,320,240
block=115,75,110,90 //障害物の位置(X,Y)とサイズ(X,Y)
gox=4 //障害物の移動速度(X)
goy=5 //障害物の移動速度(Y)

repeat //メインループ
redraw 0
color 255,255,255:boxf

px+=gox //移動(X)
if px>block(0) & px<block(0)+block(2) & py>block(1) & py<block(1)+block(3):{
gox=-gox:px+=gox //障害物にぶつかって反射する(X)
hit=100
}
py+=goy //移動(Y)
if px>block(0) & px<block(0)+block(2) & py>block(1) & py<block(1)+block(3):{
goy=-goy:py+=goy //障害物にぶつかって反射する(Y)
hit=100
}

color 100+hit,255-hit,200:if hit>0:hit-=4 //ヒットすると障害物の色を変化させる
boxf block(0),block(1),block(0)+block(2),block(1)+block(3)

if px<0:gox=-gox //画面外で反射する処理
if px>ginfo_winx-20:gox=-gox //
if py<0:goy=-goy //
if py>ginfo_winy-20:goy=-goy //

color:pos px,py:mes "★"
redraw 1
await 15
loop

//------------------------- ここまで -------------------------//

特に「反射」というコメントがある部分を入念に観察してみてください。
うまく行くことを祈っております。



HK

リンク

2006/4/23(Sun) 19:39:46|NO.471

3Dのゲームの場合、衝突を検知したら他のラベルに飛ばしてから衝突後の動きを与えるのではなく、
メインループ内で自分の移動する値に別の値を加算したりすればできると思います。場合によっては
配列変数を使うのでそれなり面倒かもしれないです。

_______________________________________________________
fvset s,0.0,0.0,0.1   □まず配列変数sを作ってxyzの値(移動する量)を入れる。

*main        □メインループ
hgdraw
hgsync
getkey w,87

g=0
getcoli p1(省略) : if p1=(省略) : g=1 □衝突を検知したら変数gに1を代入
if g=1 : addfv(省略)             □gが1の場合、sをすべて0に

if w&1 : addpos HGOBJ_CAMERA,s (省略)    □Wキーが押されたらsの値の分だけカメラを動かす

goto *main
______________

かなり雑で省略だらけですが基本的な流れはこんな感じかも。多分。間違ってたらごめんなさい。
ちなみにこのスクリプトだと斜めに衝突しても完全に止まってしまいます。10行目で移動する値をすべて0にしてるので。



kz3

リンク

2006/4/24(Mon) 08:39:17|NO.478

みなさんスクリプトの添付は半角の<pre>〜</pre>でくくってください。( 次から... )



のほほんズ

リンク

2006/4/26(Wed) 13:16:10|NO.496

みなさんご回答ありがとうございます
ヒントを参考にこれからもがんばっていこうと思います



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