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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1019
Spider続々・横スクロールアクション14解決


Spider

リンク

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変数がスクロール度を表します。
スクロールに無関係な変数は見過ごして結構です。(見逃して)
教えてください!!!!
本当にわからないものだらけですみません!!!



この記事に返信する


mamo

リンク

2011/10/19(Wed) 15:37:34|NO.42517

出来てるよ?



Spider

リンク

2011/10/19(Wed) 16:18:19|NO.42520

あの、説明不足ですみません。

普通のアクションみたいに滑らかにガーっと
スクロールさせたいのですが。

もし、無理なのであれば、

「左から2つ目の画面から3つ目の画面に移るとき
 ピッタリ動くと戻ってしまうのです。」
 というバグを直す方法を教えてください!!



mamo

リンク

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を使って表示位置を変えたほうが楽ですね。



Spider

リンク

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

試してみましたが
恐ろしいほどにバグってしまいました・・・
理解力がないもので、
もう少し具体的に教えてください!!!



mamo

リンク

2011/10/19(Wed) 21:07:41|NO.42532

>理解力がないもので、〜
と言う前に・・・ マップの部分だけで作ってみれば?
今のまま変更だけしていっても、次にぶつかる問題が想像できる・・・。



ORZ

リンク

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等で表示させておくのも有効です)
発生要因が大まかにでも掴めれば該当する処理も絞られるので該当処理のスクリプトを
一つの処理ごとにコメントアウト(/**/で囲む等)して実行してみるというのを
問題が発生しなくなるまで繰返していけばどこの処理で問題が発生するかまでは
特定できます。
問題の処理部分が特定できればあとはその部分と関係する処理及び変数を
確認していけば問題部分を特定でき、問題解決へと繋がるはずです。

また、開発を進めていくとどうしてもスクリプトが複雑になりデバッグも難しく
なってきますので、定期的にスクリプトを見直して無駄をなくしたりコメントをつけて
何をしているのかをわかり易くする等の工夫も大切ですし
問題点がどうしても発見できない時は一からスクリプトを組みなおした方が
問題解決が早いという事もあります。

デバッグは時間をかければほとんどの場合問題部分の特定までは出来ますし
行っている処理をちゃんと理解できていれば修正もそれほど難しくない場合が多いです。
この部分に手間をかけられるかどうかが初心者からの脱却にも繋がると思うので
解決を焦らず地道(気長)に頑張ってみて下さい。



Spider

リンク

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



Spider

リンク

2011/10/22(Sat) 22:47:24|NO.42602

たんすさん、
とても詳しい解説ありがとうございます。
自分のと比べてやっとおっしゃっていたことが分かりました。
(コピペが嫌いなんで)このようにしていただけると、
わかりやすく、かつ、わからずにコピペ(一番やなこと)にならず
すっきりします。(本当にありがたい)

そのほかにも表記、コメント、
今後のプログラミングに役立てていきたいです。



Spider

リンク

2011/10/23(Sun) 05:08:46|NO.42603

追加です。
自分と考えが同じところもあったので
比べやすかったです。(考えて無駄じゃなかった)



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