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