14年毕业那会到念研究生前去公司写了快一年的cocos2dx,独自开发了三个半游戏(后续再慢慢补上来),算是进公司后从零起步的cocos2dx, c++以及mac开发,当时总结了一些cocos2dx的基本code,现在放上来一起share希望能有帮助。
Tips(字体:普通;字体:注意;字体:注释):
1.关于AppDelegate:
设置主分辨率、FPS和起始界面
2.创建Scene和Layer的不同:
1)static cocos2d::CCScene* scene()/static DrawLayer* create(故在init()中也有不同)
2).h文件中末尾还要加CREATE_FUNC(…)
3).跳转和出现:
CCDirector::sharedDirector()->replaceScene(HelloWorld::scene1());
YouLoseLayer *layer = YouLoseLayer::create();this->addChild(layer, 2);
//回到上一层
this->removeFromParent();
3.获取坐标系:
CCSize visibleSize;
CCPoint origin;
visibleSize = CCDirector::sharedDirector()->getVisibleSize();
origin = CCDirector::sharedDirector()->getVisibleOrigin();
4.精灵(图片):
CCSprite pSprite = CCSprite::create("tittle.png");
pSprite->setPosition(ccp(visibleSize.width/2.0f + origin.x, visibleSize.height/1.3f));
this->addChild(pSprite, 1);
5.按钮:
1).同时也自带了两图片切换功能
void menuMusicCallback(CCObject* pSender);
pMusicItem = CCMenuItemImage::create("soundoff.png","soundon.png",this,menu_selector(HelloWorld::menuMusicCallback));
pMusicItem->setPosition(ccp(origin.x + visibleSize.width/1.2f ,origin.y + visibleSize.height/5.0f));
CCMenu* pMenu = CCMenu::create(pMusicItem,NULL);
pMenu->setPosition(CCPointZero);
//设置优先级(与6相关)
pMenu->setTouchPriority(kCCMenuHandlerPriority);
this->addChild(pMenu, 1);
2).用精灵来做图片,在CCTouchBegan中画区域并写相关功能
6.触摸:
bool ccTouchBegan(CCTouch* touch, CCEvent * pevent);
void ccTouchEnded(CCTouch* touch, CCEvent* event);
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);
void registerWithTouchDispatcher();
//kCCMenuHandlerPriority=-128,将这个值设置为-128的二倍,可以比下边的层的优先级高;而且ccTouchBegan的返回值为true,说明其他的层将接受不到这个触摸消息了,只有这个层上边的菜单的优先级比他还要大,所以它上边的菜单是可以接收到触摸消息的
void HelloWorld::registerWithTouchDispatcher(){
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority*2, false);
}
7.android手机上的menu及back键:
setKeypadEnabled(true);
virtual void keyBackClicked();
void HelloWorld::keyBackClicked(){CCDirector::sharedDirector()->replaceScene(QuitGameLayer::scene());}
8.声音:
//加载下一场景音效
CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/button.mp3");
//播放
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("sound/button.mp3");
9.有时差的跳转:
scheduleOnce(schedule_selector(P1WinLayer::retryCallback), 0.2f);
10.使用字体:
首先要在info.plist的fonts provided…中添加;
注意iOS和android的不同(iOS要现在字体册中找到他真正的名字):
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
const char *FONT_NAME = "Tahoma";
#else
const char *FONT_NAME = "fonts/tahomabd.ttf";
#endif
11.本地存储:
CCUserDefault::sharedUserDefault()->setIntegerForKey("Bg", bg);
CCUserDefault::sharedUserDefault()->flush();
bg = CCUserDefault::sharedUserDefault()->getIntegerForKey("Bg");
12.打印信息分类:
CCLog("----- gametest ----- %f, %f",visibleSize.width,visibleSize.height);
13.使用标签显示文字:
CCLabelTTF* pLabel = CCLabelTTF::create("Easy", FONT_NAME, 24);
pLabel->setPosition(ccp(visibleSize.width/2 + origin.x - pSprite->getContentSize().width/2.5f, visibleSize.height/2.15f + pSprite->getContentSize().height/2.2f));
this->addChild(pLabel, 1);
14:关于普通格式到CCString的转换:
CCString* dtotal=CCString::createWithFormat("%d",edraw+mdraw+hdraw);
CCString* pppercent1=CCString::createWithFormat("%.0f",ppercent1);
eewin->getCString()方可在CCLabel中显示
15.关于调节精灵大小:
rate->setScale(1.0f);
16.关于移除精灵:
sprite->setTag(22+col);
removeChildByTag(22);
17.关于精灵图片做动作(组合):
CCMoveTo *move = CCMoveTo::create(0.3f, ccp(mapW[22+col],mapH[22+col]));
CCJumpTo *move2=CCJumpTo::create(0.3f, ccp(0,0), sprite->getContentSize().height/2, 1);
//反弹效果
CCActionInterval* actionByBack=move2->reverse();
sprite->runAction(CCSequence::create(move,actionByBack,NULL));
18.获取触摸点:
CCPoint location = touch->getLocationInView();
location =CCDirector::sharedDirector()->convertToGL(location);
19.使弹出框背景灰暗:再加一层精灵
bg = CCLayerColor::create(ccc4(100, 100, 100, 150(透明度)));
addChild(bg,1);
20.关于精灵的批处理:
_batch = CCSpriteBatchNode::create("ball1.png");
addChild(_batch);
CCSprite* sprite = CCSprite::createWithTexture(_batch->getTexture());
_batch->addChild(sprite);
21.关于分辨率适配的问题:
g_fScreenSwitch=CCDirector::sharedDirector()->getVisibleSize().width/CCDirector::sharedDirector()->getVisibleSize().height;
关于IOS设备:3.5inch(0.66,3:2)、4inch(0.56,16:9)、ipad(0.75,4:3)、iphone5s(0.5633,1.775)、iphone6(1.778)
其他主要长宽比:3:2、4:3、5:3、9:5、16:10、16:9(注:有些android手机上写的分辨率是伪分辨率)
22.给app添加广告(Google Ads):
1.导入“flurry 、Admob 、Chartboost” ;
在IOS中添加Chartboost:
1).拷贝libChartboost.a Chartboost.h 到目录proj.ios下
2).在Xcode中 "ios"目录 右键点击Add Files to " " 添加上述两文件
3).将Build Settings -> Search Paths -> Library Search Paths前三项改为:
"$(SRCROOT)/../../../external/libwebsockets/ios/lib"
"$(SRCROOT)/../../../cocos2dx/platform/third_party/ios/libraries"
"$(SRCROOT)"
4).Build Phase -> Link Binary With Libraries 中添加SystemConfiguration.framework、StoreKit.framework、AdSupport.framework、MessageUI.framework(最好是对比下其他成功项目,看看还缺什么包,补全。一般在“Link Binary With Libraries”中有22 个items,也可能会是21个items,依据情况而定)。
在IOS中添加Flurry:
1).拷贝libFlurry_4.3.0.a Flurry.h 到目录proj.ios下
2).在Xcode中 "ios"目录 右键点击Add Files to " " 添加上述两文件
在IOS中添加Admob:
Add StoreKit, MessageUI and AdSupport to both target
Go to Project settings > Build Settings >Linking. And set -ObjC in Other Linker Flags.
2、根据参考项目修改AppController.h和AppController.cpp文件(注意:这两个文件里头,需要添加头文件,要添加相应路径)。
3、在ios文件夹下新建Obejective-C class文件,命名:IOSPlatformCallback,得到IOSPlatformCallback.h、IOSPlatformCallback.m两个文件,根据参考项目修改这两个文件。
4、拷贝NativeBridge.h和NativeBridge.cpp文件,
将项目导入Eclipse中(没来香港之前用的还是eclipse+ADT开发的android):
1).添加NDK_ROOT,右键项目Properties—>C/C++ Build—>Environment—>Add,新建 name:NDK_ROOT,value:NDK所在的绝对路径。
2).将目标项目导入Eclipse后,再将 google-play-services_lib 导入到Eclipse中,该项目不是一个Android项目,所以不要将导成Android项目,而应该是General->Existing Projects Into Workspace
3).右击项目,选择Properties—>Android—>Library—>Add-google—>play-services_lib确定。
4). 参照参考项目,在项目的src目录下添加GameHelper.java文件
5). 在Manifest文件中添加相应服务和权限参照参考项目,并在application节点中添加如下节点:
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" />
6). 在主activity中添加所需代码(参考成功项目),在添加代码过程中,注意activity中有一个静态方法,括号中的参数名应该与jni目录下的Android.mk中的“LOCAL_MODULE:= ”后面的_shared之前的字符串相同
static {System.loadLibrary("cocos2dcpp"); }
7).在res—>values目录下修改strings.xml文件(参照参考项目)和添加新建ids.xml文件(直接粘贴过来即可)。
23.广告升级android Chartboost(替换lib并参考):
主要修改的func:
1. addChartboostAds()
2.onStart()
3.onResume()
4.onKeyDown()
5.onPause()
6.onStop()
7.onDestory()
8.onBackPressed
9.onMoreclicked()
10.showInterstitial()
附录:
1.mac上使用终端创建项目:
先cd Documents/cocos2dx2.2.3/tools/project-creator
Cocos2dx2.X.X—./create_project.py -project HelloWorld -package com.coolgames.Helloworld -language cpp
Cocos2dx3.X.X—python create_project.py…
2.当手机app挂掉后再连电脑,通过终端查看错误信息:
adb logcat | grep E/
3.错误集锦:
EXC_BAD_ACCESS之类的可以看看精灵是不是为null,説明图片未载入;
Linker command failed with exit code1(有文件相同,确认粘贴过来的代码中class头换了吗);
ld:library not found for -l(添加广告时,lib的添加有问题,如cocos2dx.a是否存在);
退出游戏时报错(都和内存有关):
Fatal signal 11(SIGSEGV);
invalid heap address in dlfree;
版权声明:本文为博主原创文章,转载必注明http://blog.csdn.net/u011394069/article/details/79386052