敵を踏む



敵を出現させます。ただ飛び跳ねているだけの敵ですが、意外と踏むのは難しいです。
めんどくさいのでマップは使わずにやってます。

#const scx 300		;ウィンドウサイズx
#const scy 300		;ウィンドウサイズy
#const osize 16		;自分の大きさ

	screen 0,scx,scx

	jump=10		;ジャンプ力
	grab=4		;重力(高いほど重力低い)
	gcount=grab	;重力カウンター
	fallmax=15	;最高落下速度
	speed=2		;横移動スピード
	ox=winx-osize/2	;自分位置x
	oy=0		;自分位置y
	omx=0		;左右移動量
	omy=0		;上下移動量
	gos=0		;地上にいるか空中にいるか
	boy=oy		;1ループ前の自分位置y

	egcount=grab	;敵重力カウンター
	ex=250		;敵位置x
	ey=0		;敵位置y
	emx=-2		;敵左右移動量
	emy=0		;敵上下移動量
	egos=0		;敵が地上にいるか空中にいるか

	font "MS ゴシック",osize

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

*drawback	;背景描画
	color : boxf
	return

*drawown	;自分描画
	color 255 : pos ox,oy : mes "●"
	return

*setown		;自分の処理
	boy=oy	;1ループ前の自分位置y

	stick key,5
	if key&1 : omx=-speed
	if key&4 : omx=speed
	if oy=(scy-osize-1) : gos=1 : else : gos=0
	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	;移動
	omx=0	;横移動量を0に戻す

	if ox<0 : ox=0	;画面左端
	if ox>(scx-osize-1) : ox=scx-osize-1	;画面右端
	if oy<0 : oy=0	;画面上端
	if oy>(scy-osize-1) : oy=scy-osize-1 : omy=0	;画面下端

	if ox+2<(ex+osize)&(ex+2<(ox+osize))&(oy+2<(ey+osize))&(ey+2<(oy+osize)) {	;当たり判定
		if boy<(ey-8) : dialog "敵を踏んだ"
	}
	return

*drawenemy	;敵描画
	color ,255 : pos ex,ey : mes "●"
	return

*setenemy		;敵の処理
	if ey=(scy-osize-1) : egos=1 : else : egos=0
	if egos : emy=-jump

	egcount--
	if egos : egcount=0
	if egcount=0 {
		emy++		;下方向移動量+1
		egcount=grab	;カウンターを元に戻す
	}
	if emy>fallmax : emy=fallmax	;最高落下速度に達したらそこまで
	ex+emx : ey+emy	;移動

	if ex<0 : ex=0 : emx=emx*-1	;画面左端
	if ex>(scx-osize-1) : ex=scx-osize-1 : emx=emx*-1	;画面右端
	if ey<0 : ey=0	;画面上端
	if ey>(scy-osize-1) : ey=scy-osize-1 : emy=0	;画面下端
	return

そんなに難しい事はしてないです。当たり判定は、当たった時、その1ループ前の座標が敵より上の位置だったら踏んだ。 という感じです(少し判定は暖和してますが)。
敵の判定は自分と同じような感じです。ただ移動が自動なだけ。

ジャンプ力とかの関係で、2体が貫通する事があります。軌道は当たってるはずなのに当たり判定が生じないというのもあります。
これはキャラが小さすぎ、更に判定暖和のため更に小さくしているためです。


前へ 戻る 次へ