如有雷同,我是抄袭 偶尔e网事 童鞋的。
其实我就是讨厌cocos2d-x滥用单例类,作用划分的不清晰。。。。。
在GameLayer里加入planeLayer和BulletLayer。同时因为BulletLayer里子弹的初始位置在飞机sprite的头部,所以需要持有sprite,所以要把planeLayer的实例传给BulletLayer。
因此BulletLayer是酱紫:
class BulletLayer : public Layer
{
public:
BulletLayer(PlaneLayer* apGameLayer);
~BulletLayer();
void AddBullet(float dt);
void StartShoot(float dt);
void MoveFinished(Node* pSender);
private:
SpriteBatchNode* m_pBulletBatchNode;
CCArray* m_pAllBulletArray;
PlaneLayer* m_pPlaneLayer;
};
#include "BulletLayer.h"
#include "GameLayer.h"
#include <functional>
BulletLayer::BulletLayer(PlaneLayer* apGameLayer)
: m_pPlaneLayer(apGameLayer)
{
bool res = cocos2d::Layer::init();
Texture2D* lpTexTure = TextureCache::sharedTextureCache()->addImage("shoot.png");
m_pBulletBatchNode = SpriteBatchNode::createWithTexture(lpTexTure);
addChild(m_pBulletBatchNode);
m_pAllBulletArray = Array::create();
}
void BulletLayer::AddBullet( float dt )
{
Sprite* bullet = Sprite::createWithSpriteFrameName("bullet1.png");
m_pBulletBatchNode->addChild(bullet);
Point planePoint = m_pPlaneLayer->getChildByTag(1)->getPosition();
Size planeSize = m_pPlaneLayer->getChildByTag(1)->getContentSize();
const Point bulletPos = ccp(planePoint.x, planePoint.y+planeSize.height/2);
bullet->setPosition(bulletPos);
float length = CCDirector::sharedDirector()->getWinSize().height + planeSize.height/2-bulletPos.y;
float velocity = 420/1;
float realMoveDuration = length/velocity;
FiniteTimeAction* actionMove = MoveTo::create(realMoveDuration,ccp(bulletPos.x
,CCDirector::sharedDirector()->getWinSize().height + planeSize.height/2));
FiniteTimeAction* actionDone = CCCallFuncN::create(this,callfuncN_selector(BulletLayer::MoveFinished));
Sequence* sequence = Sequence::createWithTwoActions(actionMove,actionDone);
bullet->runAction(sequence);
}
void BulletLayer::StartShoot( float dt )
{
schedule(schedule_selector(BulletLayer::AddBullet),0.2f, kRepeatForever,dt);
}
void BulletLayer::MoveFinished(Node* pSender)
{
Sprite* bullet = static_cast<Sprite*>(pSender);
m_pBulletBatchNode->removeChild(bullet, true);
bullet->release();
}
BulletLayer::~BulletLayer()
{
}
这里一点经验,如果有互相包含的话,一定要用前置声明,这里我偷懒了,不过编译没问题。好吧,大家要看源码,去下载吧。
http://pan.baidu.com/share/link?shareid=4044277731&uk=153311302