cocos2d-x の応用 2

7
Chapter
cocos2d-x の応用 2
ゲームでは、キャラクターをジャンプさせて障害物を避けたり、迫りくる敵と激突して
跳ね返ったりなど、物理的な計算が必要な場合があります。こうした物理計算は、物
理が得意なら問題ないでしょうが、苦手な人も多いでしょう。そんなとき、勝手に物
理演算を行ってくれるものがあれば嬉しいですよね。実は、cocos2d-x には Box2D
とChipmunkという2 つの物理演算用フレームワークが用意されています。あらか
じめ値をセットしておけば、とくに意識することなく物理演算を行ってくれます。なお、
Box2D は C++で、Chipmunk は C 言語で利用します。どちらを利用してもいいの
ですが、ここでは Box2D を利用したゲーム作成を紹介します。
[サンプルゲーム 3:リンゴ大収穫]
7.1
プロジェクトの準備
本章では、落ちてくるリンゴをネコがキャッチするゲームを作成します。ただリンゴが落
ちてくるだけではゲーム性が乏しいので、虫も落としてネコをビックリさせたり、間違って
キャッチすると減点したりもしましょう。リンゴや虫が落ちてくるので、Box2D を利用して重
力を持つ空間を作成します。またオブジェクトが衝突したときの処理も行いたいと思います。
最初にプロジェクトを作成しますが、これまで学んできたことがほとんどなので、さっと
準備を整えましょう。この節では、プロジェクトの作成、背景の表示、ネコの表示、ラベルの
表示を行います。
それではプロジェクトを作成しましょう(プロジェクトの作成方法は、Chapter 5.1 を参
照)。プロジェクト名は「nyancatch」としました。プロジェクト作成後、本書サンプルを利
用してリソースの準備を行いましょう。プロジェクトへリソースを追加しますが、この例で
もマルチレゾリューション対応を行うので、ディレクトリへ追加してください(追加方法は、
Chapter 6.1 を参照)。マルチレゾリューション対応のため、AppMacros.h を作成し、次のよ
うに記述してください(ヘッダファイルの作成方法は、Chapter 2.4 参照)。
■■ AppMacros.h
01 #ifndef __APPMACROS_H__
02 #define __APPMACROS_H__
03
04 #include "cocos2d.h"
05
06 typedef struct tagResource
07 {
08
cocos2d::CCSize size;
09
char directory[100];
10 } Resource;
11
12 static Resource smallResource = { cocos2d::CCSizeMake( 512, 384), "S"};
13 static Resource mediumResource = { cocos2d::CCSizeMake(1024, 768), "M"};
14 static Resource largeResource = { cocos2d::CCSizeMake(2048, 1536), "L"};
15
16 static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(1024, 768);
17
288
7.1
18
19
20
プロジェクトの準備
#define NUMBER_FONT_SIZE (cocos2d::CCEGLView::sharedOpenGLView()->getDesign
ResolutionSize().width / mediumResource.size.width * 48)
#endif // __APPMACROS_H__
フォントサイズの名称が NUMBER_FONT_SIZE と異なっている以外は、Chapter 6
の AppMacros.h と 同 じ で す。次 に AppDelegate.cpp の include と applicationDidFinish
Launching( ) 関数を次のように修正してください。
■■ AppDelegate.cpp
01 #include "AppDelegate.h"
02 #include "AppMacros.h"
03 #include "GameScene.h"
■■ AppDelegate.cpp
01 bool AppDelegate::applicationDidFinishLaunching()
02 {
03
CCDirector* pDirector = CCDirector::sharedDirector();
04
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
05
06
pDirector->setOpenGLView(pEGLView);
07
08
// デザインサイズの設定
09
pEGLView->setDesignResolutionSize(designResolutionSize.width, design
ResolutionSize.height, kResolutionNoBorder);
10
11
CCSize frameSize = pEGLView->getFrameSize();
12
13
std::vector<std::string> searchPath;
14
15
if (frameSize.height > mediumResource.size.height)
16
{
17
// 「L」ディレクトリのリソースを使用する
18
searchPath.push_back(largeResource.directory);
19
pDirector->setContentScaleFactor(MIN(largeResource.size.height / design
ResolutionSize.height, largeResource.size.width / designResolutionSize.
width));
20
}
21
else if (frameSize.height > smallResource.size.height)
22
{
23
// 「M」ディレクトリのリソースを使用する
7
ccccccccc
c
c
c
c
289
24
25
searchPath.push_back(mediumResource.directory);
pDirector->setContentScaleFactor(MIN(mediumResource.size.height / design
ResolutionSize.height, mediumResource.size.width / designResolutionSize.
width));
26
27
28
29
30
31
}
else
{
32
33
34
35
36
37
38
39
40
41
42
43
}
// 「S」ディレクトリのリソースを使用する
searchPath.push_back(smallResource.directory);
pDirector->setContentScaleFactor(MIN(smallResource.size.height / design
ResolutionSize.height, smallResource.size.width / designResolutionSize.
width));
// リソースディレクトリを指定する
CCFileUtils::sharedFileUtils()->setSearchPaths(searchPath);
pDirector->setDisplayStats(true);
pDirector->setAnimationInterval(1.0 / 60);
CCScene* pScene = GameScene::scene();
pDirector->runWithScene(pScene);
return true;
}
これも Chapter 6 と同じです。最初に GameScene クラスを呼び出したいので、HelloWorld
ク ラ ス の フ ァ イ ル を 削 除 し 39 行 目 の よ う に コ ー ド を GameScene に 修 正 し て い ま す
(GameScene クラスがまだ存在しないのでエラーになりますが、この段階では気にせずに先
に進めましょう)。これでマルチレゾリューション対応ができました。
次にゲームのシーンとなる GameScene クラスの GameScene.h と GameScene.cpp ファイ
ルを用意しましょう(クラスの作成方法は、Chapter 2.4 参照)。そして、背景の表示、ネコ
の表示、ラベルの表示を行います。GameScene.h を次のように記述してください。
■■ GameScene.h
01 #ifndef __GAME_SCENE_H__
02 #define __GAME_SCENE_H__
03
04 #include "cocos2d.h"
05
06 USING_NS_CC;
290