Your SlideShare is downloading. ×
SUPER MONAO BROS. in Hasell
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

SUPER MONAO BROS. in Hasell

960
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
960
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

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

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