上篇博客添加了道具,针对于不同的道具玩家飞机应该有不同的表现,如果是UFO就应该改变发射子弹的数量,如果是炸弹玩家应该死掉,而这些逻辑的实现,首先需要进行碰撞检测,玩家飞机和道具的碰撞检测,这个碰撞检测与敌机和子弹的碰撞检测在同一个函数中,以下是相关的代码。

/*玩家飞机和UFO的碰撞检测*/

	//判断是否添加了UFO,记得UFO要在init函数中初始化
	if(m_ufo != NULL)
	{
		auto rect = m_player->getBoundingBox();
		auto point = m_ufo->getPosition();
		//如何玩家和UFO碰撞到了
		if(rect.containsPoint(point))
		{
			//根据碰撞到的不同道具,做不同的处理
			if(m_ufo->getName() == "ufo1.png")
			{
				//设置子弹的名称
				m_bulletName = "bullet2.png";
			}
			else if(m_ufo->getName() == "ufo2.png")
			{
				m_bulletName = "bullet1.png";
			}
			else
			{
				//碰到炸弹的处理和碰到敌机的处理是相同的,先放一下

			}
			//发射三发子弹,持续时间是4s
			this->schedule(SEL_SCHEDULE(&MainGame::addBulletByUfo),0.1f,40,0);
			//如果碰撞检测到了,则设置这个UFO为不可见,因为移除的工作会在UFO执行完动作以后进行
			m_ufo->setVisible(false);
			//最后将成员变量设置为null
			m_ufo = NULL;
		}
		//如果UFO离开了屏幕就设置为null
		if(m_ufo != NULL && point.y < -m_ufo->getContentSize().height/2)
		{
			m_ufo = NULL;
		}
	}

m_ufo是新添加的一个成员变量,道具的出现是每10s出现一次,也就是说在当前的主场景中只可能有一种道具的存在,所以用成员变量保存起来,方便判断,如果道具被玩家捕捉到或者是移出了屏幕这个引用就应该没有了,所以设置为null,关于获取道具名字的函数是新添加上去的,接下来是添加子弹的函数了。

//当玩家飞机和UFO碰撞以后添加子弹
void MainGame::addBulletByUfo(float tm)
{
	//创建双发子弹
	auto bullet1 = Bullet::create();
	bullet1->initBullet(m_bulletName);
	auto bullet2 = Bullet::create();
	bullet2->initBullet(m_bulletName);

	//设置位置
	auto point1 = Point(m_player->getPositionX()-23,
		m_player->getPositionY()+m_player->getContentSize().height/2);
	bullet1->setPosition(point1);
	auto point2 = Point(m_player->getPositionX()+23,
		m_player->getPositionY()+m_player->getContentSize().height/2);
	bullet2->setPosition(point2);

	//添加子弹
	this->addChild(bullet1);
	this->addChild(bullet2);
	//将子弹添加到管理器中
	auto & vector = Manager::getInstance()->getBulletVector();
	vector.pushBack(bullet1);
	vector.pushBack(bullet2);
}

用3.0实现飞机大战——改变玩家技能