勝手に歩くキャラクター



RPGで、街の人が止まっているのではなんか面白くないので、キャラクターに勝手に歩いてもらいましょう。
またランダムとか使いまくってますが。

;勝手に歩いているキャラクター

#const tipsize 20		;マップチップのサイズ
#const movefreq tipsize/4	;移動時に何ループで行くか(サイズを割りきれるように)
#const movelong tipsize/movefreq;一歩の長さ
#const tipmax 20

#define ch 5	;キャラクターの数
#define max 100	;カウントの最大値
#define small 50;カウントの最小値

randomize	;乱数の初期化

	dim chmvflg,ch	;キャラの移動フラグ
	dim chcnt,ch	;次の移動までのカウント
	dim chpx,ch	;キャラクターのマップチップで数えたx座標
	dim chpy,ch	;キャラクターのマップチップで数えたy座標
	dim chx,ch	;キャラクターのx座標
	dim chy,ch	;キャラクターのy座標
	dim chmvx,ch	;一回の移動量x
	dim chmvy,ch	;一回の移動量y
	dim chmvcnt,ch	;移動回数のカウント

	repeat ch	;各キャラクターの初期位置をランダム決定
		cnt2=cnt
		rnd chpx.cnt,tipmax
		rnd chpy.cnt,tipmax
		re=0
		repeat cnt
			if (chpx.cnt=chpx.cnt2)&(chpy.cnt=chpy.cnt2) : re=1 : break	;もしその場に他のキャラがいたらやり直す
		loop
		if re=1 : continue cnt
		chx.cnt=chpx.cnt*tipsize
		chy.cnt=chpy.cnt*tipsize

		rnd chcnt.cnt,max-small	;カウンターの初期数値もランダム指定
		chcnt.cnt+small
	loop

	screen 0,tipsize*tipmax,tipsize*tipmax

*mainloop	;メインループ
	redraw 0
	gosub *drawmap
	gosub *character
	redraw
	await 1
	goto *mainloop

*drawmap	;マップ描画ルーチン
	color ,255 : boxf	;またも緑で塗りつぶし
return

*character	;キャラクター関係ルーチン
	repeat ch
		cnt3=cnt
		if chmvflg.cnt=0 {
			if chcnt.cnt=0 {
				repeat
					cnt2=cnt
					rnd course,4	;移動する方向
					if course=0 {	;左方向
						if chpx.cnt3=0 :break	;マップの端だったら移動しない
						arrx=chpx.cnt3-1		;移動先のx座標
						arry=chpy.cnt3		;移動先のy座標
						chmvx.cnt3=-movelong	;移動量x
						chmvy.cnt3=0		;移動量y
					}
					if course=1 {	;上方向
						if chpy.cnt3=0 :break
						arrx=chpx.cnt3
						arry=chpy.cnt3-1
						chmvx.cnt3=0
						chmvy.cnt3=-movelong
					}
					if course=2 {	;右方向
						if chpx.cnt3=(tipmax-1) :break
						arrx=chpx.cnt3+1
						arry=chpy.cnt3
						chmvx.cnt3=movelong
						chmvy.cnt3=0
					}
					if course=3 {	;下方向
						if chpy.cnt3=(tipmax-1) :break
						arrx=chpx.cnt3
						arry=chpy.cnt3+1
						chmvx.cnt3=0
						chmvy.cnt3=movelong
					}
					bflg=0
					repeat ch
						if cnt=cnt3 : continue
						if (chpx.cnt=arrx)&(chpy.cnt=arry) : bflg=1 : break	;移動先に他のキャラがいたら移動しない
					loop
					if bflg=1 : break
					chmvcnt.cnt3=movefreq	;移動カウンター
					chmvflg.cnt3=1		;移動フラグをONにする
					chpx.cnt3=arrx		;移動先の座標へx
					chpy.cnt3=arry		;移動先の座標へy
					break
				loop
				rnd chcnt.cnt,max-small	;カウンターを再設定
				chcnt.cnt+small
			}
			chcnt.cnt--
		}
		if chmvflg.cnt=1 {
			chx.cnt+chmvx.cnt	;移動x
			chy.cnt+chmvy.cnt	;移動y
			chmvcnt.cnt--
			if chmvcnt.cnt=0 : chmvflg.cnt=0	;カウンターが0になったら移動終了
		}
		font "",tipsize : color 255 : pos chx.cnt,chy.cnt : mes "●"
	loop
return

もっとちゃんとコメント付けた方が良かったかな?
ただ移動に関しては、自分の移動のときと同じで、それを配列にしただけのものですので、ある程度理解できるかと思います。
キャラクター一人一人にカウンターを持たせて、0になったキャラクターが移動する。そのカウンターをランダムにする事でばらつきのある動きをする。
という事ぐらいしか説明のしようが無いですね…。もっと簡単な方法が絶対ありますね。とりあえずこれは一つの手なので…。
ちなみにここでは#constと#defineの両方を使っていますが、気分です。はじめは#constの方がいろいろ機能があっていいかなとか思ったけど、 もうどっちでもいいやって考えてしまったので。それにどっちかというと#defineの方が使いなれているので。


前へ 戻る 次へ