[置頂]Cocos 2 d-x『雷電大戦』(3)-弾丸無限発射


林炳文エヴァンカカのオリジナル作品.転載は出典を明記してくださいhttp://blog.csdn.net/evankaka
   本稿では,雷電ゲームでは,ゲームが始まると英雄飛行機が無限に弾丸を発射する機能を実現する.ここでの考え方は、単独で弾丸に層を作り、この層にタイマーを設けず、1時間おきに現在のヒーロー機が伝わる位置に基づいて弾丸を生成し、弾丸の移動イベントを設定し、移動後のイベント(弾丸を削除し、メモリを節約する)を設定することです.
最終的な効果:
Cocos 2 d-xバージョン:3.4
工事環境:VS 30213
一、英雄弾層
1、HeroBulletLayer.h
/**
*                
*      ([email protected]   :http://blog.csdn.net/evankaka)
*   2015.3.14
*/
#include "cocos2d.h"
USING_NS_CC;
const float FlYVElOCITY = 500;//    ,      ,       
class HeroBulletLayer : public cocos2d::Layer
{
public:
	HeroBulletLayer(Node* heroPlane);
	~HeroBulletLayer();
	virtual bool init();

	//          
	static HeroBulletLayer* create(Node* heroPlane);

	//                       
	void removeBullet(Node* pNode);

	//    ,                  ,      
	void ShootBullet(float dt);

	//      
	Vector <Sprite *>& GetBullet();
public:
	Vector <Sprite *>vecBullet;//    
	SpriteBatchNode* bulletBatchNode;//      
	Node* heroPlane;//       
};

2、HeroBulletLayer.cpp
/**
*                
*      ([email protected]   :http://blog.csdn.net/evankaka)
*   2015.3.14
*/
#include "HeroBulletLayer.h"
HeroBulletLayer::HeroBulletLayer(Node* heroPlane) {
	this->heroPlane = heroPlane;
}
HeroBulletLayer::~HeroBulletLayer() {
}
/**
*         
*@param heroPlane     
*/
HeroBulletLayer* HeroBulletLayer::create(Node* heroPlane){
	HeroBulletLayer* pRet = new HeroBulletLayer(heroPlane);
	if (pRet&&pRet->init()){
		pRet->autorelease();
		return pRet;
	}
	else{
		delete pRet;
		pRet = NULL;
		return NULL;
	}

}
bool HeroBulletLayer::init() {
	bool bRet = false;
	do {
		CC_BREAK_IF(!Layer::init());

		//  BatchNode  
		bulletBatchNode = SpriteBatchNode::create("bullet1.png");
		this->addChild(bulletBatchNode);

		//  0.2S          
		this->schedule(schedule_selector(HeroBulletLayer::ShootBullet), 0.2f);
		bRet = true;
	} while (0);
	return bRet;
}
/**
*          ,                
*/
void HeroBulletLayer::ShootBullet(float dt) {
	Size winSize = Director::getInstance()->getWinSize();
	auto PlanePos = heroPlane->getPosition();
	//        
	auto spritebullet = Sprite::createWithTexture(bulletBatchNode->getTexture());
	//          BatchNode       
	bulletBatchNode->addChild(spritebullet);
	//            
	vecBullet.pushBack(spritebullet);

	Point bulletPos = (Point(PlanePos.x,
		PlanePos.y + heroPlane->getContentSize().height / 2 + 20));
	spritebullet->setPosition(bulletPos);
	spritebullet->setScale(0.8f);


	float flyLen = winSize.height - PlanePos.y;
	float realFlyDuration = flyLen / FlYVElOCITY;//       

	//          ,             
	auto actionMove = MoveTo::create(realFlyDuration,
		Point(bulletPos.x, winSize.height));

	//              ,        
	auto actionDone = CallFuncN::create(
		CC_CALLBACK_1(HeroBulletLayer::removeBullet, this));

	//      
	Sequence* sequence = Sequence::create(actionMove, actionDone, NULL);
	spritebullet->runAction(sequence);


}

/**
 *     ,         ,    SpriteBatchNode   
 */
void HeroBulletLayer::removeBullet(Node* pNode) {
	if (NULL == pNode) {
		return;
	}
	Sprite* bullet = (Sprite*)pNode;
	this->bulletBatchNode->removeChild(bullet, true);
	vecBullet.eraseObject(bullet);
}
/**
*      ,          
*/
Vector <Sprite *>& HeroBulletLayer::GetBullet(){
	return vecBullet;
}

注意:
1、
//  BatchNode  
bulletBatchNode = SpriteBatchNode::create("bullet1.png");
ここでは、 のピクチャをキャッシュに する を し、 を する がある に び されます.
 //        
    auto spritebullet = Sprite::createWithTexture(bulletBatchNode->getTexture());
そうしないと、ゲームはメモリが され、カードがかかります!
2、ここではcreateメソッドを き え、パラメータを って に える
	//   
	HeroBulletLayer *mHeroBulletLayer = HeroBulletLayer::create(mHeroPlane);
	this->addChild(mHeroBulletLayer,1);

:
mHeroPlaneは の で に って した で、ここCocos 2 d-x「 」(2)- が に って しているのを て、 はどこへ きますか?
、 え の
    1、 の は いやすく、 の に ると、 を してタイマーを び して を し、 の とVectorに える(すべての を するために される)
    2、 の の から、 が する を し、 を で すれば、 が する の を することができる.
   3、 が に したら、この を し、vectorでも します.
  4、GetBullet(); のvector の を るために され、 と するかどうかを するために1つずつ り す があります.もしそうであれば、removeBullet(Node*pNode)を び します.そうですね. :
void GameMain::update(float dt){
	auto *mEnemyPlane = getChildByTag(200);
	Vector <Sprite *> mVecHeroBullet = mHeroBulletLayer->GetBullet();
	for (int i = 0; i<mVecHeroBullet.size();i++){
		if (mEnemyPlane->boundingBox().intersectsRect(mVecHeroBullet.at(i)->boundingBox())){
			mHeroBulletLayer->removeBullet(mVecHeroBullet.at(i));
		}

	}

}

ここでvectorの に し、[],cocos 2 dxはこれをリロードせず、at.
ここではどのように うかを に げただけで、 が にぶつかった 、それを して、 はまだ していません.
     エヴァンカカのオリジナル . は を してくださいhttp://blog.csdn.net/evankaka