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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1010
Spider横スクロールアクション〜マップチップの当たり判定〜11解決


Spider

リンク

2011/10/10(Mon) 18:40:36|NO.42234


buffer 2 color : boxf 32 , 0 , 63 , 31 color 200 , 0 , 0 : boxf 64 , 0 , 95 , 31 screen 0 , 640 , 320 sdim map , 5000 sdim mapget , 20 dim ax , 200 dim ay , 200 dim FloorX , 1000 dim FloorY , 1000 notesel map noteload "maps1.txt" noteget mapget , 0 //メインループ *Mainloop gosub *MyPositionSarch repeat redraw 0 gosub *MapDraw gosub *MyActivity gosub *HitCeack redraw 1 await 16 loop //マップデータから主人公の位置をサーチ *MyPositionSarch x = 0 : y = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) if (buf = 'M'){ MyX = x * 32 MyY = y * 32 break } x++ if (x = 20) : x = 0 : y++ loop return //マップの表示 *MapDraw color 255 , 255 , 255 boxf x = 0 : y = 0 number = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) ax(cnt) = x * 32 ay(cnt) = y * 32 if (buf = ' '){ gx = 0 gy = 0 } if (buf = '0'){ gx = 1 gy = 0 FloorX(number) = ax(cnt) FloorY(number) = ax(cnt) number++ } pos x * 32 , y * 32 gcopy 2 , gx * 32 , gy * 32 , 32 , 32 x++ if (x = 20) : x = 0 : y++ loop return //主人公の活動 *MyActivity pos MyX , MyY gcopy 2 , 64 , 0 , 32 , 32 if (land = 1) and (sp < 0) : sp = 0 if (land = 0){ MyY = MyY - sp sp-- } stick key , 5 if (key & 1) : MyX = MyX - 7 if (key & 4) : MyX = MyX + 7 if (MyY >= 288) : MyY = 288 : land = 1 if (key = 2) or (key = 3) or (key = 6) and (land = 1){ land = 0 sp = 15 } return //ブロックの当たり判定 *HitCeack repeat number loop return

というものなんですが、
黒いやつをブロック(中に入れない)にしたいのです。
HSPプログラミング始めたばかりで横スクロールアクションの
マップチップの当たり判定がいろいろ試しましたがすべて失敗でした。
どうか教えてください。(実行してみてください)



この記事に返信する


ORZ

リンク

2011/10/10(Mon) 18:47:50|NO.42237

実行してみたらダイアログが出てOKを押したらプログラムが終了したぞ。
我々はmap1なるファイルを持っていないので、確認が出来るわけがない。
それからソースコードは必ずインデントする事。自分の見づらいコードを人に見てもらうための
せめてものマナーと言うか心意気なので贅沢に付けたコメントとともに必ずヤる事。



Spider

リンク

2011/10/10(Mon) 19:30:17|NO.42244

buffer 2
color : boxf 32 , 0 , 63 , 31 color 200 , 0 , 0 : boxf 64 , 0 , 95 , 31 screen 0 , 640 , 320 sdim map , 5000 sdim mapget , 20 dim ax , 200 dim ay , 200 dim FloorX , 1000 dim FloorY , 1000 notesel map noteload "maps1.txt" noteget mapget , 0 *Mainloop gosub *MyPositionSarch repeat redraw 0 gosub *MapDraw gosub *MyActivity gosub *HitCeack redraw 1 await 16 loop *MyPositionSarch x = 0 : y = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) if (buf = 'M'){ MyX = x * 32 MyY = y * 32 break } x++ if (x = 20) : x = 0 : y++ loop return *MapDraw color 255 , 255 , 255 boxf x = 0 : y = 0 number = 0 repeat 200 noteget mapget , y buf = peek(mapget , x) ax(cnt) = x * 32 ay(cnt) = y * 32 if (buf = ' '){ gx = 0 gy = 0 } if (buf = '0'){ gx = 1 gy = 0 FloorX(number) = ax(cnt) FloorY(number) = ax(cnt) number++ } pos x * 32 , y * 32 gcopy 2 , gx * 32 , gy * 32 , 32 , 32 x++ if (x = 20) : x = 0 : y++ loop return *MyActivity pos MyX , MyY gcopy 2 , 64 , 0 , 32 , 32 if (land = 1) and (sp < 0) : sp = 0 if (land = 0){ MyY = MyY - sp sp-- } stick key , 5 if (key & 1) : MyX = MyX - 7 if (key & 4) : MyX = MyX + 7 if (MyY >= 288) : MyY = 288 : land = 1 if (key = 2) or (key = 3) or (key = 6) and (land = 1){ land = 0 sp = 15 } return *HitCeack repeat number loop return



"aps1.txt"↓

--------------------
-000------------000-
-------00000--------
--------------------
-00000-------00000--
--------------------
-00000-------00000--
--------------------
--------------------
---------M----------


先ほどは申し訳ありませんでした。
インデントできてると思ってました。



Spider

リンク

2011/10/10(Mon) 19:31:53|NO.42245

テキストファイルの内容は、
空白は-で表しました。(見えないので)



HSP-BEGINNER

リンク

2011/10/10(Mon) 20:53:30|NO.42252


スクリプトが長いですよ(>д<)

不要部分の多い長いスクリプトの投稿は ご遠慮ください。
と書いて有るので
必要なところを搾り出したらどうですか?
僕は詳しくないので申し訳ないですが突っ込みしかできません・・・(°д°))))サーセン



Spider

リンク

2011/10/10(Mon) 21:42:13|NO.42254

すみません。でも、俺のスプリクトは
わかりにくので、全部書いて試してもらいたかったのです。



ORZ

リンク

2011/10/10(Mon) 22:02:56|NO.42256

長さ的にはこんなもんでしょうよ。マップの部分は、外部ファイルを用意させるとコピペで動かなくて
面倒極まりないので、ソースコード中に

notesel map //noteload "maps1.txt" map= " "+"\n" map+=" 000 000 "+"\n" map+=" 00000 "+"\n" map+=" "+"\n" map+=" 00000 00000 "+"\n" map+=" "+"\n" map+=" 00000 00000 "+"\n" map+=" "+"\n" map+=" "+"\n" map+=" M " noteget mapget , 0
このように書けばモアベターだっただろう。
で、あたり判定についてだが、実際何をどのように試して、どういう結果になって失敗になったんだ?
それを言わないともしかしたらまったく同じ解説サイトを貼る事にもなりかねない。
至急とか言わんから、ゆっくりしっかり説明してくれ。



てれてれ

リンク

2011/10/10(Mon) 22:03:23|NO.42257

>必要なところを搾り出したらどうですか?
別にこの程度の長さのスクリプトではさほど問題は無いと思います。
変にスクリプトを省略したり、部分的に抜粋したものだけを書かれても、
人によってはめんどくさがって見ることすらしないかもしれませんし。(自分とか)



コルビー

リンク

2011/10/10(Mon) 22:10:01|NO.42258

テキストファイルの内容はそのままソース内に記述した方が親切ですね。
あとコメントによる注訳がないので物凄く見難いです。
解かり難い事を自覚しているのなら、
ORZさんの言うとおりせめて解かりやすくするように努力しましょう。

で、壁判定の処理についてですが、
いくつかやりようがあると思いますが、私が以前作ったゲームでは

・めり込み対策の為に本座標と仮座標を用意する。移動処理中は仮座標で計算し、
 描写直前に仮座標を本座標と確定する
・移動時にキャラクターの4隅の頂点の座標を検出する
 (例:左上の頂点から時計回りにA,B,C,Dとする)
・その頂点の座標がそれぞれ壁にめり込んでいるかどうか調べる。
・例えばBとCが同時にめり込んでいたら右方向に対してめり込んでいるので、
 仮座標Xを本座標Xの位置に戻す。
 この様にどの頂点がめり込んでいるかの組み合わせでめり込んだ方向を判断し、
 その方向への移動を修正する

私は基本的な壁判定の処理をこの様な考えで作りました。

一点だけ、上記の処理の仕方だと斜め方向のめり込みの検知の仕方に問題が出てくると思いますが、
私はどこか一つの頂点だけがめり込んだ場合、めり込み先のブロックに対して
X方向とY方向のめり込み分を検出し、その差を比較することで
どの方向からめり込んだかを判定しました。

ソースは長くなるので書きませんが、
どのような処理をすればいいのか、という目的がわかれば
それに沿った処理を作っていけば良いので理解しやすいはずです。
ゲーム制作頑張ってください。いつか貴方の作ったゲームを遊べる事を心待ちにしています。



Spider

リンク

2011/10/10(Mon) 22:31:22|NO.42261

わかり辛くて誠にすみませんでした。
試してみます。ゲーム出来たら掲示板で書きます。(評価くれるとうれしいです)
ありがとうございました。



HSP-BEGINNER

リンク

2011/10/14(Fri) 19:35:08|NO.42375

2011/10/10(Mon) 21:42:13のSpiderさん
分りました・・・突っ込みいれてスイマセン。



Spider

リンク

2011/10/14(Fri) 21:21:09|NO.42382

ここは終了します・・・



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