週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Haskellでゲーム1および1.5の続きです。過去ログはカテゴリ:Haskellで。

ゲーム中に現れる多種多様なオブジェクトの更新作業を、一箇所に書かないですむ方法はないか、というのが現在の問題提起です。要求仕様は以下のとおりです。
  • オブジェクトすべてを一様に扱うにはそれらが同じ型でなければいけない。型クラスでなくて完全に同じ型でないとコンテナにつめない。
  • 別々のオブジェクトごとに別々の更新関数を使いたい。そしてその関数は別のファイルで定義されていても問題なく使えるようにしたい。
これをどう扱うのか。私はlethervertさんの http://d.hatena.ne.jp/lethevert/20060618/p2 このへんの表記を思い出しました。オブジェクト指向はクロージャのようです。私のナナメ読みが適切かは知りませんが、クロージャを使えば書けるのではないかと思いました。
書いてみました。とりあえずオブジェクトごとの相互作用とかは無視しています。
data GameScene = GameScene { objects :: [GameNode]}

data GameNode =
    GameNode {
        move :: GameScene -> [Key] ->[GameNode],
        draw :: GameScene -> IO ()
    }
型はこれだけです。一ターンごとの更新とあと画面への描画。更新は決まった間隔で行うことを想定しています。[Key]はキーボード入力です。キーボード入力しか想定していません。 この型を用いた、GameSceneの更新はこんな感じで行います。
updateScene :: [Key] -> GameScene -> GameScene
updateScene keys scene@GameScene{objects=oldobjects} = 
    scene{objects=newobjects} where
        newobjects = concatMap (\q -> update q scene keys) $ oldobjects
さらに、たとえばシューティングゲームの自機が作りたければ次のように書きます。
data Creature = Creature{coord::XY,velocity::XY}
myShip :: Creature -> GameNode
myShip status =
    GameNode{move=moveShip,draw=drawShip} where
        moveShip scene keys = (nextShip:shots) where
                nextShip =myShip status{coord=coord status + newv, velocity=newv}
                newv = (0.4:+0)*(velocity status + accv)
                accv = if moving then (5.4:+0)*(cos dir:+sin dir) else (0:+0)
                (中略 dirをkeyから定義したり弾を作ったりとか)
        drawShip scene = preservingMatrix $ do
                (中略 実は三角を書いただけなのが恥ずかしい)
newMyShip = myShip Creature{coord=0:+0,velocity=0:+0}
結構簡単に書けてしまいました。所詮ステートマシンの更新に過ぎませんが、これが書けるとそのほかいろいろな敵とか弾とか弾幕とか追加したくなります。
このコードは実際作っているコードからコピーしてきたんですが、いくらか省略する過程で間違ったところが出来たかもしれません。何か気がついたらこっそり教えてね。
スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/15-83d10698
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
以前Haskellでクロージャを使って作ったオブジェクト指向は、Types and Programming Languagesにはそのまま載っておりました。車輪のなんとかといわれそうですが、個人的には方向性が間違ってないということがわかっ
2006/08/29(火) 23:57:39 | 揺動散逸日記
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。