SlideShare uma empresa Scribd logo
1 de 29
C++でのゲームプログラミングをしたときのお話
        札幌C++勉強会 #4
    〜スタートゲームプログラミング〜
               発表者 @sakuriver
自己紹介
サク・リバー(@sakuriver)
 お仕事 PHPプログラマー
 Kawaz(gccsap)所属
 C++は趣味な子
 23歳
本日の対象者

C++触っているけどゲーム作ったこ
 とがない
ゲームを作りたい方
クラスとかに興味がある方
こんな方は注意
C++マスター
ゲーム作るの興味がない
ろくろを回している方
Mainファイルに3万行以上書いてゲームを作れる
 方
セッションで紹介するゲーム
かわずたん大乱闘
 対戦2Dアクションゲームです
 Kawazの春イベントで作成
 僕はプログラマーとして参加


 100聞は一見にしかず
開発環境
VisualStudio C++ 2008 + Dxlib(少しだけSTL)
  何故Dxlibにしたか
    一番は対戦アクション+4人対応でゲームパッド対応にし
     たかった
    XNAだと別途作成が必要
    Dxlibだと、描画・ゲームパッド・サウンドの条件がそろっ
     ていた
    日本語のドキュメントがすごく多い
Dxlibについて
WindowsAPIのDirectXのラッパです


描画やサウンド関係の関数が一通りそろっている


山田 巧さんによって作成されています


半年前に確認をしたら、3D機能周りが充実され
 てきていました
ゲームの基本要素
画像描画・音楽処理
 キャラクターを動かしたりエフェクトで利用する
 BGMと効果音を分けて鳴らす


入力処理
 キーボード・マウス・ゲームパッド
  ボタンの入力許可


シーン遷移
 タイトル→キャラクター選択
↑ 上記をループ処理で取得している
一般のプログラムと違うところ
オンライン上のゲームでなければDBは使わない


仕様があんまし正しくない
 トライ&エラーがすごく大切
 妄想の企画そのままで作っても面白くなかったら却下
 作っていく途中で仕様増えます


クラスや継承が役に立つ
 いろんな種類のキャラクターや武器ごとに変更部分だ
  け作り変える
僕の考える描画クラス
描画関数はdxlibあるんでしょ?
 回転させたり、拡大させるだけで別のメソッド名が
  ちょっとめんどくさかった


 後、エフェクトやキャラクターのモーション上アニ
  メーションをデータとして持つ必要があった




    0    1   2   3   4   5   6   7
ソースコードがないので出してみる
void Animation::Draw(int apid,Positiondata position_)
{
    if(aplist_.at(apid).graphic_list_.size() > 1)
    {
    int curpat = GameLoop::GetAnimationCount()
        / aplist_.at(apid).animation_gap_ % aplist_.at(apid).graphic_list_.size();
        DrawGraph(position_.x_,position_.y_,aplist_.at(apid).graphic_list_.at(curpat),true);
    }
    else
    {
DrawGraph(position_.x_,position_.y_,aplist_.at(apid).graphic_list_.at(0),true);
    }
}
ん?


GameLoop::GetAnimationCount()


↑このクラスなんだろう?
GameLoop ゲームの基本ループで
           す
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE
hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
  GameLoop *main = new GameLoop(); // GameLoop Class
  main->Init();                    // Initialize
  main->doMainLoop();              // Main Loop
  delete main;                // Game Main Exit
  return 0;                        // Program Exit
}
GameLoop 初期化編
void GameLoop::Init()

{

    ChangeWindowMode(TRUE);

    SetMainWindowText("バoトgル?アAクNシVョ?ン? for Kawaz");

~

    Effect::LoadFiles();

    SoundBox::Set_Sound(Sound_Load("Soundbgmbattle_kawaz_select_intro_draft.wav"));

    SoundBox::Set_Sound(Sound_Load("Soundbgmbattle_kawaz_select_loop_draft.wav"));

    SoundBox::Set_Sound(Sound_Load("Soundbgmbattle_kawaz_title-theme-of-kawaz-tan.wav"));

    ISceneManager::Scene_Change(new TitleScene());

    ISceneManager::Scene_Init();

}



エフェクトの読み込み

サウンドファイルの設定

タイトル画面の設定
GameLoop メイン部分
void GameLoop::doMainLoop()
{
    while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
    {
ClsDrawScreen();
ISceneManager::Scene_Execute();
ScreenFlip();
FpsLoop();
    }
}
異常終了するか
終了ボタンを押されるまで繰り返される
IsceneManager ← シーン管理クラス
シーンを管理するってどういうこと?
  ゲームは構成が分かれる




                  選択されている画面の処理を実
                  行する構成にしていないと処理
                  速度や拡張性としてつらい
ISceneManager クラス構成
class ISceneManager
{
private:
    ISceneManager(){};
    ~ISceneManager();
    static IScene *pointer_scene;
    static ISceneManager *pointer_manager;
public:
    static void Scene_Init();
    static void Scene_Execute();
    static void Scene_Change(IScene* work_scene);
};
     シーンの初期化

     シーンの切り替え
IsceneManager シーン実行
void ISceneManager::Scene_Execute()
{
    pointer_manager->pointer_scene->Update();
    pointer_manager->pointer_scene->Draw();
}


更新処理(ユーザの操作・伽羅関連の処理など)
↓
描画処理(アニメーションも含む)
入力処理
タイトル画面の操作ごとに分かれるのでシーンク
 ラスを継承した該当クラスごとに記述している


後は、コントローラーの番号でマッピングしてい
 る
これで基本部分終わったー
ん? まてよ ・・・音が鳴らない


ということで、サウンド周りの紹介
サウンド関連クラス
class SoundBox

{

private:

    static vector<int> sound_list_;

    static int bgm_number_;

    static int bgm_flag_;

    static int se_flag_;

Public:

~

    static int Set_Sound(int sound_handle_);

    static int Get_Sound_Number(){ return sound_list_.size()-1;}

    static int Get_Bgm_Flag(){ return bgm_flag_;}

    static int Get_Se_Flag(){ return se_flag_;}

    static void Play(int sound_num_);

    static void Stop(int sound_num_);

    static void Stop_Bgm();

    static void Play_Bgm_Loop(int sound_num_);

    static void Play_Bgm_Back(int sound_num_);

    static void Set_Bgm_Flag(int work_bgm_){ bgm_flag_=work_bgm_;}

    static void Set_Se_Flag(int work_se_){ se_flag_ = work_se_;}
サウンドクラス処理
音楽素材の管理(Vectorを使用)


BGMとSEをそれぞれでフラグ管理


DXLIBではループ再生とバック再生で別々なの
 で、メソッドで作り直し


イントロ→ループ→ループ→イントロなどが複数
 パターン予定があったのでリストで管理する必
 要があった
サウンド利用例
void BattleScene::Bgm_Check()
{
    if(SoundBox::Sound_Check() == 0){
        bgm_count_++;
if(bgm_count_ >= 3){
    bgm_count_ = 0;
}
SoundBox::Play_Bgm_Back(battle_bgm_pattern_[bgm_count_]);
    }
}
サウンドがなっている間は継続して終了していた場合は次の演奏を開始している
ここまででやったこと
キャラクターの描画・アニメーション


シーン遷移


ゲームのループ処理


サウンド処理
補足
ゲームプログラミングでほかと違うのは素材関連
 の処理と常にループしている部分の速度を考え
 るところ位


ゲームを作るときに大切なのは技術より動画を見
 たり何回もプレイしてのトライアンドエラーが
 出来るか → C++は今はゲーム開発の書籍が
 多いし、速度がいいからおすすめ


本当の意味でスマートにプログラムを書きたいん
 だと、ゲーム作りは挫折しやすいかも
ちょっと時間が余ったので
Kawazの宣伝


 僕が所属させていただいているコミュニティです
 URLは http://www.kawaz.org/
 「そんなことよりゲーム作ろうぜ」
質疑応答
詳しくは懇親会で
ご清聴ありがとうございました

Mais conteúdo relacionado

Mais procurados

Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂
 

Mais procurados (20)

Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axsh
 

Semelhante a C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜

2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
Hiroshi Oyamada
 
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョンenchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
Ryota Shiroguchi
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Atsushi Tadokoro
 
How to use animation packages in R(Japanese)
How to use animation packages in R(Japanese)How to use animation packages in R(Japanese)
How to use animation packages in R(Japanese)
sleipnir002
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
ftnk
 
enchant.jsでゲーム制作をはじめてみよう
enchant.jsでゲーム制作をはじめてみようenchant.jsでゲーム制作をはじめてみよう
enchant.jsでゲーム制作をはじめてみよう
Ryota Shiroguchi
 

Semelhante a C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜 (20)

enchant.js勉強会
enchant.js勉強会enchant.js勉強会
enchant.js勉強会
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
 
Creators'night#14今井
Creators'night#14今井Creators'night#14今井
Creators'night#14今井
 
Osakijs #01 「enchant.jsハンズオン資料」
Osakijs #01 「enchant.jsハンズオン資料」Osakijs #01 「enchant.jsハンズオン資料」
Osakijs #01 「enchant.jsハンズオン資料」
 
Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門Androidプログラミング初心者のためのゲームアプリ開発入門
Androidプログラミング初心者のためのゲームアプリ開発入門
 
Sencha study
Sencha studySencha study
Sencha study
 
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョンenchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
enchant.jsでゲーム制作をはじめてみよう 「パンダの会」バージョン
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けて
 
StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件StackExchangeで見たシステムプログラミング案件
StackExchangeで見たシステムプログラミング案件
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Pythonでゲーム作る
Pythonでゲーム作るPythonでゲーム作る
Pythonでゲーム作る
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
 
How to use animation packages in R(Japanese)
How to use animation packages in R(Japanese)How to use animation packages in R(Japanese)
How to use animation packages in R(Japanese)
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
 
Acme minechan
Acme minechanAcme minechan
Acme minechan
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 
Glfw3,OpenGL,GUI
Glfw3,OpenGL,GUI Glfw3,OpenGL,GUI
Glfw3,OpenGL,GUI
 
enchant.jsでゲーム制作をはじめてみよう
enchant.jsでゲーム制作をはじめてみようenchant.jsでゲーム制作をはじめてみよう
enchant.jsでゲーム制作をはじめてみよう
 
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社
 

Mais de 勝成 鈴江

ぼくはきみの盾 ドキュメントコメント編
ぼくはきみの盾 ドキュメントコメント編ぼくはきみの盾 ドキュメントコメント編
ぼくはきみの盾 ドキュメントコメント編
勝成 鈴江
 

Mais de 勝成 鈴江 (16)

Playfabmeetup#4
Playfabmeetup#4Playfabmeetup#4
Playfabmeetup#4
 
Rebirth chronicle
Rebirth chronicleRebirth chronicle
Rebirth chronicle
 
ドリトルのすすめ
ドリトルのすすめドリトルのすすめ
ドリトルのすすめ
 
探検企画書
探検企画書探検企画書
探検企画書
 
Ggj2015での開発話
Ggj2015での開発話Ggj2015での開発話
Ggj2015での開発話
 
MonoGame村からこんにちは
MonoGame村からこんにちはMonoGame村からこんにちは
MonoGame村からこんにちは
 
ぼくはきみの盾 ドキュメントコメント編
ぼくはきみの盾 ドキュメントコメント編ぼくはきみの盾 ドキュメントコメント編
ぼくはきみの盾 ドキュメントコメント編
 
Turtlewars
TurtlewarsTurtlewars
Turtlewars
 
ぼくはきみの盾 ツール-データ編
ぼくはきみの盾 ツール-データ編ぼくはきみの盾 ツール-データ編
ぼくはきみの盾 ツール-データ編
 
ぼくはきみの盾-Redmine編
ぼくはきみの盾-Redmine編ぼくはきみの盾-Redmine編
ぼくはきみの盾-Redmine編
 
としなべ!! 企画書
としなべ!! 企画書としなべ!! 企画書
としなべ!! 企画書
 
GGJ練習 没案 公開用資料
GGJ練習 没案 公開用資料GGJ練習 没案 公開用資料
GGJ練習 没案 公開用資料
 
おにぎりで鬼を斬る
おにぎりで鬼を斬るおにぎりで鬼を斬る
おにぎりで鬼を斬る
 
柏鯉
柏鯉柏鯉
柏鯉
 
Ggj2014に参加したカメのお話
Ggj2014に参加したカメのお話Ggj2014に参加したカメのお話
Ggj2014に参加したカメのお話
 
まわーるどが1週するまでのお話
まわーるどが1週するまでのお話まわーるどが1週するまでのお話
まわーるどが1週するまでのお話
 

C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜