新场景
#pragma once
#include "cocos2d.h"
class GmOvLayer : public cocos2d::CCLayerColor
{
public:
GmOvLayer(void);
virtual ~GmOvLayer(void);
bool init();
CREATE_FUNC(GmOvLayer);
static cocos2d::CCScene* scene();
void setLableCont(char *str);
void menuHandle(CCObject* pSender);
private:
cocos2d::CCLabelTTF *m_lb;
};
要让cocos2d-x 来管理内存对象 ,你所写的每一个对象必须继承 于ccobject .
如果是new 出来的对象 ,初始retainCount 为1 , 这个对象 默认是由你 手动来释放的 (调用ccobject 的release , 如果retainCount 为0 ,cocos2d-x会delete 掉这个对象)。
如果new 出来的对象调用 了autorelease(),对象 就完全由cocos2d-x来管理,你不需要去手动release ,它会在某一时刻来自动release.
注意:
1. 当对象没有调用autorelease 时,retainCount 还为1, 那么需要你手动release.否则内存溢出。
2. 如果对象调用 了autorelease ,但是后面你如果还想用到这个对象你需要手工retain一下。 retain 会导致retainCount 加1 ,所以retain后,如果你不想用了记得release掉。
#include "GmOvLayer.h"
#include "HelloWorldScene.h"
USING_NS_CC;
GmOvLayer::GmOvLayer(void)
{
}
GmOvLayer::~GmOvLayer(void)
{
if(m_lb)
{
m_lb->release();
}
}
CCScene* GmOvLayer::scene()
{
CCScene *scene = CCScene::create();
GmOvLayer *layer = GmOvLayer::create();
layer->setTag(100);
scene->addChild(layer);
return scene;
}
bool GmOvLayer::init()
{
if(!CCLayerColor::initWithColor(ccc4(255,0,0,255)))
{
return false;
}
CCSize size = CCDirector::sharedDirector()->getVisibleSize();
CCMenuItemImage *pBackItem = CCMenuItemImage::create(
"button2.png",
"button2.png",
this,
menu_selector(GmOvLayer::menuHandle));
pBackItem->setPosition(pBackItem->getContentSize().width/2,pBackItem->getContentSize().height/2);
CCMenu* pMenu = CCMenu::create(pBackItem, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, 1);
m_lb = CCLabelTTF::create("word","artial",40);
m_lb->setPosition(ccp(size.width/2,size.height/2));
this->addChild(m_lb);
m_lb->retain();//保证m_lb跟类对象有相同生命周期
return true;
}
void GmOvLayer::menuHandle(CCObject* pSender)
{
CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
}
void GmOvLayer::setLableCont(char *str)
{
m_lb->setString(str);
}
主场景
添加背景音乐
bool HelloWorld::init()
{
//
// 1. super init first
if ( !CCLayerColor::initWithColor(ccc4(255,255,255,255)))
{
return false;
}
m_arrTar = new CCArray;
m_arrPro = new CCArray;
m_nSucessedCount = 0;
CCSize screenSize = CCDirector::sharedDirector()->getVisibleSize();
CCSprite *pSprite = CCSprite::create("Player.png");
pSprite->setPosition(ccp(20.0,screenSize.height/2));
this->addChild(pSprite);
this->schedule(schedule_selector(HelloWorld::time),2);
this->schedule(schedule_selector(HelloWorld::update));
this->setTouchEnabled(true);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav",true);
return true;
}
添加发射子弹音乐
void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
CCTouch *touch = (CCTouch *)pTouches->anyObject();
CCPoint locInVw = touch->getLocationInView();
CCPoint locInGl = CCDirector::sharedDirector()->convertToGL(locInVw);
CCSize screenSize = CCDirector::sharedDirector()->getVisibleSize();
CCSprite *proj = CCSprite::create("Projectile.png");
proj->setPosition(ccp(20.0,screenSize.height/2.0));
this->addChild(proj);
m_arrPro->addObject(proj);
proj->setTag(2);
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.wav");
double dx = locInGl.x - 20;
double dy = locInGl.y - screenSize.height/2.0;
double d = sqrt(dx*dx + dy*dy);
double D = sqrt(screenSize.width * screenSize.width + screenSize.height * screenSize.height);
double ratio = D/d;
double endx = ratio * dx + 20;
double endy = ratio *dy + screenSize.height/2.0;
CCMoveTo *move = CCMoveTo::create(D/320,ccp(endx,endy));
CCCallFuncN *sd = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::selfdefinedAc));
CCSequence *actions = CCSequence::create(move,sd,NULL);
proj->runAction(actions);
}
添加打怪5个切换成功界面
void HelloWorld::update(float val)
{
CCObject *tar,*pro;
if(5 == m_nSucessedCount)
{
switchScene("success");
}
CCARRAY_FOREACH(m_arrTar,tar)
{
CCSprite *pTar = (CCSprite *)tar;
CCRect rtTar = CCRectMake(pTar->getPosition().x,pTar->getPosition().y,pTar->getContentSize().width
,pTar->getContentSize().height);
CCARRAY_FOREACH(m_arrPro,pro)
{
CCSprite *pPro = (CCSprite *)pro;
CCRect rtPro = CCRectMake(pPro->getPosition().x,pPro->getPosition().y,pPro->getContentSize().width
,pPro->getContentSize().height);
if(rtPro.intersectsRect(rtTar))
{
m_arrTar->removeObject(pTar);
m_arrPro->removeObject(pPro);
pTar->removeFromParentAndCleanup(true);
pPro->removeFromParentAndCleanup(true);
m_nSucessedCount ++;
break;
}
}
}
}
添加有没打到的怪切换失败界面
void HelloWorld::selfdefinedAc(CCNode* pSender)
{
pSender->removeFromParentAndCleanup(true);
int tag = pSender->getTag();
if(1 == tag)
{
m_arrTar->removeObject(pSender);
switchScene("failed");
}
else if(2 == tag)
{
m_arrPro->removeObject(pSender);
}
}
添加切换界面方法
void HelloWorld::switchScene(char* str)
{
CCScene *scene = GmOvLayer::scene();
GmOvLayer *goLayer = (GmOvLayer *)scene->getChildByTag(100);
goLayer->setLableCont(str);
CCDirector::sharedDirector()->replaceScene(scene);
m_nSucessedCount = 0;
}