三十歩目 当たり判定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 "あ"
	}

 
 
     オヤブン・・・「今回はむちということで 自分なりに難しく書きました」
     とある人・・・「そんなにかわんないような気がするぞ」
     オヤブン・・・「そうかな?」
     とある人・・・「昔から厳しいんだよ きっと」
     オヤブン・・・「そう?」
     とある人・・・「僕は あめのほうが 甘くて好き」
     オヤブン・・・「お菓子じゃない!」

戻る コウザへ ホームへ 次へ