Mais conteúdo relacionado
Semelhante a ㉓cocos2dでゲームを作ろう!その1 (20)
Mais de Nishida Kansuke (20)
㉓cocos2dでゲームを作ろう!その1
- 2. 動作環境
• Mac OS X 10.8 Mountain Lion
• xcode 4.4.1
• cocos2d for iPhone 2.0
http://www.cocos2d-iphone.org/
- 4. もくじ
• ゲームの仕様を決めよう
• 素材を作成しよう
• 音楽を用意しよう
• ゲーム作りのコツ①
• sceneの実装方法
• タイトル画面を作ろう
- 17. スプライトシート
• 1枚の画像ファイルに1枚の画像を保存するので
はなく、1枚の画像に複数画像を保存する技術
• ファイルアクセスが減るので読み込み効率がよく
なる!
• 画像をまとめるので、メモリ上での無駄が減る!
• 1回の描画で複数のキャラクターを書けるので描
画速度が上がる!
• スプライトシートごとに、表示順がきまるので、
同じ奥行きに配置するものをまとめる必要がある
- 20. メインscene
• フロントlayer
– スコア
– 残機表示
• メインlayer
– カウントダウン、ゲームオーバー
– エフェクト(+1、 )
– 忍者
• 背景layer
– 背景画像
- 32. 音楽素材について①
• 音楽素材については、PANICPUMPKIN様
のご好意により、使用させていただいてい
ます。
• http://panicpumpkin.omiki.com/
• ゲームBGMに特化したサイトなのでおす
すめ!(曲数も多いです)
• 利用報告、 著作表記、リンクなどの明記
不要で商用利用可能の音楽素材を多数公
開されています。
- 34. 効果音作成
• cfxr
– http://thirdcog.eu/apps/cfxr
– 効果音作成ソフト
– 無料
- 35. cafの変換
• toCaf
– http://tonosamart.com/tonolib/mac/
toCaf/
– 音楽ファイルをcaf変換
– 無料
TIPS:
afconvert -f caff -d ima4@22050
- 39. 制御はどこでやる?
• MainSceneに処理を集中させる
– 見通しが良くなって、各sceneの処理がすっきりする!
– 当たり判定やイベントなどがあるため、完全に処理を
sceneだけでやるのは難しい
• 各レイヤーに処理を分散させる
– 当たり判定やイベントの処理などが楽!
– scene遷移などがどこで行われてるかよくわからなくなる
など、見通しが悪くなる
→どっちもどっちなので、適当に分散させて言い感じに
すればいいと思う!(大規模になったら、画面遷移は
MainSceneなどのルールを作ろう!)
- 40. sceneとlayerのやりとり
• delegateを実装する
– ちょっと面倒。でもわかりやすい!
• sceneからlayerを監視する
– layerにフラグなどを用意し、変化を監視する
• layerからsceneを経由して、やりとりをする
– parentが取得できるので、layerのparentで
sceneを取得して、やりとりをする
→他にも方法はある!。一長一短なので、適当
に良い感じにやるといいと思う!
- 42. GameData.h
@interface GameData : NSObject
@property int score;
@property int life;
@property float ninjaSpeed;
@property int ninjaMax;
+ (GameData*)getInstance;
@end
- 45. TitleScene.m
-(id)init{
self = [super init];
if (self) {
self.bgLayer = [CCLayerColor layerWithColor:ccc4(36, 36,
255, 255)];
[self addChild:self.bgLayer z:LAYER_BG tag:LAYER_BG];
self.frontLayer = [FrontLayer node];
[self addChild:self.frontLayer z:LAYER_FRONT
tag:LAYER_FRONT];
self.titleLayer = [TitleLayer node];
[self addChild:self.titleLayer z:LAYER_TITLE
tag:LAYER_TITLE];
}
return self;
}
- 46. TitleScene.m
- (void)onEnterTransitionDidFinish{
[[SimpleAudioEngine sharedEngine]
playBackgroundMusic:@"title.caf"];
[self schedule:@selector(tick:)];
}
-(void)tick:(ccTime)dt{
if(self.titleLayer.isStart){
self.titleLayer.isStart = NO;
[[CCDirector sharedDirector] replaceScene:
[CCTransitionFade transitionWithDuration:1.0f scene:
[MainScene node] withColor:ccc3(0, 0, 0)]];
}
}
- 48. FrontLayer.m
-(void)initLayer{
CCSprite* sprite = [CCSprite spriteWithFile:@"fg.png"];
sprite.position = ccp(160, 240);
[self addChild:sprite z:OBJECT_FG tag:OBJECT_FG];
CCLabelAtlas *label;
label = [[CCLabelAtlas alloc] initWithString:@"" charMapFile:@"score.png"
itemWidth:48 itemHeight:64 startCharMap:' '];
label.position = ccp(8, 416);
[self addChild:label z:OBJECT_SCORE tag:OBJECT_SCORE];
label = [[CCLabelAtlas alloc] initWithString:@"" charMapFile:@"life.png" itemWidth:
240 itemHeight:56 startCharMap:'0'];
label.position = ccp(0, 8);
[self addChild:label z:OBJECT_LIFE tag:OBJECT_LIFE];
[self drawData];
}
- 49. FrontLayer.m
-(void)drawData{
GameData *gameData = [GameData getInstance];
CCLabelAtlas *label;
label = (CCLabelAtlas*)[self
getChildByTag:OBJECT_SCORE];
[label setString:[NSString stringWithFormat:@"%5d#$",
gameData.score]];
label = (CCLabelAtlas*)[self
getChildByTag:OBJECT_LIFE];
[label setString:[NSString stringWithFormat:@"%d",
gameData.life]];
}
- 51. TitleLayer.m
-(void)initLayer{
// SPRITE
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"title.plist"];
CCSpriteBatchNode *titleBatchNode = [CCSpriteBatchNode
batchNodeWithFile:@"title.pvr.ccz" capacity:30];
[self addChild:titleBatchNode z:OBJECT_TITLE
tag:OBJECT_TITLE];
CCSprite *sp;
sp = [CCSprite spriteWithSpriteFrameName:@"logo.png"];
sp.position = ccp(160, 300);
[titleBatchNode addChild:sp];
- 52. TitleLayer.m
CCSprite* dsp;
sp = [CCSprite spriteWithSpriteFrameName:@"play.png"];
dsp = [CCSprite spriteWithSpriteFrameName:@"playx.png"];
CCMenuItemSprite *playItem = [CCMenuItemSprite
itemWithNormalSprite:sp
selectedSprite:dsp
disabledSprite:nil
target:self
selector:@selector(menuPlay:)];
playItem.position = ccp(160, 136);
- 53. TitleLayer.m
CCMenu *menu = [CCMenu
menuWithItems:playItem , nil];
menu.position = ccp(0, 0);
[self addChild:menu z:OBJECT_MENU
tag:OBJECT_MENU];
}
-(void)menuPlay:(id)sender{
self.isStart = YES;
}
- 54. 全体のまとめ
• タイトルscene
– フロントlayer
• スコア表示、残機表示
– タイトルlayer
• ロゴ表示、スタートボタン表示
• スタートボタンが押されたら、isStart=YES
– 背景layer
• 背景画像表示
※タイトルsceneでは、タイトルlayerの
isStartを監視して、YESになったらscene遷移
- 55. まとめ
• 画面遷移ができるようになった!
• レイヤーとかが作れるようになった!
• あとは、ゲーム画面をつくってみよう!
• cocos2d 1.0.の資料だけど、参考に!
– http://tonosamart.com/blog/