Download - これから始める ゲームプログラミング · OpenGLなどのマルチメディアAPI ... • Visual Studio 2010 Express ... – Visual C++ 2010
これから始めるゲームプログラミング
講演の流れ
• 入門サイト、入門書、ツールなどを紹介していきます。
• この資料はWeb上に上がってますので、特に
メモを取らずともいいです。家に帰って後で参考にしたり、後で本を買おうと思ったときなどに参考にして下さい。
プラットフォームの選択
環境は色々ですが・・・
• iPhone, Androidのようなスマートフォン
– 実機での開発や、作ったアプリの公開が有料
• Flashゲームのような、ブラウザ上で動くゲーム
– 学生はFlexBuilderという開発環境が無料で使えたはず
• ノベルゲーム
– 吉里吉里やNScripter等、簡単に作るための環境があるので積極的に利用すべき
• Hot Soup Processor(HSP)– 初心者向けらしいけど使ったことないのでよく知りません
今回はWindows + DirectX9 に絞ります
• ゲームプログラミングの資料が最も多い
• 多くのWindowsマシンで動作する
• 開発環境を無料で揃えられる
DirectXって?
• パソコン向けのゲームを作る場合、DirectX, OpenGLなどのマルチメディアAPI群を利用するのが一般的
• 簡単にいうと、絵を表示したり音を鳴らしたりするためには、これらを使ってプログラムを書かなきゃダメってこと
DirectX9以外の環境はないの?
• OpenGL–家庭用ゲーム機や、iPhone,Androidなどのスマートフォンで利用されている
–資料が少なすぎるので、初心者がいきなり触るには厳しい
DirectX9以外の環境はないの?
• OpenGL–家庭用ゲーム機や、iPhone,Androidなどのスマートフォンで利用されている
–資料が少なすぎるので、初心者がいきなり触るには厳しい
DirectX9以外の環境はないの?
• DirectX10以降
–Windows Vista 以降じゃないと動かない
–作ったゲームは、XP以前のユーザーは遊べない。
–資料も少なく、手探りで覚えていくことになる
• XNA –Windowsと、XBox360の両方で動くゲームが作れる
– これも資料が少ない。
–売れないから入門書も少ないので、少ないWeb上の記事に頼らざるを得ない。
開発環境を整える
この2つをインストールすればOK
• Visual Studio 2010 Express– http://www.microsoft.com/japan/msdn/vstudio/express/
–プログラムを書くためのソフトウェア(無料)
– このソフト上でプログラムを書いていく
– Visual C++ 2010 をとりあえずインストールしよう
• DirectX SDK– http://msdn.microsoft.com/ja‐jp/directx/aa937788.aspx– DirectX を利用したプログラムを書くために必要
プログラミング入門
プログラミング入門
• まずは、プログラミングを覚えましょう
• ゲームプログラミングでは、C言語かC++を利用するのが一般的です。
• 多くのゲームプログラミング解説書は、C++の基本だけは分かっているという前提で書いてあります。
まずはC言語から
• いきなりC++はキツいので、まずはC言語から始めるといいと思います
– C言語は分かりやすい解説書が豊富
– C言語に関してはWebサイトで勉強するより本を買った方が早い
– 「猫でもできるプログラミング」などのサイトが、2chでよくおすすめされているが、ぶっちゃけあのサイト分かりづらい
C言語おすすめ書籍
• 入門書はホントに色々あるので、立ち読んでみて自分に合っていると思ったものを
– 「独習C」のような教科書的な本は時間の無駄
–丁寧に説明している本をサクっと読んで覚えよう
C言語おすすめ書籍
• やさしいC• C言語ポインタ完全制覇
• 自分の場合は、この2冊をサクっと読んで覚えた
C++
• C++は覚えることがかなり多い言語なので、いきなりやると結構辛い
• Javaなどでオブジェクト指向の経験がある人なら、C++をスムーズに理解できる?
• 割と分かりやすいWebサイトがあるので、Webサイトだけで勉強してもいいかも
C++おすすめサイト
• Programing Place Old– http://www.geocities.jp/ky_webid/index_old.html– C++の分かりやすい解説サイト
–特にSTL関係が分かりやすい
• ロベールのC++教室
– http://www7b.biglobe.ne.jp/~robe/–本にもなった、定番の入門サイト
C++おすすめ書籍
• C++クラスと継承完全制覇
• ロベールのC++入門講座
Java
• Javaについても一応触れておく
• Javaの方がC++よりシンプルな言語なので、Javaでオブジェクト指向という概念を理解しておくとC++の理解がスムーズに行くかも
おすすめ書籍
• Javaの定番入門書
Java言語プログラミングレッスン(上)(下)
デザインパターン
• デザインパターンとは、プログラミングで良く使われる手法をパターン化したもの。
• 知ってて損ではないので、デザインパターンを覚えつつオブジェクト指向への理解を深めると一石二鳥
• ある程度プログラミング知識がついたと思ったらチャレンジしてみては
おすすめ書籍
• Head First デザインパターン– デザインパターンがどんなものか感覚的に理解できる
– ちょっと値段が高い(¥4830)• Java言語で学ぶデザインパターン入門– デザインパターンをしっかり覚えるならこっち
DirectX9でゲームを作る
一番簡単な方法
DXライブラリを利用する
DXライブラリとは?
• DirectXを利用する際の複雑な手続きをまとめて、簡単なプログラムで使えるようにしたもの
– http://homepage2.nifty.com/natupaji/DxLib/
DirectX9でデバイスを初期化してウインドウを表示するコード
WNDCLASSEX wc={sizeof(WNDCLASSEX), CS_CLASSDC, DummyWndProc, 0L, 0L, hinst, icon, LoadCursor(NULL, IDC_ARROW), NULL, NULL, WindowName.c_str(), NULL
};RegisterClassEx(&wc);
// ウィンドウの作成
Longstyle=WS_CAPTION|WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
RECT r={0, 0, config.WindowWidth, config.WindowHeight};AdjustWindowRect(&r, style, false);HWnd=CreateWindow(WindowName.c_str(), WindowName.c_str(), style, (ScreenWidth‐Width)/2, (ScreenHeight‐Height)/2,r.right‐r.left, r.bottom‐r.top, GetDesktopWindow(), NULL, wc.hInstance, NULL);
// D3Dデバイスの作成
DepthStencilFormat = config.is32BitDepth ? D3DFMT_D24S8 : D3DFMT_D16;
WindowStyle=GetWindowLong(hwnd, GWL_STYLE);int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
// Direct3Dデバイスの作成
pD3D=Direct3DCreate9(D3D_SDK_VERSION);if(pD3D == NULL)return;
if(!ResetDevice()){SAFE_RELEASE(pDevice)SAFE_RELEASE(pD3D)
}
SetWindowLong(HWnd, GWL_STYLE, WindowStyle);
RECT r={0, 0, Width, Height};AdjustWindowRect(&r, WindowStyle, GetMenu(HWnd)!=NULL);
SetWindowPos(HWnd, HWND_NOTOPMOST,PrevX, PrevY,r.right‐r.left, r.bottom‐r.top, SWP_SHOWWINDOW);
// デバイスのプレゼンテーションパラメータを設定
D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp, sizeof(d3dpp));d3dpp.hDeviceWindow=HWnd;d3dpp.BackBufferCount = BackBufferCount;d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;d3dpp.MultiSampleQuality = 0;d3dpp.BackBufferWidth=Width;d3dpp.BackBufferHeight=Height;d3dpp.Windowed = true;d3dpp.FullScreen_RefreshRateInHz=isFullScreen?RefreshRate:0;d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;d3dpp.Flags |= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;d3dpp.BackBufferFormat=mode.Format;
d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_ONE;d3dpp.EnableAutoDepthStencil=TRUE;d3dpp.AutoDepthStencilFormat=DepthStencilFormat;
// デバイスの作成
if (!pDevice) {if (FAILED(pD3D‐>CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, HWnd,D3DCREATE_MIXED_VERTEXPROCESSING,&d3dpp, &pDevice)))
{}}
// DirectInputインタフェースの作成
DI=NULL;if (FAILED(DirectInput8Create(
GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&DI, NULL))
){return;
}
// キーボードデバイスの取得と初期化
Keyboard=NULL;if (FAILED(DI‐>CreateDevice(
GUID_SysKeyboard, &Keyboard, NULL)) ||FAILED(Keyboard‐>SetDataFormat(&c_dfDIKeyboard)) ||
FAILED(Keyboard‐>SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))
){FreeResources();return;
}
// ジョイスティックデバイスの取得と初期化
if (FAILED(DI‐>EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCallbackWrapper, this, DIEDFL_ATTACHEDONLY))
){FreeResources();return;
}
for (int i=0, n=JoySticks.size(); i<n; ++i){if (FAILED(JoySticks[i]‐>SetDataFormat(
&c_dfDIJoystick2)) ||FAILED(JoySticks[i]‐>SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE)) ||
FAILED(JoySticks[i]‐>EnumObjects(EnumObjectsCallbackWrapper, JoySticks[i], DIDFT_ALL))
){FreeResources();return;
}}
// マウスデバイスの取得と初期化
Mouse=NULL;
if (FAILED(DI‐>CreateDevice(GUID_SysMouse, &Mouse, NULL)) ||
FAILED(Mouse‐>SetDataFormat(&c_dfDIMouse)) ||
FAILED(Mouse‐>SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))
){if(Mouse) {Mouse‐>Unacquire();Mouse‐>Release();Mouse = NULL;
}}
if(Mouse){// マウスの軸モードを相対値モードに設定
DIPROPDWORD diprop_mouse;diprop_mouse.diph.dwSize = sizeof(diprop_mouse); diprop_mouse.diph.dwHeaderSize =
sizeof(diprop_mouse.diph); diprop_mouse.diph.dwObj = 0;diprop_mouse.diph.dwHow = DIPH_DEVICE;diprop_mouse.dwData = DIPROPAXISMODE_REL; // 相対
値
if (FAILED(Mouse‐>SetProperty(DIPROP_AXISMODE, &diprop_mouse.diph)))
{}
}米適当にコピペして削っただけなんでこのままでは動きません
長っ!
DXライブラリの場合
if(DxLib_Init() == ‐1){// エラー時の処理を書く
}
これだけ!
DXライブラリ超オススメ
• このように、非常に簡単にゲームを作ることができる。
• デバイスの初期化以外にも、画像の描画、キー入力の取得、サウンドの再生などを簡単なプログラム記述で実行できる。
–どれも、DirectXで実行しようとすると数十行~数百行は処理を書かなくてはならない
DXライブラリまじオススメ
• DirectXの全ての機能をサポートしているわけではないが、ある程度のことはできる
• ぶっちゃけ2Dゲームなら、DXライブラリを使ってプログラムを書けば充分
• DXライブラリを使って作っている同人ゲームも結構ある。
DXライブラリおすすめサイト
• C言語なんでも質問サイト
– http://dixq.net/– 「ゲームプログラミングの館」では、DXライブラリの使い方を解説している。
– 「龍神録プログラミングの館」では、東方っぽいシューティングの作り方を解説している
おすすめ書籍
• DXライブラリを使ってゲームを作る入門書
• DXライブラリを使ってる本は、おそらく現時点でこの本のみ
14歳からはじめるC言語わくわくゲームプログラミング教室
おすすめしない書籍
• こっちは、Windows標準の描画機能(GDI)を使っている。
• GDIは遅すぎてゲーム作りには向かない
• 本の内容自体も微妙。
• 14歳の本と間違えて手に取らないように
13歳からはじめるゼロからのC言語ゲーム
プログラミング教室
おすすめしない書籍
• これも、GDIでゲームを作る本なので、タイトルに釣られて買わないこと。
• WinAPIを解説した本として捉えると、勉強にはなるかもしれない。
Windowsゲームプログラミング
DXライブラリなんてヤダヤダ!
DirectXを使いたい!という人は
DirectX入門書
• マスタリングDirectXプログラミング
• DirectX ゲームグラフィックスプログラミング
• DirectX の入門書ならこの2冊が分かりやすくてオススメ
• この2冊より分かりやすい解説サイトは無い
• DirectXの、グラフィック部に絞って解説している
• 自分の知っている限り最も分かりやすい本
DirectX ゲームグラフィックス
プログラミング
• こっちはグラフィックだけではなく、
サウンド再生やキー入力なども解説している
• キー入力について扱っている本は珍しい
マスタリングDirectXプログラミング
ゲームプログラミングおすすめサイト
ゲームプログラミングおすすめサイト
• もんしょの巣穴
– http://sites.google.com/site/monshonosuana/–旧コンテンツに、DirectXに関する多くの解説がある
• ゲームプログラミングWiki– http://www.c3.club.kyutech.ac.jp/gamewiki/– DirectXに関する解説だけでなく、ゲームプログラミングに関する解説もある
ゲームプログラミングおすすめサイト
• ○×(まるぺけ)つくろーどっとコム– http://marupeke296.com/–ゲームプログラミングに関する解説多数
–特に当たり判定に関する記事が分かりやすい
• 全ゲ連講演資料まとめWiki– http://zengeren.wiki.fc2.com/–過去の講演資料がまとまってるので、参考になる記事があるかも
–そのうちゲームプログラミング入門が増えるかも
ゲームプログラミング書籍あれこれ
•
• セガのとある部署の新人研修をまとめたもの
• 一昨年の発売以来バカ売れ中
• 自分が初心者だったころこの本があれば・・・という声が多数でるほど、しっかりとまとまっている本。
• かなり分厚いが、解説も丁寧で良い
ゲームプログラマになる前に覚えておきたい技術
•
• ゲームで使いそうな部分に絞って、高校レベルの数学、物理学の基礎を解説
• リファレンスとして使いやすい構成の本。持っていると便利。
• 各項には公式の簡単な説明+ソースコード例が書いてある。
• いちいちポンド、ヤードなどから、メートル,グラム法に単位を直しているのが分かりづらくて難
ゲーム開発のための数学・物理学入門
○○プログラミングシリーズ
• ソフトバンクパブリッシングの、「○○プログラミング」「○○アルゴリズムマニアックス」シリーズについて
• 「シューティングゲームアルゴリズムマニアックス」が売れたことで、このシリーズがどんどん発刊されている
• たまに良書もあるが、悪書のほうが多いので、しっかり見極めて買うこと。
こんな感じで色々あるわけですが、ハズレの方が多かった気がします
特にハズレだった書籍
• 自分が読んだ中では、この3冊が最悪でした– 著者はゲーム作ったことあるのか?– フラグちょっと変えただけじゃん!– このソースコードと解説を何に活かせと?– などなど・・・
•
• 自機狙い弾、N‐WAY弾、分裂弾・・・と、STG のアルゴリズムを色々扱っている。
• シューティング作ってみたい人は読んでみるといいかも。
• この本あたりまではこのシリーズもまともだった・・・
シューティングゲームアルゴリズムマニアックス
物足りなくなったらこの辺にチャレンジ
• ゲームコーディング・コンプリート一流になるためのゲームプログラミング
• スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践
• DirectXシェーダプログラミング仕組みからわかるゲームエフェクトテクニック
• DirectX 9 シェーダプログラミングブック
• 実例で学ぶゲーム3D数学
• ゲームプログラミングのためのリアルタイム衝突判定
などなど。どれも買って損無しの良書です。
プログラム以外の話
修正パッチの作成
• udm差分ファイル作成ツール
– http://product.lameije.co.jp/udmtool.html–シェアウェア(2100円)
–同人ゲームで割と使われている
Subversion
• Subversionを使うと、複数のPCでデータを同期することができる
–それぞれがサーバー上にデータを書き込み、手元のデータとサーバー上のデータを同期させる
• 基本的にはソースコードの管理に利用するが、どんなファイルでも同期できる
–例えば、画像ファイル・サウンドファイル、ソースコードなどゲームに使う全データを対象とし、プログラマ、グラフィッカ、サウンドなど全メンバーが手元のデータを同期させる
Subversion
• TortoiseSVN– Subversionを利用するためのクライアント
– フォルダの右クリックメニューから利用する
– http://tortoisesvn.tigris.org/
• 使い方についてはぐぐって調べてください
–チェックアウト、コミット、アップデート、インポートあたりが分かればとりあえず十分です
手順
1. 誰か1人が1度だけ、リポジトリにPC上のデータをインポート
2. 各々のPCに、リポジトリのデータをチェックアウトして作業領域を作成する
3. それ以降は、PC上で行った変更をリポジトリに反映させたい場合には「コミット」を。リポジトリ上の最新データをPC上の作業領域に反映させたい場合には「アップデート」をそれぞれ行う
インポート• PC上のファイル群をリポジトリに登録し、リポジトリを有効化する
–まず最初にインポート行う
–誰かが1度だけ行えばよい
チェックアウト
• リポジトリ上のデータをダウンロードし、Subversion対象領域を作成する
–各々が1度だけ行う必要がある
–空のフォルダを作成し、右クリックでチェックアウトを選択
アップデート
• リポジトリ上の最新データを、手元のSubversion領域に反映させる
コミット
• 手元のSubversion領域にあるデータのうち、
前回アップデートされてから変更されているものを調べ、リポジトリのデータを上書きする
コミット(2)
• 「コミット」を選択した後の画面
–上のボックスには、今回の更新内容を書くこと
–下のボックスでは、コミットするファイルを選択
コミット注意点
• コミットする前には、必ずアップデートを行うこと– アップデート⇒コミット、の手順で必ず行う
• 自分が前回アップデートした後に、誰かがコミットを行っていた場合、その人の変更を上書きしてしまう可能性があります
• アップデートしたからといって、自分書いた部分が消えてしまうことはありません。リポジトリ上の最新データとソースコードの差分を調べて、ちゃんとマージされます。
リポジトリ
• Subversionで利用される、サーバ上のデータ置き場のことをリポジトリと呼ぶ
–チェックアウト時、インポート時などにリポジトリのアドレスを指定する
• リポジトリを利用するためにはサーバーを立てる必要がある– Unfuddleというサービスが、無料で200MBまで利用できるサーバーを提供しているので、このサービスを利用すると楽
– http://unfuddle.com/
Unfuddle
• アカウントを作成したら、以下のURLでアクセス
– http://アカウント名.unfuddle.com/
• 「Repositories」 ⇒ 「New Repositories」でリポジトリを作成する
– Title にはリポジトリ名、Abbreviationには小文字アルファベットで文字列を指定
– リポジトリのアドレスは、http://アカウント名.unfuddle.com/svn/アカウント名_Abbreviation名/
グラフィック(2D)
• ドット絵
– 書籍、ドット絵講座系のWebサイトなどを参考に
– ニコニコ動画などで、ドット絵の描き方を公開している方もいる
– ウチのドッターは「Edge」というソフトを使って描いている
• ドット絵以外のグラフィックソフト
– SAI(5000円)とか、PhotoShop(数万円)とか。
– 無償ならPixiaとかGIMPとか(古い情報かも)
グラフィック(3D)
• 安く済ませたいなら「Metasequoia」– フリー版なら無料、有料版は5000円–入門書も多数出ている
–まずはこのソフトから触ってみて、物足りなくなったら他のソフトに乗り換えるのがベストか
• Blenderという無料ソフトもある
– こちらは本格的なうえに資料も少ないので厳しいかも
プロ向けの本格的な3Dソフト
• LightWave3D– 10万円しないくらいの価格
–個人で所有するにはギリギリのラインか
• Maya, 3dsMax, SoftImage等–数十万円レベル
–ゲーム業界でも普通に利用されている
–初心者にはおすすめできない
サウンド
• 自分で作るか、人に作ってもらうか、
無償で公開されている素材を利用するか
• フリーの作曲ソフトは、Domino, Music Studio Producer, REAPER あたりが有名らしい
– http://takabosoft.com/domino– http://www.forest.impress.co.jp/lib/pic/music/sequencer/msproducer.html
– http://www.cockos.com/reaper/
Web上の効果音・BGM素材
• 効果音は「ザ・マッチメイカァズ」が定番サイト– http://osabisi.sakura.ne.jp/m2/
• 同人ゲームでも良く利用されている
– 「あれ、この効果音あのゲームで聞いたな?」なんてこともよくある
• BGM素材を公開しているサイトは色々ある
• 例:煉獄庭園– http://www.rengoku‐teien.com/
素材を利用する際の注意点
• ライセンス(利用許諾)は必ず確認すること
–商用利用は可能か、素材元クレジットを明記する必要があるか、素材制作者に許可は
– ライセンスを確認せず利用して揉めることは多い
–海外の場合も、英語めんどくさいからいいやとか、日本だけならバレないしいいやとか思っちゃダメ
• ネット上ではみんな品行方正で正義感がやたら強いので、間違いなくバレると思っといた方がいいでしょう
素材を利用する際の注意点
• サウンド素材に限った話ではありません
–プログラム・グラフィック・フォントなども。自分で作ったもの以外は全てライセンスを確認すること
• プログラムの場合、GPLライセンスのプログラムを使ってしまって揉めたり(例:Leaf, SCE)– GPL, MIT, BSD など、多くのライセンスが存在する
– ぐぐって分からなかった場合は詳しい人に聞きましょう
素材を利用する際の注意点
• フォントの場合、ライセンスを意識せず使っている人が非常に多い。– フォントも著作権物です
– 「フォントを画像化してゲームに組み込む」という、ゲーム向けの利用法が可能かどうか明記されているフォントは少ない
– どうしても分からなければ制作元に確認を
• 2chの「ゲームに安心して使えるフォント探せ」というスレが有用かも– http://wiki.game‐develop.com/
最後に
• とにかく、まずは簡単なものでいいので1本作り上げましょう。–まずはゲームを完成させることが大切です。
• ここまで色々技術書を紹介してきましたが、別に技術にこだわる必要はありません。ゲームは面白ければいいんです。
• 困ったときには本を読んでサクっと問題解決しちゃいましょう。
–ネットで検索するより、本を読んだほうが早く解決します。時は金なり。
最後に
• そして、いずれはここに立って講演してくれる方が出てくれると嬉しいです。
• 勉強会という文化の問題か、プログラム講演ばかりですが、グラフィックでもサウンドでも企画でもいいので、気軽に講演して下さい。
• 静的ゲーム(ノベルゲーとか)系の講演も少ないですが、講演しても全然構いません。俺は興味津々です。
おまけ
修羅場の友
• 定番のユンケルは顆粒(粉薬)がオススメ
–一番安いユンケル(液体)は、1本あたり300~400円– しかし顆粒は、1包あたり100円ちょい
– コストパフォーマンス抜群
もの足りない訓練されたあなたに
• 活蔘(カツジン)マジおすすめ
–ユンケルの1000円以上のモデル(ファンティとかスターとか)と似たような成分構成
–値段は10本セットで4000~5000円。コスパ抜群
–扱ってる店は少ないですが、コクミンドラッグはだいたい全店扱ってます(アキバ・御徒町・新宿など)