tof2.hsp

sample\obaq\tof2.hsp » Plain Format

#include "obaq.as"

	;	ゲームサンプル
	;	カーソルキーでプレイヤー(大きい丸)を操作し、引っ張られるハンマー(小さい丸)を多角形にぶつけると得点
	;	プレイヤーと多角形がぶつかるとゲームオーバー
	;	ゲームオーバー後にスペースかリターンで再スタート

	title "tof2"

	randomize			; 乱数の初期化
	screen 0, 640, 480	; ウィンドウ初期化

*init
	; 初期化

	qreset								; OBAQの初期化
	qborder -120.0, -60.0, 120.0, 60.0	; 壁の設定
	qgravity 0.0, 0.0					; 重力は無し

	; プレイヤーの移動範囲を設定
	wallmodel = -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0
	qaddmodel wall, wallmodel, -1, 80.0, 60.0, 0.0, 72.0, 54.0, colsw_none, 0x04
	qtype wall, type_bind | type_inner
	qmat wall, mat_wire, 0xffffff

	; プレイヤーを定義
	qaddpoly player, 16, 80.0, 60.0, 0.0, 6.0, 6.0
	qweight player, 36.0 / 8.0, 36.0 * 36.0
	qdamper player, 0.7, 0.0
	qinertia player, 0.995
	qmat player, mat_wire, 0xffffff

	; ハンマーを定義
	qaddpoly hammer, 16, 80.0, 30.0, 0.0, 3.0, 3.0
	qweight hammer, 9.0 / 8.0, 9.0 * 9.0
	qdamper hammer, 0.7, 0.0
	qinertia hammer, 0.995
	qmat hammer, mat_wire, 0xffffff

	; ゲーム進行用の情報を定義
	score = 0
	gameover = 0
	rockCount = 0

*main
	; メインループ

	redraw 0					; 画面の更新を開始

	; 背景描画
	color 0, 0, 0
	boxf

	qexec						; OBAQによるオブジェクトの更新

	stick key, 15				; キーの取得

	; ESCキーで終了
	if key & 128 {
		end
	}

	qgetpos player, px, py, pr	; プレイヤー位置を取得

	; ハンマーが衝突した多角形を、一定時間後に消滅させる
	qfind 2, stat_active
	qnext tmprock
	while tmprock >= 0
		qgetuser tmprock, damage, dummy1, dummy2
		if damage > 0 {
			qmat tmprock, mat_wire, 0xffffff - 0x111111 * damage	; 消えかけている色に
			damage ++
		}
		quser tmprock, damage
		if damage >= 16 {
			qdel tmprock	; 消滅
		}
		qnext tmprock
	wend

	; ゲーム続行中の処理
	if gameover = 0 {
		qblast px, py, -0.01	; プレイヤーの位置へ、物体は緩やかに引き寄せられる

		; カーソルキーでプレイヤーを操作
		pax = 0.0
		pay = 0.0
		par = 0.0
		qgetspeed player, psx, psy, psr
		if key & 1 {
			if psx < 0.0 {
				pax = -(0.5 + psx) * 0.05	; 限界速度に近づくほど、加速は小さくなる
			} else {
				pax = -0.5 * 0.05			; ブレーキの効きは一定
			}
		}
		if key & 4 {
			if psx > 0.0 {
				pax = (0.5 - psx) * 0.05
			} else {
				pax = 0.5 * 0.05
			}
		}
		if key & 2 {
			if psy < 0.0 {
				pay = -(0.5 + psy) * 0.05
			} else {
				pay = -0.5 * 0.05
			}
		}
		if key & 8 {
			if psy > 0.0 {
				pay = (0.5 - psy) * 0.05
			} else {
				pay = 0.5 * 0.05
			}
		}
		qspeed player, pax, pay, par

		; ハンマーをプレイヤーに近づけるゴム状のワイヤー
		qgetpos hammer, hx, hy, hr
		qspeed hammer, (px - hx) / 4096.0, (py - hy) / 4096.0, 0.0

		; プレイヤーと多角形が衝突したらゲームオーバー
		qcollision player
		qgetcol tmprock, dummyX, dummyY
		while tmprock >= 0
			qgetuser tmprock, damage, dummy1, dummy2
			if damage = 0 {
				gameover = 1
			}
			qgetcol tmprock, dummyX, dummyY
		wend

		; ハンマーと多角形が衝突したら、多角形の消滅カウントを開始する
		qcollision hammer
		qgetcol tmprock, dummyX, dummyY
		while tmprock >= 0
			qgetuser tmprock, damage, dummy1, dummy2
			if damage = 0 {
				quser tmprock, 1
				score ++
			}
			qgetcol tmprock, dummyX, dummyY
		wend

		; 時間経過で多角形が出現
		if rockCount <= 0 {
			size = 8.0 + rnd(8)
			qaddpoly tmprock, 3 + rnd(4), -size + rnd(2) * (160.0 + size * 2.0), size + 2.0 + rnd(116.0 - size * 2.0), rnd(256) * M_PI / 256.0, size, size, colsw_active, 0x02, 0x04, 0x05

			if tmprock >= 0 {
				weight = size * size / 16.0
				qweight tmprock, weight, weight * size * size / 2.0
				qdamper tmprock, 0.5, 1.0
				qinertia tmprock, 1.0
				quser tmprock, 0
				qmat tmprock, mat_wire, 0xffffff
	
				; 次の多角形出現までの間隔を設定(20点以降は変わらず)
				rockCount = 180 - score * 6
				if rockCount < 60 {
					rockCount = 60
				}
			}
		}
		rockCount --
	} else {
		; ゲームオーバー後はスペースかリターンで再スタート
		if key & 48 {
			goto *init
		}
	}

	qdraw 1					; オブジェクトの描画

	color 255, 255, 255		; 文字色を設定
	font msgothic, 16		; 文字フォントを設定

	; スコアを表示
	pos 8, 4
	mes "score : " + score

	if gameover {
		; ゲームオーバーの文字を表示
		pos 320 - 9 * 4, 240 - 8
		mes "game over"
	} else {
		; プレイヤーとハンマーを結ぶワイヤーを描画
		qgetpos hammer, hx, hy, hr
		qcnvaxis hx, hy, hx, hy
		qcnvaxis px, py, px, py
		line hx, hy, px, py
	}

	redraw 1		; 画面の更新を終了
	await 12		; 一定時間待つ

	goto *main