SUPER MONAO BROS. in Hasell

1,131 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,131
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • SUPER MONAO BROS. in Haskell という題で話させていただきます、mokeheheといいます。よろしくおねがいします。
  • SUPER MONAO BROS. in Hasell

    1. 1. SUPER MONAO BROS. In Hakskell mokehehe '09/05/04
    2. 2. SUPER MONAO BROS.とは? <ul><li>Haskell で書いた横スクロールジャンピングアクションゲームの習作
    3. 3. 画面描画: SDL
    4. 4. サウンド: SDL-mixer </li></ul>
    5. 5. 動作デモ git://github.com/mokehehe/monao.git
    6. 6. Haskellでゲーム製作 <ul><li>(1) ゲームループ
    7. 7. (2) 登場するオブジェクトをどう保持するか? </li></ul>
    8. 8. (1) ゲームループ <ul><li>1/60秒ごとにキーの状態を調べてゲームの状態を更新、画面を描画する
    9. 9. IOで扱う? </li><ul><li>処理が細切れになってしまうのが嬉しくない </li></ul></ul>gameLoop :: IO () gameLoop g = do k <- getKeyState let (g', scr) = updateGame g k delay $ 1000 `div` 60 scr gameLoop g'
    10. 10. unsafe InterleaveIO <ul><li>遅延リストが作れる
    11. 11. キー入力側:1/60秒ごとにキー入力を調べて無限リストを返す </li></ul>getKeyList :: IO [KeyState] getKeyList = unsafeInterleaveIO $ do k <- getKeyState delay $ 1000 `div` 60 ks <- getKeyList return $ k:ks
    12. 12. ゲーム処理側 <ul><li>キー状態の無限リストを受け取って、画面描画コマンド(アクション)のリストを返す </li></ul>updateGame :: [KeyState] -> [IO ()] getKeyList >>= return . updateGame >>= sequence_
    13. 13. (2) ゲームに登場するオブジェクト <ul><li>敵とかゲーム中に登場するオブジェクトををどうやって管理するか
    14. 14. OOPでよくやる方法: </li></ul>struct Actor { virtual update() = 0; virtual render() = 0; }; list<Actor*> actors;
    15. 15. 代数的データ型を使う? <ul><li>Haskellのリストには同じ型のものしかいれられない
    16. 16. 代数的データ型を使う? </li></ul>data Actor = Kuribo | Noknonoko | ...
    17. 17. 処理が分散してしまう <ul><li>オブジェクトそれぞれの処理をソース上でバラバラに書かないといけない </li></ul>update :: Actor update Kuribo = ... update Nokonoko = ... render :: Actor render Kuribo = ... render Nokonoko = ...
    18. 18. 存在型を使ってまとめる <ul><li>存在型を使ってまとめることができる </li></ul>data ActorWrapper = forall a. Actor a => ActorWrapper a updateActors :: [ActorWrapper] -> [ActorWrapper] updateActors = map ((ActorWrapper x) -> ActorWrapper $ update x) class Actor a where update :: a -> a instance Actor Kuribo where update self = ... http://d.hatena.ne.jp/keigoi/20080805/p2
    19. 19. まとめ <ul><li>Haskellでゲームを作るのは簡単だよ
    20. 20. ご清聴ありがとうございました </li></ul>

    ×