Cocos2d-x勉強_人が弾に当たるよ
http://www.cocos2d-x.org/wiki/Chapter_5_-_How_to_Detect_the_Collisions
ときおり出てくる_bulletを_projectilesに書き換えること。
変更点。
HelloWorldScene.h
class HelloWorld : public cocos2d::CCLayerColor { public: ----ここから追加---- HelloWorld(); ~HelloWorld(); ----ここまで追加---- ... void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event); ----ここから追加---- void update(float dt); protected: cocos2d::CCArray *_targets; cocos2d::CCArray *_projectiles; ----ここまで追加---- };
HelloWorldScene.cpp
#include "HelloWorldScene.h" USING_NS_CC; ----ここから追加---- HelloWorld::~HelloWorld() { if(_targets) { _targets->release(); _targets = NULL; } if(_projectiles) { _projectiles->release(); _projectiles = NULL; } } HelloWorld::HelloWorld():_targets(NULL),_projectiles(NULL) { } ----ここまで追加---- ... bool HelloWorld::init() { ... this->setTouchEnabled(true); ----ここから追加---- _targets = new CCArray; _projectiles = new CCArray; this->schedule( schedule_selector(HelloWorld::update) ); ----ここまで追加---- return true; } ... void HelloWorld::addTarget() { ... target->runAction(CCSequence::create(actionMove, actionMoveDone, NULL)); ----ここから追加---- target->setTag(1); _targets->addObject(target); ----ここまで追加---- } ... void HelloWorld::ccTouchesEnded(CCSet* touches, CCEvent* event) { ... projectile->runAction(CCSequence::create(CCMoveTo::create(realMoveDuration, realDest), CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished)), NULL)); ----ここから追加---- projectile->setTag(2); _projectiles->addObject(projectile); ----ここまで追加---- } ... void HelloWorld::spriteMoveFinished(CCNode* sender) { CCSprite *sprite = (CCSprite *)sender; this->removeChild(sprite,true); ----ここから追加---- if(sprite->getTag() == 1) //target { _targets->removeObject(sprite); } else if(sprite->getTag() == 2) //projectile { _projectiles->removeObject(sprite); } ----ここまで追加---- } ... ----ここから追加---- void HelloWorld::update(float dt) { CCArray *projectilesToDelete = new CCArray; CCArray* targetsToDelete = new CCArray; CCObject* it = NULL; CCObject* jt = NULL; CCARRAY_FOREACH(_projectiles, it) { CCSprite *projectile = dynamic_cast<CCSprite*>(it); CCRect projectileRect = CCRectMake(projectile->getPositionX() - (projectile->getContentSize().width/2), projectile->getPositionY() - (projectile->getContentSize().height/2), projectile->getContentSize().width, projectile->getContentSize().height); CCARRAY_FOREACH(_targets, jt) { CCSprite *target = dynamic_cast<CCSprite*>(jt); CCRect targetRect = CCRectMake(target->getPositionX() - (target->getContentSize().width/2), target->getPositionY() - (target->getContentSize().height/2), target->getContentSize().width, target->getContentSize().height); if(projectileRect.intersectsRect(targetRect)) { targetsToDelete->addObject(target); projectilesToDelete->addObject(projectile); } } } CCARRAY_FOREACH(targetsToDelete, jt) { CCSprite *target = dynamic_cast<CCSprite*>(jt); _targets->removeObject(target); this->removeChild(target, true); } CCARRAY_FOREACH(projectilesToDelete, it) { CCSprite *projectile = dynamic_cast<CCSprite*>(it); _projectiles->removeObject(projectile); this->removeChild(projectile, true); } projectilesToDelete->release(); targetsToDelete->release(); } ----ここまで追加----
人の画像の余白が大きいので、すぐ当たる。