Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

自由ゲーム運動とあれこれ

1,417 views

Published on

Boost.勉強会 大阪#16で発表したスライドです
https://sites.google.com/site/boostjp/study_meeting/study16

補足記事
http://qiita.com/mrdagon/items/e54223f3895f281a6beb

Published in: Software
  • Be the first to comment

自由ゲーム運動とあれこれ

  1. 1. 自由ゲーム運動と 描画ライブラリSDX等 の紹介 Boost.勉強会 大阪#16
  2. 2. 軽く自己紹介 ● 名前 植村 ● HN (´・@・) ● 自由ゲーム作者 – 自由ソフトウェア財団 賛助会員 ● 趣味でC++をやってる – 2Dゲーム制作、RTSが中心 – コンテストとか出してたり – Advent calendarに去年参加 – 仕事は電子機器の設計とか、Cとか
  3. 3. 初参加です(要出典)
  4. 4. 知り合いいないし、発表するか! みたいなノリ
  5. 5. 作ったゲーム ● ロマサガ3のミニゲームのようなゲーム
  6. 6. 作ったゲーム ● DTDのようなゲーム
  7. 7. 作ったゲーム ● 経営戦略シミュレーションゲーム
  8. 8. 発表内容 ● 自由ソフトウェア運動とは ● 自由ゲーム運動とは ● 自由ゲーム運動の内政 ● 自由ゲーム運動の外交 ● 自由ゲーム運動の未来
  9. 9. ※ Boostの話はありません
  10. 10. ※ C++の話も殆どありません
  11. 11. 自由ソフトウェア運動とは? ● 共益を目的とした社会運動 – ソフトウェアユーザーの自由を守る ● リチャード・マシュー・ストールマン – アメリカ人、61歳 – GNUを1983年に開発開始 – 非営利団体 フリーソフトウェア財団を創設 – 興味のある人は彼の伝記を読もう
  12. 12. 自由ソフトウェア運動 ● 4つの基本自由 – 0,好きな目的でプログラムを動かす自由 – 1,動作を調べ、必要に応じて改変できる自由 – 2,身近な人を助けるためコピーを配布できる自由 – 3,改変したバージョンを再配布できる自由 ● コミュニティの重要性 – ソースがあっても実際問題、改変出来ない – コミュニティに提案して修正されるなら自由 – お金を出してカスタマイズが出来れば自由
  13. 13. フリーソフトウェア財団の活動 ● 自由なソフトウェアの普及活動 – GNU/LinuxやEmacs、GCCなどの開発 – GNU宣言などの文書公開 ● ライセンス関連 – GPLの啓蒙、GPL違反の是正 ● 政治活動 – デジタル制限管理、ソフトウェア特許の批判 – 政府や企業による監視エンジンへの批判
  14. 14. GNU General Public License ● コピーレフト – 同じライセンスを適用する事をライセンスにする – GPLには波及効果がある ● ソフトウェアの4つの自由を保証 – 改変版も自由になる – 著作権が有効な間は自由
  15. 15. 個人や協賛企業の活動 ● 自由ソフトウェアの開発 – 個人での開発やバグレポートなど ● 財団への寄付やグッズの購入 – Googleも寄付している ● 自由ソフトウェア運動の啓蒙 – GPLの普及活動、FSFの活動の紹介 – 不買運動とかDRM批判とか – TPOを無視すると逆効果
  16. 16. 個人の活動 ● 理念に賛同しない人も多い(GNU公式より) – 好きなソフト作るのが楽しいから – 自由な理想の世界を作るため – ユーザーにちやほやされたい – プログラマーとしての名声を得るため – コミュニティーに参加したいから – 教育のため – 自由ソフトウェアへの感謝 – マイクロソフトへの憎悪(今日の敵はApple) – 金!金!金!
  17. 17. よくある誤解 ● フリーは自由であり、無料ではない – 「ビール飲み放題(free beer)」ではなく – 「言論の自由(free speech)」 – 日本語だと分かりやすい ● 商業を否定している – 配布で開発資金を得る – サポートで開発資金を得る – カスタマイズで開発資金を得る – 寄付で開発資金を募る – 道徳的に問題無いなら商業活動は寧ろ推奨
  18. 18. よくある誤解 ● 原理主義的? – すべてのコードをGPLにしろとか言ってない – 結構妥協している – 短いコードは緩いライセンスを推奨したり – 不自由なソフトが必要悪な場合もありうる ● ソフトウェア以外も自由? – 辞書や教科書やレシピは自由であるべき – 小説や論説、エンターテイメントは別 – アート等の改変の許可は作者の裁量を尊重 – DRMには反対、配布は自由に
  19. 19. よくある誤解 ● オープンソースとの混同 – 用語としては1998年に登場 – 自由と無料の混同を避ける目的 – マーケティングとしての目的 – 企業の経済活動としての性質が強い – 便利なソフトウェアを作るのが目的 – 共通する所も多い – この辺りは歴史的な経緯があってややこしい ● リチャードマン伝記11章に詳しい
  20. 20. 自由ゲーム運動
  21. 21. 自由ゲーム運動とは ● 創始者 私です ● 社会運動としては今日から活動 – コード公開してたのは5年ぐらい前から – libre gamesとは別 – コミュニティの共益が目的 – 政治的要素はあんまりない ● 現在の活動内容 – コピーレフトなライブラリを開発 – コピーレフトなゲームを開発 – 自由ゲーム運動の啓蒙活動
  22. 22. なぜ社会運動なのか? ● 趣味でゲーム開発する不毛さ – 1から数万行のコードを個人で毎回実装する – 趣味で開発期間3年とか – 完成させるの1割とか言われている ● インディーズや同人 – 数人のサークルで独立している – 小さいコミュニティが点在している感じ – 2~3割ぐらいのロイヤリティでDL販売
  23. 23. 基本方針 ● 4つの権利 – バイナリではなくコードを見て勉強する権利 – 既存のコードから派生物を作る権利 – コードがどのように改変されたか知る権利 – 派生元がクレジットされる権利 ● ライブラリを中心としたコミュニティを形成 – 開発者コミュニティやレビューサイト – コードを探しやすくする – コードを広めやすくする
  24. 24. コミュニティの内政 ● コミュニティを形成する – 自由なライブラリを中心として開発者を繋ぐ ● インフラの整備 – 自由なライブラリ、ドキュメント ● モラルの向上 – 雰囲気を良くし、違反行為が起こらないように
  25. 25. コミュニティの形成 コピーレフトなライブラリ
  26. 26. コミュニティを形成するには? ● 古来より開発ツールがコミュニティの中心 – RPGツクールシリーズ – ファーレントゥーガ – カードワース – ウディタ – Nスクリプター – 吉里吉里 – 最近だとUnityとかUE4 – HSP – DXライブラリ
  27. 27. コミュニティの性質 ● 専用開発ツール – ジャンルが近くなる分、趣味が合いやすい – コミュニティ内ではスキルを共有しやすい ● ツクールのRGSSとか ● ノベル系は隠す部分が無い – 同じツールを使っているかが分かりやすい ● 仲間意識が芽生えやすい – コミュニティが成立しやすい
  28. 28. コミュニティの性質 ● プログラム派 – ジャンルがバラバラで趣味が合いにくい – スキルのばらつきが激しく共有しにくい ● C派、C++派、C#派、D派、etc ● 手続き型、オブジェクト指向 ● C++03勢、C++11勢、C++14勢 – 同じライブラリを使っているか分かりにくい ● 仲間意識みたいなのが無い – コミュニティが成立しにくい
  29. 29. 共有することを前提に ● GPLのライブラリ – コードが共有される – ある程度流用出来るので楽、勉強もしやすい – スキルが底上げされる – 色々利点がある – 協力的なコミュニティになる
  30. 30. GPLだと儲からない そしたら開発者がいなくなるのでは?
  31. 31. 影響は無い ● 普通のソフトウェアの場合 – ソースとバイナリを配布する – コピーが配布される – あまり儲からない事がある ● ゲームソフトの場合 – ソースとバイナリを配布する – 画像データ、音楽、シナリオなどは別ライセンス – コードが公開されても、コピーは配れない – 頒布価格に影響が無い上、開発費は下がる – 全体のレベルが上がって、他の娯楽産業より優位に
  32. 32. 寧ろ有利になる場合 ● プログラムがややこしいゲーム – 戦略SLGとか滅多に新作が出ない – 技術公開したら、開発者が増えてジャンルになる – 単体作品からジャンルのファンになる – コミュニティになる ● 人気のある優れたゲーム – 派生作品により、オリジナルが定期的に広報される – オリジナルの知名度がさらに上がる – コード公開されてなくてもよくある
  33. 33. インフラの整備 自由なライブラリとドキュメント
  34. 34. SDXフレームワーク Ver0.09 ● 自由ゲームのライブラリ – C++11 – マルチプラットフォーム対応 – 日本語ドキュメント完備 ● 開発期間18ヶ月程(二回、再設計) – 元々DXライブラリのラッパーとして開発 – マルチプラットフォームのため内部をSDLに – SDL + DXライブラリで SDX ● ライセンス – zlib→AGPL Ver3
  35. 35. 参考にしたライブラリ ● DXライブラリ – 開発者 山田 巧さん – 2001年に公開、10年以上開発が安定している – Cっぽい、C++ – C++以外のラッパーもいくつか存在する – Windows専用 – 2Dと3Dの基本的な機能が揃っている – 公式ドキュメントが日本語 – 機能分割の粒度と命名規則を参考にした
  36. 36. 内部で使っているライブラリ ● Simple DirectMedia Layer – 開発者 Sam Lantinga さん 他 – Steamで有名なValveに勤務してるらしい – 1998年に公開、去年2.0になって使いやすく – 色んなOSに対応 – 別言語でバインディングしたいのでC – 機能はシンプル、3Dや動画再生機能はない – 補助ライブラリがいくつかある – 日本語の情報は少なめ
  37. 37. SDXの概要 ● マルチプラットフォーム – Windows、GNU/Linux、MacOSX、Android – iOSでも動くがライセンス的に配布が難しい ● 環境 – MSVC最新版、Clang3.3に対応 – gccは規格準拠の関係で非対応 – Emscriptenとかは調べてない
  38. 38. 基本設計 ● マルチメディア機能 – SDLを使いやすくした部分、描画とか再生とか ● フレームワーク機能 – マルチメディア機能の補助 – 使わなくても良い ● ユーティリティ機能 – ファイル入出力とかシングルトンな乱数生成関数 – 使わなくても良い
  39. 39. マルチメディア機能 ● 基本的な機能 – ライブラリの初期化 – ウィンドウの表示と設定 – 図形、画像、フォント等の描画 – 音声の再生 – マウスやキーボード、タッチ操作
  40. 40. フレームワーク機能 ● 描画補助 – 画像の分割読み込み – ビットマップフォント – 2D用カメラ ● 図形 – 点、線、矩形、円、複合図形 – ダブルディスパッチによる当たり判定 – boost::geometoryは使ってない
  41. 41. フレームワーク機能 ● 2D描画ポリシー – アニメーション – メッセージ枠 – タイルマップ – 拡張可能 ● 2Dモデル – 図形と描画ポリシーをテンプレートパラメータに ● 場面管理 – シーンのインターフェース – 具体的な実装はなし
  42. 42. 拡張性 ● シーンの考え方 – RPGとアクションゲーム – 会話シーンや場面転換エフェクトは似た感じ – 共通のインターフェースだと使い回しやすい ● 汎用シーンは微妙 – Object型の派生クラスのコンテナを持ったクラス – アップキャストが必要になるので微妙 – STGだと、味方、敵、自弾、敵弾、得点アイテム – 当たり判定の組み合わせとかで困る
  43. 43. コード例
  44. 44. //画像を描画する bool SampleImage() { using namespace SDX; System::Initialise("sample", 600, 400); Image image("image.jpeg"); double angle = 0; while (System::Update()) { angle += 0.1; image.Draw({ 10, 10 }, true);//反転して描画 image.DrawExtend({ 400, 10 }, {420, 30 });//指定矩形に描画 image.DrawRotate({ 400, 200 }, 0.5, angle);//角度と拡大率を指定して描画 Drawing::String({ 10, 10 }, Color::White, { "あいうえお", "n", 123.456 }); if (Input::key.Return.on) break;//Enterで終了 } System::End(); return true; }
  45. 45. //入力を取得する bool SampleInput() { using namespace SDX; System::Initialise("sample", 600, 400); std::string message = ""; while (System::Update()) { if (Input::mouse.Left.on) message = "クリックした"; if (Input::mouse.Left.off) message = "離した"; if (Input::key.Z.hold ) message = "Zを押している"; if (Input::key.Z.holdCount > 60 ) message = "Zを長押し"; //マウスの位置に文字を描画 Drawing::String({ Input::mouse.x, Input::mouse.y }, Color::White, message.c_str()); if (Input::key.Return.on) break;//Enterで終了 } System::End(); return true; }
  46. 46. 関数内部の実装
  47. 47. static void Initialise( const char* ウィンドウ名 , int 幅 , int 高さ ) { if (SDL_Init( SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO ) < 0) { fprintf(stderr, "SDLの初期化に失敗しました:%sn", SDL_GetError()); exit(1); return; } setlocale(LC_CTYPE, "jpn");//文字コードを日本語に int flag = 0; if (Window::Single().isFullScreen) { flag = SDL_WINDOW_FULLSCREEN; } Window::Single().width = 幅; Window::Single().height = 高さ; Window::Single().handle = SDL_CreateWindow( ウィンドウ名 ,SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 幅 , 高さ , flag); defaultRenderer.Create(Window::Single().handle); Screen::SetRenderer(defaultRenderer); #ifdef TABLET int dpiX; int dpiY; SDL_GetWindowSize( Window::Single().handle, &dpiX, &dpiY); Window::Single().aspect = (double)dpiX / dpiY; SDL_RenderSetLogicalSize( Screen::GetHandle() , 幅, 高さ); #endif TTF_Init(); //デフォルトフォントの設定 Drawing::SetDefaultFont( SystemFont::Gothic , 16 ); SDL_InitSubSystem( SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER | SDL_INIT_EVERYTHING ); SDL_JoystickEventState(SDL_ENABLE); if( SDL_NumJoysticks() > 0 ) { Input::pad.Open(); } //音声関連の初期化 Mix_Init(MIX_INIT_MP3); Mix_OpenAudio(44100, AUDIO_S16, 2, 1024); Mix_AllocateChannels(16); isEnd = false; }
  48. 48. Imageクラスの内部 bool Load(const char *ファイル名) { Release(); SDL_Surface* temp = IMG_Load(ファイル名); if (temp == nullptr) {return false}; handle = SDL_CreateTextureFromSurface(Screen::GetHandle(), temp); part.x = 0; part.y = 0; part.w = temp->w; part.h = temp->h; SDL_FreeSurface(temp); return (handle != nullptr); } bool Release() { if (this->handle != nullptr) { SDL_DestroyTexture(handle); return true; } return false; } bool DrawRotate(const Point &座標, double 拡大率, double 角度, bool 反転フラグ = false) const { const int wbuf = int(part.w*拡大率); const int hbuf = int(part.h*拡大率); SDL_Rect temp = { (int)座標.x - wbuf / 2, (int)座標.y - hbuf / 2, wbuf, hbuf }; SDL_Point point = { wbuf / 2, hbuf / 2 }; RGBACulculate(); return !SDL_RenderCopyEx(Screen::GetHandle(), handle, &part, &temp, 角度*180 / PAI, &point, SDL_RendererFlip(反転フラグ)); }
  49. 49. こんな感じで百数十の関数をラップしてる 難しくはないが、すごく面倒
  50. 50. ドキュメント ● 見逃されやすい真実 – ライブラリを作った人は自分で実装している – ライブラリを使う人は自分で実装していない – 認識のずれがある ● ドキュメントが必要な理由 – 機能が豊富でも使い方が分からないので無意味 – 作者がきちんと開発を続けるか不安になる – 他の利用者が多いライブラリを使う
  51. 51. よくある間違い ● Wikiを作る – 誰も手伝ってくれません ● 得意でもないのに英語にする – 更新が止まります ● なんとか頑張る – 実装する気力がなくなります ● あきらめて書かない – 物好きしか使いません
  52. 52. ドキュメントには何が必要? ● これぐらい – ライブラリの解説 – 開発の動機、目的 – 導入方法 – ライセンスの説明 – 機能一覧とクラスリファレンス – サンプルコード – FAQ – 連絡先
  53. 53. 自動生成する ● Doxygenを使う – フリーのドキュメント生成ソフトウェア – コードとコメントから自動生成 – 仮引数を日本語にする – 関数コメントを書く – テストコードをサンプルコード代わりにする ● これでOK – ちゃんとしたドキュメントが出来る – 辛くない
  54. 54. 自動生成出来ない所 ● 普通に書いた所 – リファレンス以外はhtmlっぽいので書いた – 変更少ないしなんとかなる – わりと辛い – FAQとかは後から追記しけばよい – 2,3ヶ月もあれば余裕
  55. 55. ● クラス /** 画像データを表すクラス. /* / include ImageSample.h /** * class Image { //実装 } ● 関数 /** 指定座標に描画. /* bool Draw(const Point &座標 , bool 反転フラグ) const これぐらいしか書いてない
  56. 56. なぜ日本語識別子 ● ビャーネ・ストロヴストルップ曰く – 何故Conceptが必要か – コメントに書くなら言語機能にしよう ● 日本語識別子 – 日本語コメント書くなら、識別子を日本語にする – 発想はConceptと大体一致
  57. 57. 識別子を日本語にする ● 仮引数だけ日本語にした – 仮引数は詳しく書きたいので日本語が楽 – IDEの補助表示的にも日本語が良かった – 関数名と違い、呼び出し側は日本語入力が不要 – 実装中はインテリセンスよりGoogleIMEが賢い ● 欠点 – GCCが非対応(5.0で確認) – GDCやGHCは普通に対応してた
  58. 58. モラルの向上
  59. 59. モラルって何? ● 道徳心や倫理観 – コミュニティの雰囲気は大事 – ギスギスした感じは嫌ですね – とはいえ押し付けられるのはもっと嫌 ● 遵法意識 – ライセンスを守る – グレーゾーンな活動を避ける ● 他のコミュニティから嫌われるとまずい
  60. 60. ライセンス違反の問題 ● ライセンス違反って実は多いのでは? – OpenLogicが2011年3月の調査 – iOSとAndroidのソフト、635本を調査 – 68本がApacheやGPLのコードを利用していた – 71%にライセンス違反が発覚 ● 他の調査 – PricewaterhouseCoopersによる監査 – 監査対象の8割がライセンス違反 – ※これはソフトウェア・ライセンスの話でした
  61. 61. PWCの調査 ● ライセンス違反原因Top5 – 1.複雑なソフトウェア契約 – 2.不注意による事故 – 3.ソフトウェア資産管理の不備 – 4.教育不足 – 5.故意の違反 ※OSSとかではなく、ソフトウェア・ライセンスの話 ※OSを一つ購入して会社のPC複数に入れる的な ● 違反しない様にしよう
  62. 62. どういった対策を取るか ● ライブラリがGPLである – ライブラリを使う時に勉強が必須 – 二次派生物のライセンスは同じになる – 1、3、4の対策になる ● 不注意による事故 – GPL特例のクレジット表記とかで起こりうる – 直接的な被害は小さいが注意は必要
  63. 63. 故意の違反 ● GPL違反は見つけにくい – 自分が公開したのと似たソフトを探す – ライセンスを確認 – バイナリを解析する – 偶然では有り得ないレベルの一致がある – 手続きを踏んで、訴訟する ● 個人での摘発は難しい – メールで問い合わせ人だけにコード渡すとか
  64. 64. 違反しないような方向性 ● コード公開をメリットにする – 公開した方が得なら違反しないのでは? ● メリットとして期待出来る事 – コミュニティに入れる – ユーザーがデバッグに協力しやすい – MOD的な物で盛り上がる可能性 – 自由ゲームだけのレビューサイト作ったり
  65. 65. その他の違反 ● 無許可の二次創作 – 自由ソフトウェア運動的にはアウト – 独自ライセンスで許可してる場合も – 特定企業の支援になるのはどうなの? ● よく似たゲームやクローンゲーム – あまりにそっくりなのはNG、線引が難しい – ソフトウェア特許と絡んだり – 公開停止もたまにある
  66. 66. その他の違反 ● トレース、シナリオの盗作、耳コピ – 他のゲームの画像をそのまま利用するとか – 完全にアウト ● ソースコードだけGPLなのに – 画像等以外もGPLと誤解する可能性 ● とはいえ – なんやかんやで、気にしすぎる方が体に悪い
  67. 67. 自由ゲーム運動の外交
  68. 68. 活動規模が小さい ● 人が少ない – SorceForgeで公開中 – ダウンロード数はそんなに増えない – 広報が必要 ● 外に出て活動する必要がある – なんかないかな? – C++詳しくて – ゲームプログラミングに興味がある
  69. 69. Boost.勉強会 いけるやん!?
  70. 70. どうですか?
  71. 71. 自由ゲーム運動の未来
  72. 72. 当面の予定 ● とりあえずゲームを1本完成させる – 製作中のが一つ、年内ぐらい予定 ● ライブラリの改良 – 興味がある人がいれば ● 自由ゲームのWiki – ある程度自由ゲームが増えたら何か
  73. 73. ありがとうございました
  74. 74. 参考資料 ● GNU – https://www.gnu.org/#mission-statement ● フリーソフトウェア財団 – http://www.fsf.org/ ● リチャード・ストールマンと自由ソフトウェア革命 – http://www.catch.jp/oss/free_as_in_Freedom2.0_ja.pdf ● オープンソースソフトウェアの育て方 – http://producingoss.com/ja/
  75. 75. 参考資料 ● GNU GPL v3 解説書 https://www.ipa.go.jp/osc/license1.html ● More about the App Store GPL Enforcement http://www.fsf.org/news/blogs/licensing/more-about-the-app-store-gpl-enforcement ● フリーソフトウェアの理念にそぐわないiPhone SDKの利用規約 http://sourceforge.jp/magazine/08/04/17/0141213
  76. 76. 参考資料 ・A Practical Guide to GPL Compliance https://www.gnu.org/licenses/why-not-lgpl.ja.html ・あなたの次回のライブラリには劣等GPLを使うべきでない理由 http://www.softwarefreedom.org/resources/2008/compliance-guide.html ・ソフトウェアライセンスのコンプライアンス違反:上位5つの原因とは? http://ameblo.jp/itam-japan/entry-11165176842.html ・ストールマン氏が語る「巨大な監視エンジンと民主主義の危機」 http://ascii.jp/elem/000/000/856/856012/ ・OSSを利用したモバイルアプリ7割がライセンス違反 http://opensource.slashdot.jp/story/11/03/09/085245/OSS 7を利用したモバイルアプリ 割がラ Bjarne Stroustrup、Conceptと未来を語る http://cpplover.blogspot.jp/2009/08/bjarne-stroustrupconcept_14.html

×