キャラクターアニメーション



ジャンプアクションに限ったものではないですが、キャラクターのアニメーションをさせてみようと思います。
またこれまでの●と四角形でかいたのでは味気ないので、画像も使用してみます。

←のような画像を上から順番に表示させることでアニメーションさせます。
ただこれは回転するだけで、移動している方向を向くようにはなっていません。
キャラクターの動きやメインアルゴリズムには殆ど手を加えていませんので、その辺は無視していて結構です。

このスクリプトと画像のセットです。

Download(jump_5.lzh 3KB)
←あまり回転してるように見えないかも…。

#const scy 300		;ウィンドウサイズy
#const osize 18		;自分の大きさ
#const tipsize 20	;1マスの大きさ
#const tipx 30		;マスの数x
#const tipy 15		;マスの数y
#const scx 300		;ウィンドウサイズx
#const animax 8		;キャラクターアニメーション画像数

	randomize

	buffer 4,tipsize,tipsize	;マップチップ画像用
	color 192,96 : boxf
	color 64,32 : boxf 1,1
	color 128,64 : boxf 1,1,tipsize-2,tipsize-2

	buffer 3,20,160	;キャラクター画像用
	picload "chara.bmp",1

	buffer 2,tipx*tipsize,scy	;背景画像用
	repeat scy
		rev=scy-cnt-1
		color cnt*255/(scy-1),cnt*255/(scy-1),255
		boxf 0,rev,winx,rev	;上から下に進むにつれ青くなるように線を描画
	loop
	dim map,tipx,tipy	;マップデータ
	repeat tipx	;ランダムでマップ作成
		c=cnt
		rnd high,5 : high++
		repeat high,1
			c2=tipy-cnt
			map.c.c2=1		;1で移動不可能場所
			pos c*tipsize,c2*tipsize
			gcopy 4,0,0,tipsize,tipsize	;マップチップを描画
		loop
	loop

	screen 0,scx,scx

	jump=6		;ジャンプ力
	grab=4		;重力(高いほど重力低い)
	gcount=grab	;重力カウンター
	fallmax=15	;最高落下速度
	speed=2		;横移動スピード
	stps=winx-osize/2;スクロールを止める位置
	ox=stps		;マップ全体から見た自分の位置x
	oax=ox		;自分位置x
	oy=0		;自分位置y
	omx=0		;左右移動量
	omy=0		;上下移動量
	gos=0		;地上にいるか空中にいるか
	bsx=0		;背景スクロール数

	aniframe=6	;アニメーションで次の画像に変わるまでのフレーム数
	anino=0		;キャラクターアニメーション画像No
	anicount=0	;キャラクターアニメーションカウント

	font "MS ゴシック",osize

*mainloop	;メインループ
	redraw 0
	gosub *drawback
	gosub *setown
	gosub *drawown
	redraw
	await 1
	goto *mainloop

*drawback	;背景描画
	pos 0,0 : gcopy 2,bsx,0,winx,winy
	return

*drawown	;自分描画
	gmode 2

	color 255 : pos oax,oy
	gcopy 3,0,anino*osize,osize,osize
	anicount++
	if anicount=aniframe {
		anino++
		if anino=animax : anino=0
		anicount=0
	}

	gmode 0
	return

*setown		;自分の処理
	olp=ox/tipsize		;移動前のマップ上の位置を保存(左)
	orp=ox+osize-1/tipsize	;右
	otp=oy/tipsize		;上
	obp=oy+osize-1/tipsize	;下

	obp2=oy+1+osize/tipsize
	if map.olp.obp2|map.orp.obp2 : gos=1 : else : gos=0	;地上にいるか空中にいるか

	stick key,5
	if key&1 : omx=-speed
	if key&4 : omx=speed
	if key&16 : if gos : omy=-jump

	gcount--
	if gos : gcount=0
	if gcount=0 {
		omy++		;下方向移動量+1
		gcount=grab	;カウンターを元に戻す
	}
	if omy>fallmax : omy=fallmax	;最高落下速度に達したらそこまで
	ox+omx : oy+omy	;移動

	if ox<0 : ox=0	;画面左端
	if ox>(tipx*tipsize-osize-1) : ox=tipx*tipsize-osize-1	;画面右端
	if oy<0 : oy=0	;画面上端

	if omx<0{
		olp2=ox/tipsize
		if olp2!=olp {
			otp2=oy/tipsize
			obp2=oy+osize-omy/tipsize
			if map.olp2.otp2|map.olp2.obp2 : ox=olp*tipsize
		}
	}
	if omx>0 {
		orp2=ox+osize/tipsize
		if orp2!=orp {
			otp2=oy/tipsize
			obp2=oy+osize-omy/tipsize
			if map.orp2.otp2|map.orp2.obp2 : ox=orp2*tipsize-osize-1
		}
	}
	omx=0	;横移動量を0に戻す

	if omy<0{
		otp2=oy/tipsize
		if otp2!=otp {
			olp2=ox/tipsize
			orp2=ox+osize/tipsize
			if map.olp2.otp2|map.orp2.otp2 : oy=otp*tipsize : omy=0
		}
	}
	if omy>0 {
		obp2=oy+osize/tipsize
		if obp2!=obp {
			olp2=ox/tipsize
			orp2=ox+osize/tipsize
			if map.olp2.obp2|map.orp2.obp2 : oy=obp2*tipsize-osize-1 : omy=0
		}
	}

	if ox<stps {
		oax=ox : bsx=0
	} else {
		if ox>(tipx*tipsize-stps-osize) {
			oax=ox-(tipx*tipsize-scx) : bsx=tipx*tipsize-scx
		} else {
			oax=stps : bsx=ox-stps
		}
	}
	return

主な変更としては、はじめにキャラクター画像用のバッファウィンドウを用意したり、 背景用マップチップの描画、背景描画、そしてキャラクター描画の*drawownサブルーチンが変更されています。
キャラクター画像は普通にbufferで作成した仮想スクリーンにpicloadしただけです。
マップチップ(bufferID:4)は全てboxfで、少しブロック的に見えるように描いてます。 背景描画では、なんか空っぽく見えるように青→白へとだんだん色を変えながら線を描画して空みたいなのを描いて、 その上にマップチップ画像を並べています。

結構「ジャンプアクションゲーム」っていう風になったんじゃないでしょうか、見た目だけ。
ここに敵を出現させればそれなりになるかも…。


前へ 戻る