SlideShare a Scribd company logo
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/
 「そんなことよりゲーム作ろうぜ」
質疑応答
詳しくは懇親会で
ご清聴ありがとうございました

More Related Content

PDF
C++11概要 ライブラリ編
PDF
ゲーム開発者のための C++11/C++14
PPTX
PPT
C++でHello worldを書いてみた
PDF
C++ Template Meta Programming の紹介@社内勉強会
PDF
templateとautoの型推論
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
組み込みでこそC++を使う10の理由
C++11概要 ライブラリ編
ゲーム開発者のための C++11/C++14
C++でHello worldを書いてみた
C++ Template Meta Programming の紹介@社内勉強会
templateとautoの型推論
BoostAsioで可読性を求めるのは間違っているだろうか
組み込みでこそC++を使う10の理由

What's hot (20)

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

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

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

More from 勝成 鈴江 (16)

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

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