[置頂]Cocos 2 d-x『雷電大戦』(3)-弾丸無限発射
5097 ワード
林炳文エヴァンカカのオリジナル作品.転載は出典を明記してくださいhttp://blog.csdn.net/evankaka
本稿では,雷電ゲームでは,ゲームが始まると英雄飛行機が無限に弾丸を発射する機能を実現する.ここでの考え方は、単独で弾丸に層を作り、この層にタイマーを設けず、1時間おきに現在のヒーロー機が伝わる位置に基づいて弾丸を生成し、弾丸の移動イベントを設定し、移動後のイベント(弾丸を削除し、メモリを節約する)を設定することです.
最終的な効果:
Cocos 2 d-xバージョン:3.4
工事環境:VS 30213
一、英雄弾層
1、HeroBulletLayer.h
2、HeroBulletLayer.cpp
注意:
1、
本稿では,雷電ゲームでは,ゲームが始まると英雄飛行機が無限に弾丸を発射する機能を実現する.ここでの考え方は、単独で弾丸に層を作り、この層にタイマーを設けず、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