O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

1.424 visualizações

Publicada em

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

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

Publicada em: Software
  • Seja o primeiro a comentar

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

  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

×