|
![](../images/spacer.gif) |
|
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プログラミング始めたばかりで横スクロールアクションの
マップチップの当たり判定がいろいろ試しましたがすべて失敗でした。
どうか教えてください。(実行してみてください)
![](../images/bbs/mark_main.gif)
| |
|
2011/10/10(Mon) 18:47:50|NO.42237
実行してみたらダイアログが出てOKを押したらプログラムが終了したぞ。
我々はmap1なるファイルを持っていないので、確認が出来るわけがない。
それからソースコードは必ずインデントする事。自分の見づらいコードを人に見てもらうための
せめてものマナーと言うか心意気なので贅沢に付けたコメントとともに必ずヤる事。
|
|
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----------
先ほどは申し訳ありませんでした。
インデントできてると思ってました。
![](../images/bbs/mark_main_g.gif)
| |
|
2011/10/10(Mon) 19:31:53|NO.42245
テキストファイルの内容は、
空白は-で表しました。(見えないので)
|
|
2011/10/10(Mon) 20:53:30|NO.42252
スクリプトが長いですよ(>д<)
不要部分の多い長いスクリプトの投稿は ご遠慮ください。
と書いて有るので
必要なところを搾り出したらどうですか?
僕は詳しくないので申し訳ないですが突っ込みしかできません・・・(°д°))))サーセン
|
|
2011/10/10(Mon) 21:42:13|NO.42254
すみません。でも、俺のスプリクトは
わかりにくので、全部書いて試してもらいたかったのです。
|
|
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方向のめり込み分を検出し、その差を比較することで
どの方向からめり込んだかを判定しました。
ソースは長くなるので書きませんが、
どのような処理をすればいいのか、という目的がわかれば
それに沿った処理を作っていけば良いので理解しやすいはずです。
ゲーム制作頑張ってください。いつか貴方の作ったゲームを遊べる事を心待ちにしています。
|
|
2011/10/10(Mon) 22:31:22|NO.42261
わかり辛くて誠にすみませんでした。
試してみます。ゲーム出来たら掲示板で書きます。(評価くれるとうれしいです)
ありがとうございました。
|
|
2011/10/14(Fri) 19:35:08|NO.42375
2011/10/10(Mon) 21:42:13のSpiderさん
分りました・・・突っ込みいれてスイマセン。
|
|
2011/10/14(Fri) 21:21:09|NO.42382
ここは終了します・・・
|
|