#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 *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
;--------------------表示------------------
*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
自機だけより少し長くなりました(^^;
まずは変数の初期化の部分です。敵の数、位置、移動量を決めます。 このときの決め方で敵の動きが変わってくるわけです。ここでは余りこだわらないので 乱数で決めてしまいました。ちなみに移動量の乱数で0〜10までを発生させて 5を引いているので、結果的にー5〜5までの乱数を発生させたのと同じ事になります。
画面の初期化では、バッファーのサイズを敵の分大きくしました。 これは縦でも横でも自由です。今回はmesで書いているので縦にのばしました。
メインループには、敵の移動のサブルーチンを加えるだけです。
敵の移動のサブルーチンはここではこだわりませんので単純です。 画面からはみ出そうになると、移動量を反転して、画面の外にでないようにしています。
表示のサブルーチンでは、敵の表示加えただけです。
■ 目次へ戻る ■

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル