Exemple #1
0
TowerBase * TowerBase::create(Vec2 position, GameStates & gameState)
{
	std::shared_ptr<GameData> ptr = GameData::sharedGameData();

	auto spritecache = SpriteFrameCache::getInstance();
	spritecache->addSpriteFramesWithFile(ptr->m_textureAtlasPlistFile);		

	TowerBase* pSprite = new TowerBase(gameState);
	if (pSprite->initWithSpriteFrameName(ptr->m_towerBaseFile))
	{
		pSprite->autorelease();

		pSprite->initOptions(position);

		pSprite->addEvents();

		return pSprite;
	}

	CC_SAFE_DELETE(pSprite);
	return NULL;
}
Exemple #2
0
void PlayLayer::addTower()
{
	if(chooseTowerpanel)
	{
		auto type = chooseTowerpanel->getChooseTowerType();
		if(type == TowerType::ANOTHER)
		{
			return;
		}
		Point matrixCoord = convertToMatrixCoord(towerPos);
		int MatrixIndex = static_cast<int>( matrixCoord.y * MAP_WIDTH + matrixCoord.x );
		bool noMoneyTips = false;
		TowerBase* tower = NULL;
		if( type == TowerType::ARROW_TOWER )
		{
			if( money >= 120 )
			{
				tower = ArrowTower::create();
				money -= 120;
			}
			else
				noMoneyTips = true;
		}
		else if( type == TowerType::ATTACK_TOWER )
		{
			if( money >= 150 )
			{
				tower = AttackTower::create();
				money -= 150;
			}
			else
				noMoneyTips = true;
		}
		else if( type == TowerType::MULTIDIR_TOWER )
		{
			if( money >= 400 )
			{
				tower = MultiDirTower::create();
				money -= 400;
			}else
				noMoneyTips = true;
		}
		if(tower != NULL)
		{
			tower->setPosition(towerPos);
			tower->runAction(Sequence::create(FadeIn::create(1.0f),NULL));
			this->addChild(tower);
			towerMatrix[MatrixIndex] =  tower;
			//add by  设置tower位置
			tower->setTowerPos(towerPos);
		}
		type =  TowerType::ANOTHER;
		chooseTowerpanel->setChooseTowerType(type);
		this->removeChild(chooseTowerpanel);
		chooseTowerpanel = NULL;

		//add by 
		instance->setMoney(money);


		//by 
		char countBuf8[16] = "";
		sprintf(countBuf8, "%d", money);
		auto moneyText = countBuf8;
		//auto moneyText = std::to_string(money);
		moneyLabel->setString(moneyText);



		if( noMoneyTips == true )
		{
			SimpleAudioEngine::getInstance()->playEffect(FileUtils::getInstance()->fullPathForFilename("sound/tip.wav").c_str(), false);
			//auto tips = Sprite::createWithSpriteFrameName("nomoney_mark.png");
			//add by 
			auto tips = Sprite::createWithSpriteFrameName("tip.png");
			tips->setPosition(towerPos);
			this->addChild(tips);
			tips->runAction(Sequence::create(DelayTime::create(0.5f),
				CallFunc::create(CC_CALLBACK_0(Sprite::removeFromParent, tips)),
				NULL));
		}
	}
}
Exemple #3
0
void PlayLayer::upgradeTower(int tt,int lv)
{
	Point matrixCoord = convertToMatrixCoord(towerPos);
	int MatrixIndex = static_cast<int>( matrixCoord.y * MAP_WIDTH + matrixCoord.x );
	TowerBase* tower;
	// 先移除低等级塔,移除前线获得金币信息
	tower = towerMatrix[MatrixIndex];
	int m= tower->getTowerValue();
	
	if ( tt == 0 )//表示第一个塔
	{


		if( money < m )
			return;
		money=money-m;
		tower->removeFromParent();
		towerMatrix[MatrixIndex]=NULL;
		instance->setMoney(money);
		char countBuf8[16] = "";
		sprintf(countBuf8, "%d", money);
		auto moneyText = countBuf8;
		moneyLabel->setString(moneyText);

		//升级塔,造个新塔
		if( lv == 0 )
		{
			tower = ArrowTower1::create();	
			tower->setLevel(1);		
		}
		else if ( lv == 1)
		{
			tower = ArrowTower2::create();	
			tower->setLevel(2);	
		}
		else 
		{
			tower = ArrowTower3::create();	
			tower->setLevel(3);	
		}

		if(tower != NULL)
		{
			tower->setTowerPos(towerPos);
			//tower->runAction(Sequence::create(FadeIn::create(1.0f),NULL));
			this->addChild(tower);
			towerMatrix[MatrixIndex] =  tower;
			tower->setPosition(towerPos);
		}
		auto type =  TowerUpgrade::OTHER;
		chooseUpgradepanel->setChooseTowerUpgrade(type);
		//异常升级面板并设置为NULL,攻击范围
		chooseUpgradepanel->removeFromParent();
		draw->clear();
		chooseUpgradepanel=NULL;
		return;




	}
	else if (tt == 1)//表示第二个塔
	{

		//int m= currTower->getTowerValue();
		if( money < m )
			return;
		money=money-m;
		tower->removeFromParent();
		towerMatrix[MatrixIndex]=NULL;
		//currTower = NULL;
		instance->setMoney(money);
		char countBuf8[16] = "";
		sprintf(countBuf8, "%d", money);
		auto moneyText = countBuf8;
		//auto moneyText = std::to_string(money);
		moneyLabel->setString(moneyText);
		//升级塔,造个新塔
		if( lv == 0 )
		{
			tower = AttackTower1::create();	
			tower->setLevel(1);		
		}
		else if ( lv == 1)
		{
			tower = AttackTower2::create();	
			tower->setLevel(2);	
		}
		else 
		{
			tower = AttackTower3::create();	
			tower->setLevel(3);	
		}

		if(tower != NULL)
		{
			tower->setTowerPos(towerPos);
			//tower->runAction(Sequence::create(FadeIn::create(1.0f),NULL));
			this->addChild(tower);
			towerMatrix[MatrixIndex] =  tower;
			tower->setPosition(towerPos);

		}


		auto type =  TowerUpgrade::OTHER;
		chooseUpgradepanel->setChooseTowerUpgrade(type);
		//异常升级面板并设置为NULL,攻击范围
		chooseUpgradepanel->removeFromParent();
		draw->clear();
		chooseUpgradepanel=NULL;

		return;
	}
	else //表示第三个塔
	{

		//int m= currTower->getTowerValue();
		if( money < m )
			return;
		money=money-m;
		tower->removeFromParent();
		towerMatrix[MatrixIndex]=NULL;
		//currTower = NULL;

		instance->setMoney(money);
		char countBuf8[16] = "";
		sprintf(countBuf8, "%d", money);
		auto moneyText = countBuf8;
		//auto moneyText = std::to_string(money);
		moneyLabel->setString(moneyText);
		//升级塔,造个新塔
		if( lv == 0 )
		{
			tower = MultiDirTower1::create();	
			tower->setLevel(1);		
		}
		else if ( lv == 1)
		{
			tower = MultiDirTower2::create();	
			tower->setLevel(2);	
		}
		else 
		{
			tower = MultiDirTower3::create();	
			tower->setLevel(3);	
		}

		if(tower != NULL)
		{
			tower->setTowerPos(towerPos);
			//tower->runAction(Sequence::create(FadeIn::create(1.0f),NULL));
			this->addChild(tower);
			towerMatrix[MatrixIndex] =  tower;
			tower->setPosition(towerPos);

		}


		auto type =  TowerUpgrade::OTHER;
		chooseUpgradepanel->setChooseTowerUpgrade(type);
		//异常升级面板并设置为NULL,攻击范围
		chooseUpgradepanel->removeFromParent();
		draw->clear();
		chooseUpgradepanel=NULL;

		return;
	}

}
Exemple #4
0
void PlayLayer::update(float dt)
{
    GameManager *instance = GameManager::getInstance();
    
    auto bulletVector = instance->bulletVector;
    auto enemyVector = instance->enemyVector;
    auto towerVector = instance->towerVector;
    
    if(chooseTowerpanle != NULL )
	{
		auto type = chooseTowerpanle->getChooseTowerType();
		if( type == TowerType::ARROW_TOWER)
        {
			TowerBase* tower = ArrowTower::create();
			tower->setPosition(towerPos);
			this->addChild(tower);
            instance->towerVector.pushBack(tower);
            
			type =  TowerType::ANOTHER;
			chooseTowerpanle->setChooseTowerType(type);
            
		}
	}
    
    Vector<EnemyBase*> enemyNeedToDelete;
	Vector<Sprite*> bulletNeedToDelete;
    // 碰撞检测
    for (int i = 0; i < bulletVector.size(); i++)
	{
		auto  bullet = bulletVector.at(i);
        bullet->boundingBox();
		auto  bulletRect = Rect(bullet->getPositionX()+bullet->getParent()->getPositionX() - bullet->getContentSize().width / 2,
                                bullet->getPositionY() +bullet->getParent()->getPositionY() - bullet->getContentSize().height / 2,
                                bullet->getContentSize().width,
                                bullet->getContentSize().height );
        
		for (int j = 0; j < enemyVector.size(); j++)
		{
			auto enemy = enemyVector.at(j);
			auto enemyRect = enemy->sprite->boundingBox();
            
			if (bulletRect.intersectsRect(enemyRect))
			{
                auto currHp = enemy->getCurrHp();
                currHp--;
                enemy->setCurrHp( currHp );
                
				auto currHpPercentage = enemy->getHpPercentage();
                auto offHp = 100 / enemy->getMaxHp();
				currHpPercentage -= offHp;
                if(currHpPercentage < 0){
                    currHpPercentage = 0;
                }
                enemy->setHpPercentage(currHpPercentage);
				enemy->getHpBar()->setPercentage(currHpPercentage);
                
                if(currHp <= 0)
                {
                    enemyNeedToDelete.pushBack(enemy);
                }
                bulletNeedToDelete.pushBack( bullet);
			}
		}
		for (EnemyBase* enemyTemp : enemyNeedToDelete)
		{
            enemyTemp->enemyExpload();
            instance->enemyVector.eraseObject(enemyTemp);
		}
		enemyNeedToDelete.clear();
	}
	
	for (const auto& bulletTemp : bulletNeedToDelete)
	{
		instance->bulletVector.eraseObject(bulletTemp);
        bulletTemp->removeFromParent();
	}
	bulletNeedToDelete.clear();
}