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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0612
不如帰落下時にキャラクターが少し浮いてしまう状態の対策は?7解決


不如帰

リンク

2007/6/12(Tue) 18:30:40|NO.8903


*foul dy=y if jf=0 & ff=0 & map((x+1)/32,y/32+1)=0 & map((x+11)/32,y/32+1)=0 { //足場がない。 ff=1:dy=double(dy):dy+=double(gr):fcnt=0.0 } if ff=1 & jf=0 { dy+=double(gr+fcnt):fcnt+=0.25 } dy=int(dy) if map((x+1)/32,(dy+1)/32)=0 { if map((x+11)/32,(dy+1)/32)=0 { if map((x+1)/32,(dy+23)/32)=0 { if map((x+11)/32,(dy+23)/32)=0 { y=limit(dy,0,ginfo_winy-24) }else:ff=0 }else:ff=0 } } dy=y dy=double(dy) return

これは、開発中アクションゲームのキャラクター落下処理のスクリプトを抜き出したものなのですが、
実は、このルーチンで落下させた場合、時々主人公が浮いてしまうのです。
(つまり、落下したとき、床にぴったりくっつくのではなく、4ピクセル程度浮いてしまうということ。)

何か対策はないのでしょうか?

資料

・変数の概要
ff:落下しているかのフラグ
jf:ジャンプしているかのフラグ
dy:Y座標のチェック用座標(移動量を加算したもの)
map:全体のマップを表します。
gr:重力 落ちる速度に影響
fcnt:落ち始めてからのフレーム数 落ちる速度に影響

・今までに実験した対策(いずれも失敗)
地面に着地したかを判定して、着地しているなら、地面と自分の間の空間のYを自分のYに加算
>地面に着地したかを判定して
の段階で失敗してるようです。



この記事に返信する


AKIHIRO

リンク

2007/6/12(Tue) 18:59:33|NO.8904

とりあえず、表示を4ピクセル下げれば?



eller

リンク

2007/6/12(Tue) 19:24:47|NO.8905

不如帰さん、こんばんは。ellerと申します。

申し訳ありませんが私の実力不足により、現時点では資料の不足で「これが問題です」と申し上げることができないようです。
具体的にはdy+23の「23」や(x+1)/32の「1」や「32」、ginfo_winy-24の「24」が何なのか確信が持てませんでした。
テキストで補足してくださってもかまいませんが、マジックナンバーを少なくして#constや#defineで意味を持たせていただけると読みやすく嬉しいです。

また、「ジャンプ中」と「落下中」の分け方もよく分かりません。
ラベル名からジャンプ中と落下中の演算を分けているものと推測しますが、あまり利点がないように思います。

アクションゲームの考え方や#constの使い方は、最近話題に上がっていた以下のURLを見ていただければ幸いです。
http://hsp.tv/play/pforum.php?mode=all&num=8841
http://hspwiki.tm.land.to/?%BE%AE%A5%EF%A5%B6%2F%A5%A2%A5%AF%A5%B7%A5%E7%A5%F3%2F%B4%F0%CB%DC%C6%B0%BA%EE



不如帰

リンク

2007/6/13(Wed) 17:01:14|NO.8908

>AKIHIROさん
4ピクセルとは限りません。
なので無理です。
>ellerさん
失礼しました。
次のレスにて、改訂版スクリプトを書きます。



不如帰

リンク

2007/6/13(Wed) 17:07:18|NO.8909


#const CharSizeX 23 #const CharSizeY 11 #const MapTipSize 32 *foul dy=y if jf=0 & ff=0 & map((x+1)/MapTipSize,y/MapTipSize+1)=0 & map((x+CharSizeY)/MapTipSize,y/MapTipSize+1)=0 { //足場がない。 ff=1:dy=double(dy):dy+=double(gr):fcnt=0.0 } if ff=1 & jf=0 { dy+=double(gr+fcnt):fcnt+=0.25 } dy=int(dy) if map((x+1)/MapTipSize,(dy+1)/MapTipSize)=0 { if map((x+CharSizeY)/MapTipSize,(dy+1)/MapTipSize)=0 { if map((x+1)/MapTipSize,(dy+CharSizeX)/MapTipSize)=0 { if map((x+CharSizeY)/MapTipSize,(dy+CharSizeX)/MapTipSize)=0 { y=limit(dy,0,ginfo_winy-(CharSizeX+1)) }else:ff=0 }else:ff=0 } } dy=y dy=double(dy) return
マクロ等を使って、わかりやすくしてみました(個人的に)
それと

>ellerさん
ジャンプの処理と落下の処理は分けたほうが、個人的に処理がわかりやすくなるので、
そうしてます。



As

リンク

2007/6/13(Wed) 20:20:08|NO.8910

ある程度の 範囲において if にて補正すればいいとおもいます。



eller

リンク

2007/6/13(Wed) 21:07:26|NO.8911

> 不如帰さん
書き直しありがとうございます。これならば私(第3者)にもわかります。
CharSizeXとCharSizeYが入れ替わっている個所があるようなので、実際のスクリプトに反映させる前にいちど見直されることをお勧めします。

さて本題ですが、「落下先(x, dy)にブロックがあった場合」の処理が不足しているためだと思われます。
(x, y)と(x, dy)の間に落下できる空間がある場合でも落下を終了させてしまっているので、その空間分だけ浮いてしまうのでしょう。
浮かせないためには、空いている空間分だけ落下させる・ブロックの真上に移動させるなどの処理が必要です。

この処理の実装方法は色々考えられます。
例として上の投稿で挙げたDripさんのスクリプトにある、「プレイヤーの座標をめり込まない位置に逃がし…」というコメントの箇所を見てください。
HSP開発WikiのHSP3用サンプルスクリプトの場合、「ブロックの1pxだけ上に移動」とコメントされている箇所になります。
個人的には不如帰さんのスクリプトの場合Dripさんのスクリプトで使われている処理の方が合う気がしますが、いろいろ試してみてください。



不如帰

リンク

2007/6/14(Thu) 19:35:23|NO.8921

みなさんありがとうございます。
皆さんのご教授のおかげで、解決しました。
ご協力ありがとうございました。



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