F#+Erlangで簡単なシューティングゲームを作ってみている

2,948 views

Published on

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,948
On SlideShare
0
From Embeds
0
Number of Embeds
941
Actions
Shares
0
Downloads
4
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

F#+Erlangで簡単なシューティングゲームを作ってみている

  1. 1. F# と Erlang で簡単なゲームを作って みている pocketberserker 2012 年 11 月 24 日
  2. 2. お前誰よ?• 中山 / なかやん / ぺんぎん / @pocketberserker• どこにでもいるふつーのサーガ大学院生• F# / Haskell / Erlang / Scala / TDD / テスト• 関数プログラミング≒私の人生を変えたもの• FSharpx/Scalaz のこんとりびゅーたらしい…
  3. 3. 突然ですが質問です
  4. 4. 突然ですが質問です実用っぽい英単語はどれ?
  5. 5. 突然ですが質問です実用っぽい英単語はどれ? • practical
  6. 6. 突然ですが質問です実用っぽい英単語はどれ? • practical • functional
  7. 7. 突然ですが質問です実用っぽい英単語はどれ? • practical • functional • applicative
  8. 8. 実際
  9. 9. 実際どれも正解
  10. 10. でも○○こわいなのでおとなしく practical な話(?)をします
  11. 11. • 理論理論したことは話せません、たぶん
  12. 12. • 理論理論したことは話せません、たぶん• 突っ込みは随時どうぞ
  13. 13. • 理論理論したことは話せません、たぶん• 突っ込みは随時どうぞ• 本発表に登場する一部物語はそこそこフィク ションです
  14. 14. あるときのこと
  15. 15. あるときのこと「ぺんぎん君、君の技量を測るために作って欲し いものがあるのだが」
  16. 16. 渡された仕様
  17. 17. 渡された仕様• お題は簡単なシューティングゲーム
  18. 18. 渡された仕様• お題は簡単なシューティングゲーム• Win か Mac で動くことが望ましい
  19. 19. 渡された仕様• お題は簡単なシューティングゲーム• Win か Mac で動くことが望ましい• 言語、ライブラリ、フレームワーク、プラッ トフォームすべて自由
  20. 20. だったら関数プログラミングるしか ない!
  21. 21. 当初の選択肢
  22. 22. 当初の選択肢• Unity3D + C# + F# (外部ライブラリ)
  23. 23. 当初の選択肢• Unity3D + C# + F# (外部ライブラリ)• F# + WebSharper
  24. 24. 当初の選択肢• Unity3D + C# + F# (外部ライブラリ)• F# + WebSharper• Scala + Play 2 + 何か
  25. 25. 当初の選択肢• Unity3D + C# + F# (外部ライブラリ)• F# + WebSharper• Scala + Play 2 + 何か• フル Haskell でがんがる
  26. 26. 結局、F# F# したいので F# + WebSharper を選択
  27. 27. F# って?
  28. 28. F# って?• Microsoft が開発したマルチパラダイム言語
  29. 29. F# って?• Microsoft が開発したマルチパラダイム言語• 静的型付け、関数パラダイム主体
  30. 30. F# って?• Microsoft が開発したマルチパラダイム言語• 静的型付け、関数パラダイム主体• Scala より型推論が強力
  31. 31. F# って?• Microsoft が開発したマルチパラダイム言語• 静的型付け、関数パラダイム主体• Scala より型推論が強力• 3.0 がこの前でました
  32. 32. F# の実情?
  33. 33. WebSharperって?
  34. 34. WebSharperって?• 本家曰く “the world’s most versatile web and mobile development framework for .NET”
  35. 35. WebSharperって?• 本家曰く “the world’s most versatile web and mobile development framework for .NET”• F# で書ける
  36. 36. WebSharperって?• 本家曰く “the world’s most versatile web and mobile development framework for .NET”• F# で書ける• JavaScript を書かずに JS の機能が使える
  37. 37. WebSharperって?• 本家曰く “the world’s most versatile web and mobile development framework for .NET”• F# で書ける• JavaScript を書かずに JS の機能が使える• HTML5 などもいける
  38. 38. 例:よくあるゲームループ Unity3D(C#) の例 public class Hoge : MonoBehaviour{ void Update() { hoge(); }}
  39. 39. WebSharper 内でベタ書きすると F# の例 [JavaScript]let rec gameLoop () = async { do hoge() do! Async.Sleep (1000 / fps) do! gameLoop () }
  40. 40. Canvas 使って何か書く [JavaScript]let hogeCanvas width height = let element = Tags.NewTag Canvas [] let canvas = AsCanvasElement element.Dom canvas.Width - width canvas.Height - height let context = canvas.GetContext 2d Async.Start (gameLoop ()) Div [ Width (string width); Attr.Style float:left ] - [ Div [ Attr.Style float:center ] - [ element |! OnMouseMove (fun _ arg - let offset = JQuery.Of(element.Dom).Offset() piyo offset arg.X arg.Y ) ] ]
  41. 41. こんな感じで
  42. 42. こんな感じで• html や JS の知識を仕入れながら書く
  43. 43. こんな感じで• html や JS の知識を仕入れながら書く• F#の知識が少しあればそれなりに書ける
  44. 44. こんな感じで• html や JS の知識を仕入れながら書く• F#の知識が少しあればそれなりに書ける• 副作用云々は、作るもの次第で考えたほうが いいと思う
  45. 45. こんな感じで• html や JS の知識を仕入れながら書く• F#の知識が少しあればそれなりに書ける• 副作用云々は、作るもの次第で考えたほうが いいと思う• ジェネレートされた JS コードは読まないほ うがいい
  46. 46. WebSharper がもっと知りたい型へ
  47. 47. Expert F# 読書会はじめます
  48. 48. 和書 (電子書籍もあるよ)
  49. 49. 閑話休題
  50. 50. あるとき
  51. 51. あるときなかやん「あー、Erlang で何か書きたいなー」
  52. 52. あるときなかやん「あー、Erlang で何か書きたいなー」人物 N「ならゲームのサーバ側 Erlang にすれば?」
  53. 53. あるときなかやん「あー、Erlang で何か書きたいなー」人物 N「ならゲームのサーバ側 Erlang にすれば?」なかやん「そ れ だ」
  54. 54. Erlang とは
  55. 55. Erlang とは• エリクソンが開発
  56. 56. Erlang とは• エリクソンが開発• 並行処理指向、関数型 (?)、動的型付け
  57. 57. Erlang とは• エリクソンが開発• 並行処理指向、関数型 (?)、動的型付け• コンパイル方式 (型の方面ではないけど)
  58. 58. 使用するライブラリ• rebar:ビルドツール• cowboy:軽量ウェブサーバ• jiffy:JSON パーサ
  59. 59. 使用するライブラリ (選定理由)• rebar:ないと始まらない• cowboy:websocket が書きやすそうだった• jiffy:速いっぽい
  60. 60. もっと詳しい話とかvoluntas さんの “継続開発のススメ Erlang/OTP 編” https://gist.github.com/9ee65f0dfa9b7dd78fde
  61. 61. WebSocketウェブサーバとウェブブラウザ間の双方向通信用 の技術規格
  62. 62. 送受信に使う json データ { x : 0, y : 0}
  63. 63. 例:プレイヤー機の座標を送受信 Erlang 側 (初期化部分) websocket_init(_Any, Req, _Opts) - Interval = round(1000 / 30), timer:send_interval(Interval, tick), Req2 = cowboy_req:compact(Req), {ok, Req2, undefined, hibernate}.
  64. 64. 例:プレイヤー機の座標を送受信 Erlang 側 (受信部分) websocket_handle({text, Msg}, Req, _State) - {[{_X, X}, {_Y, Y}]} = jiffy:decode(Msg), {ok, Req, {X, Y}}; websocket_handle(_Any, Req, State) - {ok, Req, State}.
  65. 65. 例:プレイヤー機の座標を送受信 Erlang 側 (更新および送信) websocket_info(tick, Req, {X, Y}) - Data = jiffy:encode({[{x, X}, {y, Y}]}), {reply, {text, Data}, Req, {X, Y}, hibernate}; websocket_info(_Info, Req, State) - {ok, Req, State, hibernate}.
  66. 66. 例:プレイヤー機の座標を送受信 F#側 [JavaScript] let initSocket context = let (|Text|Binary|) (data:obj) = match data with | :? string as text - Text text | binary - Binary (AsArrayBuffer binary) let socket = WebSocket(ws://localhost:19860/shooting) socket.Onopen - (fun () - PlayerShip.init | Json.Stringify | socket.Send ) socket.Onmessage - (fun msg - drawBackground context match msg.Data with | Text text - text | (Json.Parse AsInfo) | draw context | Binary _ - () ) socket
  67. 67. Erlang を使ってみた感想とか
  68. 68. Erlang を使ってみた感想とか• OTP を使えば実装したいことのほうに集中で きる
  69. 69. Erlang を使ってみた感想とか• OTP を使えば実装したいことのほうに集中で きる• 慣れればもっとさくっと書けると思う
  70. 70. Erlang を使ってみた感想とか• OTP を使えば実装したいことのほうに集中で きる• 慣れればもっとさくっと書けると思う• 高階関数あるし関数型なのだろう・ ・・たぶん
  71. 71. ちなみに
  72. 72. ちなみに• Erlang はじめて 3 週間くらいだった
  73. 73. ちなみに• Erlang はじめて 3 週間くらいだった• 基本は飛行機本と web 上にあるサンプルで 学ぶ
  74. 74. ちなみに• Erlang はじめて 3 週間くらいだった• 基本は飛行機本と web 上にあるサンプルで 学ぶ• 後はひたすら書く
  75. 75. 飛行機本
  76. 76. ではデモ・ ・・といきたかったけど 間に合いませんでした orz
  77. 77. まとめ• 手段を目的化して FP を学ぶのもありだと思 います• 自分にあった関数型言語を見つける(当たり 前だけど FP=Haskell ではない)• 気になったら理論へ進む• JavaScript は生成するもの(キリッ
  78. 78. ご清聴ありがとうございました。

×