bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Yampaでゲームを定式化する―Haskanoidのオブジェクト

1.動作画面

Haskanoidの操作画面は次のようになっている。
f:id:bitterharvest:20141107133535p:plain

この画面が出てくるまで、インストール時に様々な障害に出会うことと思うが、最も生じやすいエラーは、画像や音声のデータがないと言われることだと思う。Haskanoidはこれらのデータをdata(小文字であることに注意)というディレクトリに含んでいるので、dataのディレクトリを実行ファイルHaskanoidと同じディレクトリに置く必要がある。

2.オブジェクト

パックマンではオブジェクトはパックマン、モンスター、フルーツであったが、Haskanoidではそれはパドル、ブロック、側面である。これらのオブジェクトはデータ型Objectで表される。データ型Objectはレコード構文で定義され、フィールドにName(識別名)、kind(種類)、pos(位置)、vel(速度)、acc(加速度)、dead(消滅)、hit(打撃)を有する。

プログラムの中では次のように記述されている。

data Object = Object {
 objectName             :: ObjectName,
  objectKind            :: ObjectKind,
  objectPos             :: Pos2D,
  objectVel             :: Vel2D,
  objectAcc             :: Acc2D,
  objectDead            :: Bool,
  objectHit             :: Bool,
  canCauseCollisions    :: Bool,
  collisionEnergy       :: Double,
  displacedOnCollision  :: Bool
}

オブジェクトがどのような種類(Haskanoidではパドル、ブロック、側面)であるかを表すデータ型ObjectKindは次のようになっている。

data ObjectKind = 
 Ball    Double – 半径
 | Paddle  Size2D 
 | Block   Energy Size2D
 | Side    Side

2.入力としての衝突

パックマンでは、レバーや衝突が入力となっていた。Haskanoidでも、衝突、キーボード、マウス、Wiiリモコンプラスが入力となる。その中の衝突はデータ型Collisionで定義されている。Collisionは衝突したオブジェクトとその衝突後の速度を対としたリストである。次のように定義されている。

data Collision = Collision { 
collisionData :: [(ObjectName, Vel2D)] } -- ObjectId x Velocity
}

Collisionに対する関数として、衝突を検出するdetectCollision, オブジェクトの重なりを検出するoverlap, 衝突した面を与えるcollisionSide, 衝突後の速度を与えるcollisionResponseObjを用意している。その詳細についてはプログラムを参照して欲しい。