#define WIN_W 640		;ウィンドウの幅
#define WIN_H 480		;ウィンドウの高さ
#define CHAR_W 40		;自機や敵の幅
#define CHAR_H 40		;自機や敵の高さ

;--------------------変数の初期化------------------
	char_x=WIN_W/2 : char_y=WIN_H-50	;キャラクタの初期位置
	dx=4 : dy=4				;自機の移動量

	randomize				;乱数初期化
	enemy=8
	dim enemy_x,enemy : dim enemy_y,enemy	;敵の初期位置の変数
	dim enemy_dx,enemy : dim enemy_dy,enemy	;敵の移動量
	;敵の初期位置、移動量を乱数で決定
	repeat enemy
		rnd enemy_x.cnt,WIN_W-CHAR_W
		rnd enemy_y.cnt,WIN_H/2
		rnd kari,11 : enemy_dx.cnt=kari-5
		rnd kari,11 : enemy_dy.cnt=kari-5
	loop
	
;--------------------画面の準備------------------
	buffer 2,CHAR_W,CHAR_H*2,0 : cls 4
	font "MS ゴシック",CHAR_H
	color 255,255,255 : mes "▲"				;自機
	color 220,220,0 : mes "◆"		;敵

	screen 0,WIN_W,WIN_H,0,0,0
	cls 4

	gmode 2				;黒(0,0,0)をすかして表示

;--------------------メインループ------------------
*main_loop
	await 10

	gosub *my_move			;自機移動
	gosub *enemy_move		;敵移動
	gosub *hantei			;あたり判定
	gosub *draw			;表示

	goto *main_loop


;--------------------サブルーチン------------------

;--------------------自機移動------------------
*my_move
	stick a,15			;これで、十字キーの押しっぱなしの判定ができる(1+2+4+8=15)

	if a&1 : char_x-=dx		;左
	if a&2 : char_y-=dy		;上
	if a&4 : char_x+=dx		;右
	if a&8 : char_y+=dy		;下

	;ウィンドウからはみ出ないかを判定
	if char_x<0 : char_x=0
	if char_y<0 : char_y=0
	if char_x>(WIN_W-CHAR_W) : char_x=(WIN_W-CHAR_W)
	if char_y>(WIN_H-CHAR_H) : char_y=(WIN_H-CHAR_H)
	return

;--------------------敵移動------------------
*enemy_move
	repeat enemy
		enemy_x.cnt+=enemy_dx.cnt
		enemy_y.cnt+=enemy_dy.cnt
		if (enemy_x.cnt < 0)|(enemy_x.cnt > (WIN_W-CHAR_W)) : enemy_dx.cnt=-enemy_dx.cnt
		if (enemy_y.cnt < 0)|(enemy_y.cnt > (WIN_H-CHAR_H)) : enemy_dy.cnt=-enemy_dy.cnt
	loop
	return
;--------------------あたり判定------------------
*hantei
	repeat enemy
		if (char_x+(CHAR_W*3/4) >enemy_x.cnt)&(enemy_x.cnt+(CHAR_W*3/4) > char_x) {
		if (char_y+(CHAR_H*3/4) >enemy_y.cnt)&(enemy_y.cnt+(CHAR_H*3/4) > char_y) {
			dialog "MISS!!"
			end
		}}
	loop
	return
;--------------------表示------------------
*draw
	redraw 0
	color 0,0,0
	boxf 0,0,WIN_W,WIN_H			;全画面を塗りつぶす

	;自機の表示
	pos char_x,char_y
	gcopy 2,0,0,CHAR_W,CHAR_H
	;敵の表示
	repeat enemy
		pos enemy_x.cnt,enemy_y.cnt
		gcopy 2,0,CHAR_H,CHAR_W,CHAR_H
	loop
	redraw 1
	return
前段階から変わったのは、メインループの中に判定のサブルーチンを呼び出す部分。 それと、判定用のサブルーチンができただけです。
判定の仕方は、自分で図を書いて考えてみてください。x(横)方向だけヒントを言うと ifのはじめの判定は、自機が左で、敵が右、後の方は、敵が左で自機が右の場合の 判定を行っています。敵、自機ともに、外側1/4は無視するように判定しています。 この辺は画像とも相談して判定を決めてみてください。(これでも自機の右まえ、 左前はあたり判定がシビアです、▲だからしょうがないのですが(^^;)
■ 目次へ戻る ■

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル