読者です 読者をやめる 読者になる 読者になる

Dr. 三日坊主

日々の勉強の記録 AIそして英語

【AI】ゲームAIスタディ-準備(1/2)

「ゲーム開発者のためのAI入門」を1周読破。

追跡や迎撃、群れの挙動から、ニューラルネットワーク遺伝的アルゴリズムまで、アルゴリズムの仕組みから実装まで詳しく書かれており、読むだけでも十分おもしろい本だった。

ゲーム開発者のためのと謳っているが、ゲーム以外のところでも十分使えそうな内容。

 

サンプルコードもダウンロードできるので、2周目は実際に手を動かしながら読み進めたい。サンプルは以下のページ右側のDownloaded Example Codeから。

www.oreilly.com

 

サンプルコードを見ると、サンプルによって環境が違う...

windowsのVC6かmacのCodewarrior8か。

 

開発環境はmacしかないので、xcodeで動かす準備をした。

アルゴリズムの勉強だけならコマンドラインツール環境でもいいのだが、せっかくなので連続動作環境で開発したい。

しかし残念ながら、Cocoa Applicationをc++で開発することはできないようなので、Cocos2d-xを使うことにした。

 

導入は以下のブログを参考にさせていただいた。

qiita.com

 

準備

とりあえず、作成されたプロジェクトを開き、macのアプリとして実行してみる。

タイトル画面のような画面がでるので、これをそのままホーム画面として使わせてもらおう。

ちなみに画面のサイズはここで変更できる。

 

AppDelegate.cpp

static cocos2d::Size designResolutionSize = cocos2d::Size(1024, 768);

 

ホーム画面

"Hello World"を"AI for Game Developer"に変更。

その下にそれぞれのチャプターごとの稼働場所へ飛ぶボタンを作った。

 

HelloWorldScene.h

class HelloWorld : public cocos2d::Layer
{
public:
	enum eBUTTON {
		eBUTTON_START = 0,
		eBUTTON_CHAPTER2 = eBUTTON_START,
		eBUTTON_CHAPTER3,
		eBUTTON_NUM,
	};
public:
    static cocos2d::Scene* createScene();

    virtual bool init();
    
    // a selector callback
    void menuCloseCallback(cocos2d::Ref* pSender);
	
    // 画面遷移ボタン押下時の挙動.
    void selectchapterbtn(cocos2d::Ref* pSender, int btnid);
    
    // implement the "static create()" method manually
    CREATE_FUNC(HelloWorld);
	
};

 

HelloWorldScene.cpp

static const std::string btntext[HelloWorld::eBUTTON_NUM] = {
	"Chapter 2",	// eBUTTON_CHAPTER2
	"Chapter 3",	// eBUTTON_CHAPTER3
};

bool HelloWorld::init() {

   /* --- 略 --- */
    /////////////////////////////
    // 3. add your codes below...

    // add a label shows "Hello World"
    // create and initialize a label
    
    auto titlelabel = Label::createWithTTF("AI for Game Developer", "fonts/arial.ttf", 24);
    
    // position the label on the center of the screen
    Vec2 titlePos(Vec2(origin.x + visibleSize.width/2,
		   origin.y + visibleSize.height - titlelabel->getContentSize().height));
    titlelabel->setPosition(titlePos);

    // add the label as a child to this layer
    this->addChild(titlelabel, 1);
	
	// 画面遷移ボタン.
	for (int i = eBUTTON_START; i < eBUTTON_NUM; ++i) {
		Vec2 pos( titlePos.x, titlePos.y - 20 - 25*(i+1) );
		Label* pbtnlabel = Label::createWithTTF(btntext[i], "fonts/arial.ttf", 20);
		pbtnlabel->setTag(i);
		auto pBtn = MenuItemLabel::create(pbtnlabel, CC_CALLBACK_1(HelloWorld::selectchapterbtn, this, i));
		
		Menu* pMenu = Menu::create(pBtn, NULL);
		pMenu->setPosition(pos);
		this->addChild(pMenu, 1);
	}
/* --- 略 --- */
}

// 画面遷移ボタン.
void HelloWorld::selectchapterbtn(cocos2d::Ref* pSender, int btnid)
{
	switch (btnid) {
	case eBUTTON_CHAPTER2:
		log("chapter 2");
		break;
	case eBUTTON_CHAPTER3:
		log("chapter 3");
		break;
	default:
		break;
	}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
	exit(0);
#endif
}

とりあえず、ボタンを押すとログだけ出るようにした。

背景のアイコンは「ゲーム開発者のためのAI入門」で作ったidenticonに変更。
デバッグ情報も出さないようにした。

f:id:merakuma:20170110005359p:plain

 今日はここまで

 

ゲーム開発者のためのAI入門

ゲーム開発者のためのAI入門