[Cocos2d塔防遊戲開發]Cocos2dx-3.X完成塔防遊戲《王國保衛戰》--防禦塔(四)之升級防禦塔

該張補充如何升級防禦塔



首先是,點擊該圖標,會彈出上面那張GIF的建造選項。

具體代碼在Terrain(名字是根據資源包圖片名起的)中,首先根據每一個地圖算好座標,在地圖添加到場景後執行addTerrains()添加到地圖層中。在Terrain的Init函數中根據地圖類型選擇圖片生成精靈,並添加觸摸監聽。

auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(Terrain::onTouchBegan, this);
listener->onTouchEnded = CC_CALLBACK_2(Terrain::onTouchEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,terrain);

在onTouchEnded中判斷

void Terrain::onTouchEnded(Touch* touch, Event* event)
{
	auto target = static_cast<Sprite*>(event->getCurrentTarget());

	Point locationInNode = target->convertTouchToNodeSpace(touch);

	Size size = target->getContentSize();
	Rect rect = Rect(0, 0, size.width, size.height);
	if (rect.containsPoint(locationInNode)&&target->isVisible())//若點擊在該區域,且可見(可見是因爲若防禦塔建造了,就不可以了,就不會執行下面代碼)
	{  	
		if(isUpdateMenuShown)//如果已經顯示,則隱藏
		{
			hideUpdateMenu();
		}else{
			showUpdateMenu();
		}
	}else{//若點擊其他區域,隱藏
		hideUpdateMenu();
	}
}

在showUpdateMenu()添加建造菜單層

void Terrain::showUpdateMenu()
{
	auto towerPanleLayer = TowerPanleLayer::create();
	towerPanleLayer->setPosition(this->getPosition());
	towerPanleLayer->setTag(getTag());
	towerPanleLayer->setMyTerrain(this);
	static_cast<BaseMap*>(this->getParent())->mTouchLayer->addChild(towerPanleLayer);
	towerPanleLayer->inAnimation();
	isUpdateMenuShown = true;
}

TowerPanleLayer是自定義Layer

bool TowerPanleLayer::init()
{
    if ( !Sprite::init() )
    {
        return false;
    }
	circle = Circle::create();
	addChild(circle);
	circle->setVisible(false);

	planesprite = Sprite::createWithSpriteFrameName("gui_ring.png");
	planesprite->setPosition(Point(0, 0));
	planesprite->setScale(0.5f);
	addChild(planesprite);

	isBuilt = false;
	return true;
}
其中Circle是自定義精靈,根據射程顯示防禦塔攻擊範圍,不做詳細介紹了,planesprite是那個鐵環

首先通過this->getPosition()獲取位置,將它添加在觸摸層中,執行從小變大的動畫。

void TowerPanleLayer::inAnimation()
{
    SoundManager::playTowerMenu();
    planesprite->runAction(Sequence::create(ScaleTo::create(0.1f,1.0f,1.0f),
	CallFuncN::create(CC_CALLBACK_0(TowerPanleLayer::addIcons,this)),
	NULL));	
}
動畫執行完畢後,添加4個按鍵,4個按鍵是自定義精靈類,具體參見代碼,給4個按鍵添加觸摸監聽,在觸摸開始時:

bool TowerPanleLayer::onTouchBegan(Touch *touch, Event *event)
{
	auto target = static_cast<BaseBuildIcon*>(event->getCurrentTarget());
    Point locationInNode = target->convertTouchToNodeSpace(touch);
    Size size = target->baseIcon->getContentSize();
	Rect rect = Rect(0-size.width/2, 0-size.height/2, size.width, size.height);
    if (rect.containsPoint(locationInNode))
    {
		if(target->getIsSelected())//如果已經選中(第二次按下)
		{
			if(target->getIsAble())//如果錢夠用
			{
				int i = target->getType();
				addTower(target->getType());
			}
		}else{//第一次按下
			archerIcon->setNotSelected();
			artilleryIcon->setNotSelected();
			barracksIcon->setNotSelected();
			magicIcon->setNotSelected();

			target->setSelected();//設置爲選中狀態
			addTempTower(target->getType());
		}
        return true;
    }
    return false;
}

其中addTempTower()是添加臨時防禦塔,即第一張圖的效果,當點擊第二次,通過addTower()建造防禦塔
void TowerPanleLayer::addTempTower(int type)
{
	if(tempTower!=NULL){
		removeChild(tempTower,true);//首先上一個臨時塔移除
	}
	circle->setVisible(true);//顯示防禦塔攻擊範圍
	switch (type)
	{
	case(1):{//根據點擊類型顯示
		tempTower = Sprite::createWithSpriteFrameName("tower_preview_archer.png");
		tempTower->setPosition(Point(0,25));
		static_cast<BaseMap*>(this->getParent()->getParent())->playerState->showTowerInfo(ARCHER_1);}//在菜單層顯示防禦塔信息
		break;
    ..........
}
addTower中建造防禦塔

void TowerPanleLayer::addTower(int type)
{
	static_cast<BaseMap*>(this->getParent()->getParent())->playerState->removeTowerInfo();//移除防禦塔信息
	switch (type)
	{
	case(2):{//根據選擇類型建造
	    auto barracksTower = BaseBarracksTower::create();
	    barracksTower->setPosition(Point(0,20));
	    barracksTower->setTag(terrain->getTag());
	    barracksTower->setMyTerrain(terrain);//設置塔所屬的terrain,防禦塔售出時將此設置可見。
	    terrain->addChild(barracksTower);
	    barracksTower->buildingAnimation();
	    GameManager::getInstance()->MONEY = GameManager::getInstance()->MONEY - barracksTower->getBuildMoney();
	    }
	break;
	.........省略
	}
	SoundManager::playTowerBuilding();//播放建造音效
	isBuilt = true;
	terrain->terrain->setVisible(false);//將terrain設置不可見,再點擊即不會再顯示了
	this->setVisible(false);
}

另外,防禦塔升級的界面類似建造,就不一一介紹了,升級即將上一個塔remove掉,新建一個新的。賣塔的過程即將防禦塔remove掉,並且將terrain設置爲可見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章