三十歩目 当たり判定3
それでは 今回は何をするか想像がつきますか?
今回は前回でやった 絵を動かすプログラムに 当たり判定を加えてみます
前回のプログラムは これですね
buffer 2 ;仮想画面 ID2を作る picload "zyuunana-1.bmp";画像をロードする gsel 0,1 ;ウインドウ0を描画先にする repeat ;繰り返しの始め redraw 2 ;画面には描画しない color 0,0,0:boxf ;黒で画面を塗りつぶす stick key,1+2+4+8 ;keyという変数に 押されているキー番号を入力 if key=1:x=x-5 ;keyが1だったらxから5を引いてxに入力 if key=2:y=y-5 ;keyが2だったらyから5を引いてyに入力 if key=4:x=x+5 ;keyが4だったらxから5を足してxに入力 if key=8:y=y+5 ;keyが8だったらyから5を足してyに入力 pos x,y ;x,yの位置に gcopy 2 ;ID2のウインドウから 今の描画先へ画像を転送する redraw 1 ;一気に描画 await 1 ;待つ loop ;repeatヘ戻る |
さぁ これに当たり判定のプログラムを加えてみよう
まず 何が必要か・・・
まずウインドウが大きいのでもっと小さくしよう
それから 当たり判定する部分を色分けして それからif命令で当たり判定をしよう
screen 0,300,300 ;画面のサイズを300、300にする buffer 2 ;仮想画面 ID2を作る picload "zyuunana-1.bmp";画像をロードする gsel 0,1 ;ウインドウ0を描画先にする repeat ;繰り返しの始め redraw 2 ;画面には描画しない color 0,0,0:boxf ;黒で画面を塗りつぶす color 100,0,100 ;描画色を紫に boxf 150,0,300,300 ;ウインドウの右半分を塗りつぶす stick key,1+2+4+8 ;keyという変数に 押されているキー番号を入力 if key=1:x=x-5 ;keyが1だったらxから5を引いてxに入力 if key=2:y=y-5 ;keyが2だったらyから5を引いてyに入力 if key=4:x=x+5 ;keyが4だったらxから5を足してxに入力 if key=8:y=y+5 ;keyが8だったらyから5を足してyに入力 pos x,y ;x,yの位置に gcopy 2 ;ID2のウインドウから 今の描画先へ画像を転送する if (x>150) and (x<300):pos 0,0:color 255,255,255:print "進入!" ;当たり判定 redraw 1 ;一気に描画 await 1 ;待つ loop ;repeatヘ戻る |
さぁてと 今回はむちで行くぞ
ものの教え方には むちとあめがあり むちは厳しく あめはやさしく教えるのだ
今回はむちじゃ〜〜〜〜〜
〜簡単な説明〜
if () and () の使い方は前にやった(ココ) andは()と()で囲まれた2つのものが
一致してないとダメだ つまり上のプログラムでいくと
xが150より大きくて それと xが300より小さかったら 成立(:より右のプログラムを実行)する
xってのは ロケットの絵の右上のX座標だ
わかりやすいように ウインドウの左から150以上のところは紫になるようになってる↓
color 100,0,100 ;描画色を紫に boxf 150,0,300,300 ;ウインドウの右半分を塗りつぶす |
その紫のエリアに入ると「進入!」と言う文字がウインドウの左上に現れる
このプログラムを実行して不思議に思った人もいるんじゃないかな?
そう「ロケットのスピードが速い」ってこと
これは ウインドウが小さくなったせいで 絵なんかを表示するスピードが早まったんだ
これを防ぎたい人は if key=1:x=x-5
とかの所の x=x-5の5の数字を小さい数字にすれば
スピードは落ちるよ
さぁ さっきのプログラムを改良してみよう
改良したいのは まずスピードが速いってことと
それから Xってのはロケットの左上の座標で ロケットの右側が当たった時は
当たり判定されない所を治そう
screen 0,300,300 ;画面のサイズを300、300にする buffer 2 ;仮想画面 ID2を作る picload "zyuunana-1.bmp";画像をロードする gsel 0,1 ;ウインドウ0を描画先にする repeat ;繰り返しの始め redraw 2 ;画面には描画しない color 0,0,0:boxf ;黒で画面を塗りつぶす color 100,0,100 ;描画色を紫に boxf 150,0,300,300 ;ウインドウの右半分を塗りつぶす stick key,1+2+4+8 ;keyという変数に 押されているキー番号を入力 if key=1:x=x-3 ;keyが1だったらxから3を引いてxに入力 if key=2:y=y-3 ;keyが2だったらyから3を引いてyに入力 if key=4:x=x+3 ;keyが4だったらxから3を足してxに入力 if key=8:y=y+3 ;keyが8だったらyから3を足してyに入力 pos x,y ;x,yの位置に gcopy 2 ;ID2のウインドウから 今の描画先へ画像を転送する if (x+32>150) and (x<300):{ ;当たり判定 pos 0,0 ;文字の位置を0,0に color 255,255,255 ;描画色を白にする print "進入!" ;進入!と表示する } redraw 1 ;一気に描画 await 1 ;待つ loop ;repeatヘ戻る |
これでスピードも遅くなったし ロケットの右端が当たっても 当たり判定される
説明を行こう!
まずif (x+32>150) and (x<300)は前のプログラムとどこが違う?
前のプログラムではx>150となってたね なんで Xに32が足されてるかと言うと
32ってのはこの絵の横幅なんだ つまりこの絵の左側の座標であるxに
この絵の幅である32を足してるってことは この絵の右側の座標ってことなんだ
つまり x+32>150 ってのは この絵の右側が150より大きくなったらってことなんだ
だからif (x+32>150) and (x<300)ってのは
x+32(画像の右側)が150より大きくて さらにxが300より小さかったら
OKってことだ
〜 { と } 〜
それで今回初めてやるのはこれだな
if (x+32>150) and (x<300):{ ;当たり判定 pos 0,0 ;文字の位置を0,0に color 255,255,255 ;描画色を白にする print "進入!" ;進入!と表示する } |
{ と }の説明だ
実はこのプログラムは
if (x+32>150) and (x<300):pos 0,0:color 255,255,255:print "進入!" |
と書いたのと同じ意味になるんだ
{ と } はプログラムを見やすく作るためにあるものなんだ
if a=1:mes "あ" |
と言うプログラムも { と } をつかうとこうなる
if a=1:{ mes "あ" } |
さらに 見やすくするために{}のなかのプログラムは 間隔を1つ多く
とるといい つまり 一回多く「Tab」キーを押すのだ
if a=1:{ mes "あ" } |
オヤブン・・・「今回はむちということで 自分なりに難しく書きました」
とある人・・・「そんなにかわんないような気がするぞ」
オヤブン・・・「そうかな?」
とある人・・・「昔から厳しいんだよ きっと」
オヤブン・・・「そう?」
とある人・・・「僕は あめのほうが 甘くて好き」
オヤブン・・・「お菓子じゃない!」