|
|
|
2011/10/19(Wed) 15:28:03|NO.42516
buffer 2
//picload "tip.bmp"
color 3 , 3 , 3
boxf
color 0 , 0 , 0
boxf 0 , 0 , 31 , 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"
map= " N "+"\n"
map+=" 111 22222 22 "+"\n"
map+=" 11111 22 00 2222 N "+"\n"
map+=" 00 00 2222 "+"\n"
map+=" 1 11 11 00000 00 00 1111 "+"\n"
map+=" 0000 11 00 "+"\n"
map+=" 0 0 0 1111 00000"+"\n"
map+=" 00 00 0 "+"\n"
map+=" M 0 0000 00 0 "+"\n"
map+="0000000000000000000000000000000000000000000000000000000 "
noteget mapget , 0
/*メインループ*/
*Mainloop
gosub *MyPositionSarch
repeat
redraw 0
if (cnt = 0) : MyX = MyX0
if (cnt = 0) : MyY = MyY0
gosub *MapDraw
gosub *MyActivity
mes land
gosub *HitCeack
//仮座標を本座標にする
MyX = MyX0
MyY = MyY0
redraw 1
await 16
loop
/*マップデータの中から主人公の位置をサーチ*/
*MyPositionSarch
x = 0 : y = 0
repeat 600
noteget mapget , y
buf = peek(mapget , x)
if (buf = 'M'){
MyX0 = x * 32
MyY0 = 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 600
noteget mapget , y
buf = peek(mapget , x)
//全てのマップチップの座標を取得
ax(cnt) = x * 32 + scx
ay(cnt) = y * 32
if (buf = ' '){
gx = 0
gy = 0
TipSizeX = 32
TipSizeY = 32
}
if (buf = '0'){
gx = 2
gy = 0
TipSizeX = 32
TipSizeY = 32
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
}
if (buf = '1'){
gx = 3
gy = 0
TipSizeX = 32
TipSizeY = 32
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
}
if (buf = '2'){
gx = 1
gy = 0
TipSizeX = 32
TipSizeY = 32
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
}
if (buf = 'N'){
gx = 4
gy = 0
TipSizeX = 32
TipSizeY = 64
NextDoorX = ax(cnt)
NextDoorY = ay(cnt)
}
pos x * 32 + scx , y * 32
gmode 2
gcopy 2 , gx * 32 , gy * TipSizeY , TipSizeX , TipSizeY
x++
if (x = 60) : x = 0 : y++
loop
return
/*主人公の活動*/
*MyActivity
pos MyX , MyY
;gcopy 2 , 0 , 0 , 32 , 32
color 200 , 0 , 0
boxf MyX , MyY , MyX + 31 , MyY + 31
color 255 , 255 , 255
if (land = 1) and (sp < 0) : sp = 0
if (land = 0){
MyY0 = MyY0 - sp
sp--
}
stick key , 5
if (key & 1) : MyX0 = MyX0 - 7
if (key & 4) : MyX0 = MyX0 + 7
if (key = 2) or (key = 3) or (key = 6) and (land = 1){
land = 0
sp = 15
}
if (MyX0 < -31){
MyX0 = 609
scx = scx + 640
}
if (MyX0 > 640){
MyX0 = 0
scx = scx - 640
}
if (scx = 0){
if (MyX0 < 0) : MyX0 = 0
}
if (scx > 0){
scx = 0
MyX0 = 0
}
//当たり判定用の座標の変数の作成
MeTop = MyY0
MeLeft = MyX0
MeRight = MyX0 + 31
MeEnd = MyY0 + 31
return
/*当たり判定*/
*HitCeack
repeat number
DotA = 0
DotB = 0
DotC = 0
DotD = 0
//LandNot変数の初期化
LandNot = 0
//四隅の点の情報を取得
if (MeTop / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotA = 1
if (MeEnd / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotB = 1
if (MeEnd / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotC = 1
if (MeTop / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotD = 1
Dot = DotA + DotB + DotC + DotD
if (MeEnd = NextDoorY + 63){
if (MeLeft / 32 = NextDoorX / 32) or (MeRight / 32 = NextDoorX / 32){
if (key & 16) : end
}
}
//左に移動中の壁衝突
if (DotA = 1) and (DotB = 1){
MyX0 = FloorX(cnt) + 32
LandNot = 1
}
if (MeEnd >= FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){
if (Dot = 1) and ((DotA = 1) or (DotB = 1)){
if (MyX > FloorX(cnt) + 31){
MyX0 = FloorX(cnt) + 32
LandNot = 1
}
}
}
//右に移動中の壁衝突
if (DotC = 1) and (DotD = 1){
MyX0 = FloorX(cnt) - 32
LandNot = 1
}
if (MeEnd >= FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){
if (Dot = 1) and ((DotC = 1) or (DotD = 1)){
if (MyX + 31 < FloorX(cnt)){
MyX0 = FloorX(cnt) - 32
LandNot = 1
}
}
}
//land変数クリア
if (cnt = 0) : land = 0
//落下中に床に衝突
if (DotB = 1) and (DotC = 1){
if (LandNot = 0){
MyY0 = FloorY(cnt) - 32
sp = 0
}
}
if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){
if (Dot = 1) and ((DotB = 1) or (DotC = 1)){
if (MyY0 - MyY > 0){
if (MeEnd >= FloorY(cnt)){
if (LandNot = 0){
if (MyY + 31 < FloorY(cnt)){
MyY0 = FloorY(cnt) - 32
sp = 0
}
}
}
}
}
}
//着地してるかどうかの判定
if ((Dot = 0)or((DotB = 1)or(DotC = 1))){
if (MeTop = FloorY(cnt) - 32){
if (MeRight >= FloorX(cnt)){
if (MeLeft <= FloorX(cnt) + 31){
if (LandNot = 0){
if (key & 2) : else : land = 1
}
}
}
}
}
//ジャンプ中に天井に衝突
if (DotA = 1) and (DotD = 1){
if (LandNot = 0){
MyY0 = FloorY(cnt) + 32
sp = 0
}
}
if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){
if (Dot = 1) and ((DotA = 1) or (DotD = 1)){
if (MyY0 - MyY < 0){
if (MyY > FloorY(cnt) + 31){
if (LandNot = 0){
MyY0 = FloorY(cnt) + 32
sp = 0
}
}
}
}
}
loop
return
またまたすみません。
今回はスクロールできないという問題です。
scx変数がスクロール度を表します。
スクロールに無関係な変数は見過ごして結構です。(見逃して)
教えてください!!!!
本当にわからないものだらけですみません!!!
| |
|
2011/10/19(Wed) 15:37:34|NO.42517
出来てるよ?
|
|
2011/10/19(Wed) 16:18:19|NO.42520
あの、説明不足ですみません。
普通のアクションみたいに滑らかにガーっと
スクロールさせたいのですが。
もし、無理なのであれば、
「左から2つ目の画面から3つ目の画面に移るとき
ピッタリ動くと戻ってしまうのです。」
というバグを直す方法を教えてください!!
|
|
2011/10/19(Wed) 17:15:51|NO.42523
マップ単体でスクロールするスクリプトを組んでみたらどう?
下に落ちない部分は、床があるかどうかの判定結果をタイトルにでも表示して監視とか。
変数の全てを別窓に表示してみるとか実際の数値を確認したいね、キャラに表示してる感じで。
|
|
2011/10/19(Wed) 17:49:14|NO.42526
1、バッファを一つ用意して、マップを全部描写しておく。
2、キャラ位置は表示用位置とscxを使ってマップ座標と比較。
3、あとはキャラクタが画面端にきたときにscxを変化させる。
4、scxを使ってgcopyすることで少しずつずらした画面を描画。
こんな感じかな?
|
|
2011/10/19(Wed) 18:02:03|NO.42527
訂正です。
>2、キャラ位置は表示用位置とscxを使ってマップ座標と比較。
マップに対応させたキャラ座標を使って当たり判定を行い、
マップと同じようにscxを使って表示位置を変えたほうが楽ですね。
|
|
2011/10/19(Wed) 20:23:32|NO.42531
buffer 2
//picload "tip.bmp"
color 3 , 3 , 3
boxf
color 0 , 0 , 0
boxf 0 , 0 , 31 , 31
sdim map , 5000
sdim mapget , 20
dim ax , 200
dim ay , 200
dim FloorX , 1000
dim FloorY , 1000
buffer 3 , 640 * 4 , 320
notesel map
//noteload "maps1.txt"
map= " N "+"\n"
map+=" 111 22222 22 "+"\n"
map+=" 11111 22 00 2222 N "+"\n"
map+=" 00 00 2222 "+"\n"
map+=" 1 11 11 00000 00 00 111 "+"\n"
map+=" 0000 11 00 "+"\n"
map+=" 0 0 0 1111 000 "+"\n"
map+=" 00 00 0 "+"\n"
map+=" M 0 0000 00 0 M 00 "+"\n"
map+="00000000000000000000000000000000000000000000000000000000000000000000000000000000"
noteget mapget , 0
x = 0 : y = 0
number = 0
repeat 800
noteget mapget , y
buf = peek(mapget , x)
//全てのマップチップの座標を取得
ax(cnt) = x * 32 + scx
ay(cnt) = y * 32
if (buf = ' '){
gx = 0
gy = 0
TipSizeX = 32
TipSizeY = 32
}
if (buf = '0'){
gx = 2
gy = 0
TipSizeX = 32
TipSizeY = 32
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
}
if (buf = '1'){
gx = 3
gy = 0
TipSizeX = 32
TipSizeY = 32
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
}
if (buf = '2'){
gx = 1
gy = 0
TipSizeX = 32
TipSizeY = 32
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
}
if (buf = 'N'){
gx = 4
gy = 0
TipSizeX = 32
TipSizeY = 64
NextDoorX = ax(cnt)
NextDoorY = ay(cnt)
}
pos x * 32 + scx , y * 32
gmode 2
gcopy 2 , gx * 32 , gy * TipSizeY , TipSizeX , TipSizeY
x++
if (x = 80) : x = 0 : y++
loop
screen 0 , 640 , 320
/*メインループ*/
*Mainloop
gosub *MyPositionSarch
repeat
redraw 0
if (cnt = 0) : MyX = MyX0
if (cnt = 0) : MyY = MyY0
gosub *MapDraw
gosub *MyActivity
mes land
mes MyX
gosub *HitCeack
//仮座標を本座標にする
MyX = MyX0
MyY = MyY0
redraw 1
await 16
loop
/*マップデータの中から主人公の位置をサーチ*/
*MyPositionSarch
x = 0 : y = 0
repeat 800
noteget mapget , y
buf = peek(mapget , x)
if (buf = 'M'){
MyX0 = x * 32
MyY0 = y * 32
scx = MyX0 / 640
scx = scx * -640
MyX0 = MyX0 + scx
break
}
x++
if (x = 80) : x = 0 : y++
loop
return
/*マップの描写*/
*MapDraw
color 255 , 255 , 255
boxf
pos 0 , 0
gcopy 3 , -scx , 0 , 640 , 320
return
/*主人公の活動*/
*MyActivity
pos MyX , MyY
;gcopy 2 , 0 , 0 , 32 , 32
color 200 , 0 , 0
boxf MyX , MyY , MyX + 31 , MyY + 31
color 255 , 255 , 255
if (land = 1) and (sp < 0) : sp = 0
if (land = 0){
MyY0 = MyY0 - sp
sp--
}
stick key , 5
if (key & 1) : scx = scx + 7
if (key & 4) : scx = scx - 7
if (key = 2) or (key = 3) or (key = 6) and (land = 1){
land = 0
sp = 15
}
ac=0
//当たり判定用の座標の変数の作成
MeTop = MyY0
MeLeft = MyX0 - scx
MeRight = MyX0 + 31 - scx
MeEnd = MyY0 + 31
return
/*当たり判定*/
*HitCeack
repeat number
DotA = 0
DotB = 0
DotC = 0
DotD = 0
//LandNot変数の初期化
LandNot = 0
//四隅の点の情報を取得
if (MeTop / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotA = 1
if (MeEnd / 32 = FloorY(cnt) / 32)and(MeLeft / 32 = FloorX(cnt) / 32) : DotB = 1
if (MeEnd / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotC = 1
if (MeTop / 32 = FloorY(cnt) / 32)and(MeRight / 32 = FloorX(cnt) / 32) : DotD = 1
Dot = DotA + DotB + DotC + DotD
if (MeEnd = NextDoorY + 63){
if (MeLeft / 32 = NextDoorX / 32) or (MeRight / 32 = NextDoorX / 32){
if (key & 16) : end
}
}
//land変数クリア
if (cnt = 0) : land = 0
//落下中に床に衝突
if (DotB = 1) and (DotC = 1){
if (LandNot = 0){
MyY0 = FloorY(cnt) - 32
sp = 0
}
}
if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){
if (Dot = 1) and ((DotB = 1) or (DotC = 1)){
if (MyY0 - MyY > 0){
if (MeEnd >= FloorY(cnt)){
if (LandNot = 0){
if (MyY + 31 < FloorY(cnt)){
MyY0 = FloorY(cnt) - 32
sp = 0
}
}
}
}
}
}
//着地してるかどうかの判定
if ((Dot = 0)or((DotB = 1)or(DotC = 1))){
if (MeTop = FloorY(cnt) - 32){
if (MeRight >= FloorX(cnt)){
if (MeLeft <= FloorX(cnt) + 31){
if (LandNot = 0){
if (key & 2) : else : land = 1
}
}
}
}
}
//ジャンプ中に天井に衝突
if (DotA = 1) and (DotD = 1){
if (LandNot = 0){
MyY0 = FloorY(cnt) + 32
sp = 0
}
}
if (MeRight > FloorX(cnt)) and (MeLeft < FloorX(cnt) + 31){
if (Dot = 1) and ((DotA = 1) or (DotD = 1)){
if (MyY0 - MyY < 0){
if (MyY > FloorY(cnt) + 31){
if (LandNot = 0){
MyY0 = FloorY(cnt) + 32
sp = 0
}
}
}
}
}
//左に移動中の壁衝突
if (DotA = 1) and (DotB = 1)and(ac=0){
scx = FloorX(cnt) + 32 - MyX0
LandNot = 1
}
if (MeEnd >= FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){
if (Dot = 1) and ((DotA = 1) or (DotB = 1)){
if (MyX > FloorX(cnt) + 31)and(ac=0){
scx = FloorX(cnt) + 32 - MyX0
LandNot = 1
}
}
}
//右に移動中の壁衝突
if (DotC = 1) and (DotD = 1)and(ac=0){
scx = FloorX(cnt) - 32 - MyX0
LandNot = 1
}
if (MeEnd >= FloorY(cnt)) and (MeTop < FloorY(cnt) + 31){
if (Dot = 1) and ((DotC = 1) or (DotD = 1)){
if (MyX + 31 < FloorX(cnt))and(ac=0){
scx = FloorX(cnt) - 32 - MyX0
LandNot = 1
}
}
}
loop
return
試してみましたが
恐ろしいほどにバグってしまいました・・・
理解力がないもので、
もう少し具体的に教えてください!!!
| |
|
2011/10/19(Wed) 21:07:41|NO.42532
>理解力がないもので、〜
と言う前に・・・ マップの部分だけで作ってみれば?
今のまま変更だけしていっても、次にぶつかる問題が想像できる・・・。
|
|
2011/10/19(Wed) 21:19:23|NO.42533
誰も注意しないからこのような以下略
プログラミングというのは頭を使って考えるモノだ。教わったものをこぴぺしているだけでは
いつまでたっても脱初心者はできんぞ。
今回の例では画面ごとの大きい単位ではスクロールできているのだから、それをもっと少ない範囲で
やろうという風に応用が利かせられるはずだ。
画面はしにいったら右に画面分ずれる、というのを、真ん中までいったら1マス分ずれる、という風に
自分でアドリブをきかせて考えろ。さばの味噌煮の作り方を覚えたらサンマの味噌煮も作ってみせろ。
|
|
2011/10/19(Wed) 22:26:50|NO.42535
>NO.42526
>NO.42527
上記の考え方で実装してみたら、ぬるぬる動かせましたよ。
Spiderさんが貼っているスクリプトは改行が多く処理ブロックが認識しづらくなっています。
さらに処理に対するコメントアウトも少なく、解読に時間がかかります。
って前にも言いましたよね。これ。
|
|
2011/10/20(Thu) 03:01:04|NO.42540
Spiderさんはヒントを元に処理を実装するだけの実力は持っているので
後はデバッグ(問題点を見つけ出して修正する事)のコツを掴めば
ほとんどの問題は自力で解決できるようになると思います。
デバッグの基本はまず問題がどのように発生するのかを特定する事ですので
どう動かして何をしたら問題が発生するのかを根気よく確認していって下さい。
(この際使用している変数の内容をmesやtitle等で表示させておくのも有効です)
発生要因が大まかにでも掴めれば該当する処理も絞られるので該当処理のスクリプトを
一つの処理ごとにコメントアウト(/**/で囲む等)して実行してみるというのを
問題が発生しなくなるまで繰返していけばどこの処理で問題が発生するかまでは
特定できます。
問題の処理部分が特定できればあとはその部分と関係する処理及び変数を
確認していけば問題部分を特定でき、問題解決へと繋がるはずです。
また、開発を進めていくとどうしてもスクリプトが複雑になりデバッグも難しく
なってきますので、定期的にスクリプトを見直して無駄をなくしたりコメントをつけて
何をしているのかをわかり易くする等の工夫も大切ですし
問題点がどうしても発見できない時は一からスクリプトを組みなおした方が
問題解決が早いという事もあります。
デバッグは時間をかければほとんどの場合問題部分の特定までは出来ますし
行っている処理をちゃんと理解できていれば修正もそれほど難しくない場合が多いです。
この部分に手間をかけられるかどうかが初心者からの脱却にも繋がると思うので
解決を焦らず地道(気長)に頑張ってみて下さい。
|
|
2011/10/20(Thu) 14:00:43|NO.42546
はい、わかりました。
皆さんの言うとうり、今出ているヒント
で頑張ってみます!!!
その他アドバイスもこれからの参考にします。
|
|
2011/10/22(Sat) 19:10:40|NO.42600
いろいろ追加してみました。
// バランス修正用 ;初期設計値
#define TipSizeX 32 ;TipサイズX 32
#define TipSizeY 32 ;TipサイズY 32
#define JumpSp 15 ;ジャンプ初速度 15
#define Gravity 1 ;重力加速度 1
#define MoveX 7 ;横移動 7
#define ScreenX TipSizeX*20 ;実行画面サイズX 20マス
#define ScreenY TipSizeY*10 ;実行画面サイズY 10段
#define ScxR 80 ;画面の80%分、右にきたらスクロール開始
#define ScxL 10 ;画面の10%分、左にきたらスクロール開始
#define RightOnly 1 ;1:左右スクロール、0:右のみスクロール
//==================
//--------マップチップ用バッファ
buffer 2
; screen 2 :title "Screen 2"
//picload "tip.bmp"
color 0 ,0 ,0 : boxf ;画面クリア
//Tip仮置き
; color 32,32,32 : line 0,0,TipSizeX,0 :line 0,TipSizeY :line TipSizeX,TipSizeY :line TipSizeX,0 ;マス描写用
color 0,128,0 : boxf 1*TipSizeX , 0 , 2*TipSizeX-1 , TipSizeY ;'2'
color 0,32,32 : boxf 2*TipSizeX , 0 , 3*TipSizeX-1 , TipSizeY ;'0'
color 0,255,128 : boxf 3*TipSizeX , 0 , 4*TipSizeX-1 , TipSizeY ;'1'
color 0,128,255 : boxf 4*TipSizeX , 0 , 5*TipSizeX-1 , 2*TipSizeY ;'N'
//--------
screen 0 , ScreenX , ScreenY
sdim map , 5000
sdim mapget , 20
dim ax , 2000
dim ay , 2000
dim FloorX , 1000
dim FloorY , 1000
gameover = 0
//--------マップデータ読み込み
notesel map
//noteload "maps1.txt"
; map= " N "+"\n"
; map+=" 111 22222 22 "+"\n"
; map+=" 11111 22 00 2222 N "+"\n"
; map+=" 00 00 2222 "+"\n"
; map+=" 1 11 11 00000 00 00 1111 "+"\n"
; map+=" 0000 11 00 "+"\n"
; map+=" 0 0 0 1111 00000"+"\n"
; map+=" 00 00 0 "+"\n"
; map+=" M 0 0000 00 0 "+"\n"
; map+="0000000000000000000000000000000000000000000000000000000 "
map= " N "+"\n"
map+=" 111 22222 22 "+"\n"
map+=" 11111 22 00 2222 N "+"\n"
map+=" 00 00 2222 "+"\n"
map+=" 1 11 11 00000 00 00 111 "+"\n"
map+=" 0000 11 00 "+"\n"
map+=" 0 0 0 1111 000 "+"\n"
map+=" 00 00 0 "+"\n"
map+=" M 0 0000 00 0 M 00 "+"\n"
map+="00000000000000000000000000000000000000000000000000000000000000000000000000000000"
noteget mapget ;マップ情報一行目を取得
//======マップ描写処理
MapX = strlen(mapget) ;マップ横幅
MapY = noteinfo(0) ;マップ高さ
MapXY = MapX * MapY ;Tip総数
buffer 3 , MapX * TipSizeX , MapY * TipSizeY ;マップ用バッファ確保
gosub *MapDraw ;マップ描写
//__変数表示初期化__
gsel 0 ;変数表示用ウィンドウを表示する位置を取得するためにメインウィンドウを選択。
screen 4,150,500,0,ginfo(4)+ginfo(10),ginfo(5) ;変数表示用ウィンドウ
title "変数チェッカー"
//__変数表示初期化__ここまで
//======================================//
// /*メインループ*/ //
//======================================//
*Mainloop
gsel 0,1 ;スクリーン0をアクティブに
gosub *MyPositionSarch ;自キャラ初期位置を探す。
repeat
redraw 0 ;画面描写停止
//仮座標を本座標にする
MyX = MyX0 : MyY = MyY0
//__変数表示__
gosub *debug_ ;変数表示
//__変数表示__ここまで
gosub *MapCopy ;マップコピー
gosub *MyActivity ;自キャラ移動
gosub *HitCeack ;衝突判定
//__スクロール位置表示__
gsel 0
color 255,0,0
line ScxR*ScreenX/100,ScreenY,ScxR*ScreenX/100,0
line ScxL*ScreenX/100,ScreenY,ScxL*ScreenX/100,0
//__スクロール位置表示__ここまで
redraw 1 ;画面更新
title "【続々・横スクロールアクション:海賊版】Key=" + key ;キー入力を表示
await 16
//gameover変数が1ならばループから出る
if gameover = 1 : break
loop
//ここをgosubで終了処理に飛ばすのもあり
dialog "Game is Over..."
//--------
stop
//================================================//
// /*マップデータの中から主人公の位置をサーチ*/ //
//================================================//
*MyPositionSarch
repeat MapXY
x=cnt \ MapX
y=cnt / MapX
noteget mapget , y
buf = peek(mapget , x)
if (buf = 'M'){
MyX0 = x * TipSizeX
MyY0 = y * TipSizeY
break
}
loop
return
stop
//============================//
// /*マップの描写*/ //
//============================//
*MapDraw
color 255 , 255 , 255
boxf
number = 0
repeat MapXY
x=cnt \ MapX
y=cnt / MapX
noteget mapget , y
buf = peek(mapget , x)
//全てのマップチップの座標を取得
ax(cnt) = x * TipSizeX
ay(cnt) = y * TipSizeY
//switch caseでbufの中身ごとに処理する
pos x * TipSizeX , y * TipSizeY
gmode 2
switch buf
case ' ' ;空き空間
gcopy 2,0,0,TipSizeX,TipSizeY
swbreak
//--------------------
case '0' ;普通のブロック
gcopy 2 , 2 * TipSizeX ,0 * TipSizeY , TipSizeX , TipSizeY
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
swbreak
case '1' ;何かのブロック1
gcopy 2 , 3 * TipSizeX , 0 * TipSizeY , TipSizeX , TipSizeY
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
swbreak
case '2' ;何かのブロック2
gcopy 2 , 1 * TipSizeX , 0 * TipSizeY , TipSizeX , TipSizeY
//普通の床の座標を取得
FloorX(number) = ax(cnt)
FloorY(number) = ay(cnt)
number++
swbreak
case 'N' ;ドア?
gcopy 2 , 4 * TipSizeX , 0 * TipSizeY , TipSizeX , 2*TipSizeY
//ドアの座標を登録
NextDoorX = ax(cnt)
NextDoorY = ay(cnt)
swend
loop
return
stop
//------------------/*主人公の活動*/
*MyActivity
//自キャラ描写
color 200 , 0 , 0 : boxf MyX - scx , MyY , MyX - scx + TipSizeX , MyY + TipSizeY-1
//--------空中処理
if (land = 0){
MyY0 -= sp ;ジャンプ効果
sp -= gravity ;重力加速度の影響
}
//--------キー入力判定
stick key , 5
if (key & 1) { //左移動
MyX0 -= MoveX
if RightOnly{
if (MyX0 - scx) < (ScreenX * ScxL / 100){ ;画面の左にきていたら
scx -= MoveX ;マップ位置を調整
} } }
if (key & 4) { //右移動
MyX0 += MoveX
if ( MyX0 - scx ) > ( (ScreenX * ScxR / 100) - TipSizeX ) { ;画面の右にきていたら
scx += MoveX ;マップ位置を調整
} }
if (key & 2) { ;↑が押された
if (land = 1){ ;接地している
sp = JumpSp ;初速度を代入
} }
//--------スクロール上限、下限で修正
if scx < 0 :scx=0
if scx > (( MapX * TipSizeX ) - ScreenX ) :scx = (MapX * TipSizeX ) - ScreenX
//--------キャラクタの移動制限
if MyX0 < (scx) : MyX0 = scx //左から食み出ない
if MyX0 > (( MapX - 1 ) * TipSizeX ) : MyX0 = ( MapX - 1 ) * TipSizeX //右に食み出ない
if MyY0 > (( MapY + 1 ) * TipSizeY ) : gameover = 1 : return //落ちたら終了
//--------当たり判定用の座標の変数の作成
MeTop = MyY0
MeLeft = MyX0
MeRight = MyX0 + TipSizeX-1
MeEnd = MyY0 + TipSizeY-1
return
stop
//------------------/*当たり判定*/
*HitCeack
land = 0 //land変数クリアして空中散歩を拒否
repeat number
//LandNot変数の初期化
LandNot = 0
FX = FloorX(cnt)
FY = FloorY(cnt)
//四隅の点の情報を取得
//評価式が真なら1を代入するif文だったので、変数に評価式結果を直接代入に変更
MFT = (MeTop / TipSizeY) = (FY / TipSizeY) ;マップと自キャラ位置の上部判定
MFB = (MeEnd / TipSizeY) = (FY / TipSizeY) ;マップと自キャラ位置の下部判定
MFL = (MeLeft / TipSizeX) = (FX / TipSizeX) ;マップと自キャラ位置の左辺判定
MFR = (MeRight / TipSizeX) = (FX / TipSizeX) ;マップと自キャラ位置の右辺判定
DotA= (MFT) and (MFL) ;左上
DotB= (MFB) and (MFL) ;左下
DotC= (MFB) and (MFR) ;右下
DotD= (MFT) and (MFR) ;右上
Dot = DotA + DotB + DotC + DotD
if (MeEnd = NextDoorY + (TipSizeY * 2)){
if (MeLeft / TipSizeX = NextDoorX / TipSizeX) or (MeRight / TipSizeX = NextDoorX / TipSizeX){
if (key & 16) : end
} }
//左に移動中の壁衝突
if (DotA * DotB){
MyX0 = FloorX(cnt) + TipSizeX
LandNot = 1
}
if (MeEnd >= FY) and (MeTop < (FY + TipSizeY - 1 )){
if (Dot = 1)and ((DotA = 1) or (DotB = 1)){
if (MyX > (FX + TipSizeX -1) ){
MyX0 = FX + TipSizeX
LandNot = 1
} } }
//右に移動中の壁衝突
if (DotC * DotD){ ;(DotC=1)&(DotD=1)
MyX0 = FX - TipSizeX
LandNot = 1
}
if (MeEnd >= FY) and (MeTop < (FY + TipSizeY - 1 )){
if (Dot = 1) and ((DotC = 1) or (DotD = 1)){
if ((MyX + TipSizeX-1) < FX){
MyX0 = FX - TipSizeX
LandNot = 1
} } }
//落下中に床に衝突
if (DotB * DotC)*(LandNot = 0){
MyY0 = FY - TipSizeY
sp = 0
}
if (MeRight > FX) and (MeLeft < FX + TipSizeX-1){
if (Dot =1)and ((DotB = 1) or (DotC = 1)){
if (MyY0 - MyY > 0){
if (MeEnd >= FY){
if (LandNot = 0){
if (MyY + (TipSizeY-1) < FY){
MyY0 = FY - TipSizeY
sp = 0
} } } } } }
//着地してるかどうかの判定
if ((Dot = 0)or(DotB = 1)or(DotC = 1)){
if (MeTop = (FY - TipSizeY)){
if (MeRight >= FX){
if (MeLeft <= (FX + TipSizeX - 1 )){
if (LandNot = 0){
if (key & 2) : else : land = 1:sp=0
} } } } }
//ジャンプ中に天井に衝突
if (DotA = 1) and (DotD = 1){
if (LandNot = 0){
MyY0 = FloorY(cnt) + TipSizeY
sp = 0
} }
if (MeRight > FloorX(cnt)) and (MeLeft < (FloorX(cnt) + (TipSizeX - 1 ))){
if (Dot = 1) and ((DotA = 1) or (DotD = 1)){
if (MyY0 - MyY < 0){
if (MyY > FloorY(cnt) + (TipSize - 1 )){
if (LandNot = 0){
MyY0 = FloorY(cnt) + TipSizeY
sp = 0
} } } } }
loop
return
stop
//----------------------------//
// マップをコピーしてくる。 //
//----------------------------//
*MapCopy
//マップバッファからscx分ずらしてコピー
gsel 0
gmode 0,ScreenX,ScreenY
pos 0,0
gcopy 3,scx,0,ScreenX,ScreenY
return
stop
//------------------
*debug_ ;変数表示
gsel 4
redraw 0
color 255,255,255
boxf
color 0,0,0
pos 0,0
mes "--↓設定値----"
mes "TipSizeX="+ TipSizeX
mes "TipSizeY="+ TipSizeY
mes "画面サイズX="+ ScreenX
mes "画面サイズY="+ ScreenY
mes "右スクロール="+ ScxR +"%"
mes "左スクロール="+ ScxL +"%"
mes "ジャンプ初速度="+ JumpSP
mes "重力加速度="+ gravity
mes "横移動力="+ MoveX
mes "\n--↓MAP情報----"
mes "MapX="+ MapX +"マス("+ (MapX * TipSizeX) +"px)"
mes "MapY="+ MapY +"段("+ (MapY * TipSizeY) +"px)"
mes "ブロック数="+ number
mes "\n--↓現状----"
mes "MyX ="+ MyX
mes "MyY ="+ MyY
mes "Land="+ Land
mes "scx ="+ scx
redraw 1
return
stop
| |
|
2011/10/22(Sat) 22:47:24|NO.42602
たんすさん、
とても詳しい解説ありがとうございます。
自分のと比べてやっとおっしゃっていたことが分かりました。
(コピペが嫌いなんで)このようにしていただけると、
わかりやすく、かつ、わからずにコピペ(一番やなこと)にならず
すっきりします。(本当にありがたい)
そのほかにも表記、コメント、
今後のプログラミングに役立てていきたいです。
|
|
2011/10/23(Sun) 05:08:46|NO.42603
追加です。
自分と考えが同じところもあったので
比べやすかったです。(考えて無駄じゃなかった)
|
|