XAudio2の初期化&現状報告

お久しぶりです。EFです。

なかなかブログを書く気力がなく放置してました。
すみません。

いろいろあって学校を卒業して、今はアルバイトで働きながらニートしてます。


そういうことで最近触り始めたXAudio2の初期化を書きます。

その前に、XAudio2とは何ぞや?って人がいると思うので一言で説明すると、
「DirectSoundの後継」です。

XBOXとかあの辺と一緒になった感じだと思っていただければいいかと思います。(知識不足なので違うかもしれません)

そんなわけで以下は初期化コード。
事前にプロジェクトのVC++ディレクトリのインクルードディレクトリとライブラリディレクトリにDirectXのパスを通しておくこと。

// ----------------------------------include
#include <xaudio2.h>

// ----------------------------------global
IXAudio2*                g_pXAudio2 = nullptr;
IXAudio2MasteringVoice*  g_pXAudio2MasteringVoice = nullptr;

// ----------------------------------prototype
bool Init(); // 初期化関数
void Cleanup(); // 後処理関数

// エントリポイント
int main()
{
    if ( Init() )
    {
        // 初期化失敗
        Cleanup();
        return 1;
    }

    // 初期化成功
   
    
    // 後処理
    Cleanup();

    return 0;
}

// 初期化関数
bool Init()
{

    // COMライブラリ初期化
    if ( FAILED( CoInitializeEx( NULL, COINIT_MULTITHREADED ) ) )
    {
        return true;
    }

    // XAudio2のインスタンスを生成
    if ( FAILED( XAudio2Create( &g_pXAudio2, 0 ) ) )
    {
        return true;
    }

    // MasteringVoiceの生成
    if ( FAILED( g_pXAudio2->CreateMasteringVoice( &g_pXAudio2MasteringVoice ) ) )
    {
        return true;
    }

    return false;
}

// 後処理関数
void Cleanup()
{
    // MasteringVoiceが生成されていれば破棄
    if ( g_pXAudio2MasteringVoice != nullptr )
    {
        g_pXAudio2MasteringVoice->DestroyVoice();
        g_pXAudio2MasteringVoice = nullptr;
    }

    // XAudio2が生成されていれば破棄
    if ( g_pXAudio2 != nullptr )
    {
        g_pXAudio2->Release();
        g_pXAudio2 = nullptr;
    }

    // COMの破棄
    CoUninitialize();
}

コピペしてるわけではないので誤字があるかもしれません。
ちょっとだけ綺麗に書くように心がけてみました。
HRESULTでエラーを返すようなことはしてませんが、その辺がわかる人はちゃんと返しましょう。


今回はここまでです。お疲れ様でした。

GGJ終わりました

GGJ終わりましたね。

今回プログラマーとして参加しました。

いろいろありましたけど楽しかったのかなーって思います。


とりあえず収穫としては

  • Unityが使えないと役立たず
  • チームの足を引っ張ると意見が通らない

の2つくらいですかね。

Unityが使えないと無能判定され「こいつに時間を割くならできる人がやって」って言われることがあるので、僕みたいにメンタルが弱い人はなかなかの環境になると思います。

やっぱりチームの足を引っ張ると無能判定をされ、プログラミングだろうが、プランニングだろうが、何もできない奴と思われます。

人によってはかなり成長できたりするそうです。


これから参加する人はこういうことに臆することなく頑張ってほしいと思います。


では。















































最後に
次のゲームジャムは誰かに誘われない限りは絶対に行くことはないです。

OpenGL始めました

ラインで立方体描く!
マウス左ボタンで立方体が回転!
(ただのメモ書きなんて言えない…)

#include <stdlib.h>

#include <GL/glut.h>
#include <string>

using namespace std;

#define MAX_POINTS 100		// 記憶する点の数
GLint point[MAX_POINTS][2];	// 座標を記憶する配列
int pointNum = 0;		// 記憶した座標の数
int rubberBand = 0;		// ラバーバンドの消去

GLdouble vertex[][3] = 
{
	{ 0.0, 0.0, 0.0 }, 
	{ 1.0, 0.0, 0.0 }, 
	{ 1.0, 1.0, 0.0 }, 
	{ 0.0, 1.0, 0.0 }, 
	{ 0.0, 0.0, 1.0 }, 
	{ 1.0, 0.0, 1.0 }, 
	{ 1.0, 1.0, 1.0 }, 
	{ 0.0, 1.0, 1.0 }  
};

int edge[][2] = 
{
	{ 0, 1 },
	{ 1, 2 },
	{ 2, 3 },
	{ 3, 0 },
	{ 4, 5 },
	{ 5, 6 },
	{ 6, 7 },
	{ 7, 4 },
	{ 0, 4 },
	{ 1, 5 },
	{ 2, 6 },
	{ 3, 7 } 
};

void Display();
void Init();
void Resize(int w, int h);
void Mouse(int button, int state, int x, int y);
void Keybord(unsigned char key, int x, int y);
void Idle();

int main(int argc, char* argv[])
{
	string winName = "test window";

	// OpenGL初期化
	glutInit(&argc, argv);

	// ディスプレイの表示モード設定
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

	// ウィンドウ生成
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(400, 400);
	glutCreateWindow(winName.c_str());

	// ウィンドウが開かれたり、隠れて再び現れたりするとウィンドウを再描画する関数
	glutDisplayFunc(Display);

	// なにこれ
	glutReshapeFunc(Resize);

	// マウス
	glutMouseFunc(Mouse);

	// キーボード
	glutKeyboardFunc(Keybord);

	// アプリケーション初期化
	Init();

	// メインループ
	glutMainLoop();

	return 0;
}

void Display()
{
	// ウィンドウのクリア関数
	glClear(GL_COLOR_BUFFER_BIT);

	glLoadIdentity();
	
	// 視点位置と視線方向
	gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

	// 図形の回転
	static int rot = 0;
	glRotated((double)rot, 0.0, 1.0, 0.0);

	// 図形の描画
	glColor3d(0.0, 1.0, 0.0);
	glBegin(GL_LINES);
	for (int i = 0; i < 12; i++)
	{
		glVertex3dv(vertex[edge[i][0]]);
		glVertex3dv(vertex[edge[i][1]]);
	}
	glEnd();

	glutSwapBuffers();

	// 1周回ったら回転角を0に戻す
	if (++rot >= 360) rot = 0;
}

void Mouse(int button, int state, int x, int y)
{
	switch (button)
	{
	case GLUT_LEFT_BUTTON:
		if (state == GLUT_DOWN)
		{
			// アニメーション開始
			glutIdleFunc(Idle);
		}
		else
		{
			glutIdleFunc(0);
		}
		break;
	case GLUT_RIGHT_BUTTON:
		if (state == GLUT_DOWN)
		{
			glutPostRedisplay();
		}
		break;

	default:
		break;
	}
}

void Idle()
{
	glutPostRedisplay();
}

void Resize(int w, int h)
{
	glViewport(0, 0, w, h);

	// プロジェクション変換行列
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);

	// ビュー変換行列
	glMatrixMode(GL_MODELVIEW);
}


void Keybord(unsigned char key, int x, int y)
{
	switch (key)
	{
	case 'q':
	case 'Q':
	case '\033':	// '\033'はESCのASCIIコード
		exit(0);
	default:
		break;
	}
}

void Init()
{
	glClearColor(0.3, 0.3, 0.3, 1.0);
}

f:id:EorF:20151119020134p:plain

参考サイト:
GLUTによる「手抜き」OpenGL入門

インターン経過のほーこく & 小ネタ

お久しぶりです。EFです。

 

現在、インターンでコンシューマー機のゲームを開発しています。

やはりPCと違ってスペックが低かったり、操作が異なるので今までとは一味違う苦しさを味わっています。

 

技術面では社内ライブラリ(多くの関数をまとめたもの)を使用しているので特に困ったことはないのですが(本当はあるが)、コーディングが意外と難しかったりします。

 

いつもは ”できるだけコードを短く書く" とか気にしたことがなかったので、1画面に収まらない関数がいっぱいありました。やはりコードが汚なかったり、無駄に長いとバグの発見やコードの修正、可読性(読みやすさ・理解しやすさ)を失ったりと大変です。

 

なので少しでも短く書くための方法をメモっておきます。

自分用なので低レベルな話です。当たり前じゃんと思った方はスルーしてください・・・。

bool GetIsDead()

{

  if(GetHp() <= 0)

  {

    return true;

  }

  else

  {

    return false;

  }

}

これはオブジェクトが死亡かどうかを取得する関数です。動作自体は問題ありませんが、見て通り長いです。C言語を少し知っている人であれば三項式使えば楽じゃん!ってなるかと思います。

bool GetIsDead()

{

  return GetHp() <= 0 ? true : false;

}

三項式とは

条件式 ? 条件式が真の時の処理 : 条件が偽の時の処理; 

という記述ができる便利なものです。

これで凄く短くなりましたね。

 

ですがもう一度考えてみてください。

GetHp() <= 0 (Hpが0以下であれば)

であればtrue、そうじゃないときはfalseを返したい処理ですね。

 

もう解った方もいらっしゃると思いますが、これはすごく無駄です。

何が無駄かというと三項式が無駄です。

 

条件式の結果をわざわざ true なのか false を設定して返しています。

どういうことかと言えば、こういうことです。

bool GetIsDead()

{

  return GetHp() <= 0;

}

そう、条件式の真偽が結果を返せばいいだけの話です。

条件式を評価すると結果はbool型になるのでこの書き方でも問題ありません。

プログラミングを始めたばかりの方は意外と気づかなかったりします。

(記事主は三項式で書いていたなんて言えない・・・)

 

そんなこんなで今回は以上です。

できるだけコードを短く書くため言語仕様を知ったりアルゴリズム(処理のパターン化)を覚えると簡潔かつ理解しいやすいコードが書けるので是非調べてみてください。

 (今日が山場だ・・・)

TokyoEDGE2015参加しました。

今日はEvent for Diverse Game Engineersに参加しました。

参加した方々は現場のプロだったり学生だったりいろいろな方がいらっしゃいました。

 

セミナーの内容は

セッション

・shared_ptrとゲームプログラミングでのメモリ管理

Unreal Engine 4とUnreal C++でのプログラミング環境について

・元コンシューマ系PGがアケゲ開発やってみた ~アケゲ開発でのC++

 

LTタイトル

・思い描いてるものを形にするための事前準備

・JUCEで作るオーディオアプリケーション

プログラマ生存戦略 ~生き残る為に出世しろ~

 

の6本でした。

 

スマートポインタのマニアックな話から話題のゲームエンジンについて、生存戦略など面白いものが多かったです。

 

特に生存戦略は外では言えないアレコレを某サウンドプログラマさんがお話しをなさってました。

自分も将来のことを考えないといけないので大変ためになるお話でした。

 

いろいろな方とおしゃべりする中で自分の実力の低さを改めて感じました。

まだまだこれからではありますが、気を引き締めていかないといけないと思いました。

 

そして、登壇者、参加者の皆さまお疲れ様でした。またこういうイベントがあれば是非お逢いしましょう。

 

それでは。

第1回 ---プログラミングしたことないんだけど---

なんかゲーム作ってみたくて調べたらプログラムを書いたらできるらしい!

 

でもプログラミングなんてできない・・・。

そもそもプログラミングを何か知らない・・・。

 

そういう人のための「ここ」です。

 

プログラミングの基本的なところを解り易く解説して、小さいゲームを作っていこうと思います。

 

ブログ主もプログラミング始めて1年半の初級者ですが、何とかゲームを作っています(汗

 

そんなこんなで次回からゲームを作りたい人のためのプログラミング講座をやっていきますのでよろしくお願いします。

 

不定期な投稿ですが時間があれば書くようにするので、せかしたい人はTwitterで @_EorF と調べるとブログ主が出てくるのでどうぞ。

 

では。

はじめまして

はじめまして。EFです。

 

プログラミング初心者がだらだら書いていくのでだらだら読んで下さると喜びます。

 

では。