tima620のゆらぎ

「のlog.txt」を畳み、「の」が崩御し、「のはざま」をはさんだ後に生まれた「のゆらぎ」

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();
}
----ここまで追加----


こんな感じ。

人の画像の余白が大きいので、すぐ当たる。