少年啊,來一發昆特嗎(三)——昆特牌的選擇介面
昆特牌的顯示搞定後,之後就是卡牌的整備介面了,既然要整備卡牌,自然涉及到卡牌資料的儲存,這裡採用了plist的方式進行儲存(不過這是錯誤的方式,=。=之後會還債的),推薦使用userdefault或者sqllite進行儲存,儲存方式大同小異,這裡就不介紹plist的儲存方式了,稍後會放出修改後使用sqlite的程式碼
卡牌所需要的資料,在上一節已經說過了,這裡直接上程式碼,plist形式的,資料庫或者userdefault基本結構也差不多
<key>09</key>
<dict>
<key>cardnum</key >
<string>1</string>
<key>type</key>
<string>hero</string>
<key>power</key>
<string>10</string>
<key>attackrange</key>
<string>longrange</string >
<key>Ability</key>
<string>----</string>
<key>img</key>
<string>cardimage/Northern Realms Deck/Phillipa-Eilhart.jpg</string>
<key>cardname</key>
<string>Phillipa-Eilhart</string >
<key>maxnum</key>
<string>1</string>
</dict>
一,勢力切換
昆特牌分4個勢力,北方王國,帝國,松鼠黨,以及怪物,中立牌時任何勢力都能使用的卡牌,4個勢力的定義,在切換勢力的同時,卡牌也需要切換成對應的勢力,同時卡組也需要切換到對應勢力的卡組,這裡採用將卡牌存在陣列中或者vector中,在切換的同時切換陣列,並呼叫tableview->reloadData()函式,這個函式是用來重新整理tableview的,目的是將顯示切換後卡牌。
基本的切換程式碼很容易,下面是向右切換的程式碼,向左的一樣,只不過把+改成-就行了
void CardSelectScene::righttouch(cocos2d::Ref* pSender,Control::EventType controlEvent){
LabelTTF *label=(LabelTTF *)this->getChildByName("powername");
if(i==3){
i=0;
}else{
i++;
}
this->Race=i;
label->setString(UTEXT(influence[i].getCString()));
unselect=0;
selected=0;
selectnum=0;
querycarddata();
tableview->reloadData();
squerycarddata();
stableview->reloadData();
updatenum();
loadleaderinfo();
setleader(0);
}
二,類別切換
通過點選類別按鈕來過濾卡牌,大致和切換勢力一樣,通過引數unselect,select來控制是將卡組和勢力卡牌切換到哪個類別
void CardSelectScene::itemselectd(cocos2d::Ref* pSender){
MenuItemSprite *item=(MenuItemSprite *)pSender;
if(item->getName()=="allcard"){
log("%s","allcardbeselected");
this->unselect=0;
//this->NorthDeckimgpath=readcardimginfo("cardinfo/northKingdom.plist");
}else if(item->getName()=="shortrange"){
log("%s","shortrangebeselected");
this->unselect=1;
}else if(item->getName()=="longrange"){
log("%s","longrangebeselected");
this->unselect=2;
}else if(item->getName()=="Grange"){
log("%s","Grangebeselected");
this->unselect=3;
}else if(item->getName()=="HCard"){
log("%s","HCardbeselected");
this->unselect=4;
}else if(item->getName()=="TCard"){
log("%s","TCardbeselected");
this->unselect=5;
}else if(item->getName()=="bCard"){
log("%s","bCardbeselected");
this->unselect=6;
}
querycarddata();
tableview->reloadData();
}
querycarddata()函式是用來過濾該使用哪個陣列的函式
void CardSelectScene::querycarddata(){
Array *m_array =Array::create();
switch(i){
//北方王國
case 0:
m_array->addObjectsFromArray(this->NorthDeckimgpath);
//m_array->addObjectsFromArray(this->Neutralimgpath);
array=query(m_array);
break;
//帝國
case 1:
m_array->addObjectsFromArray(this->NiffDeckkimgpath);
// m_array->addObjectsFromArray(this->Neutralimgpath);
array=query( m_array);
break;
//怪獸
case 2:
m_array->addObjectsFromArray(this->monsterimgpath);
// m_array->addObjectsFromArray(this->Neutralimgpath);
array=query( m_array);
break;
//松鼠黨
case 3:
m_array->addObjectsFromArray(this->Scoiadeckimgpath);
// m_array->addObjectsFromArray(this->Neutralimgpath);
array=query( m_array);
break;
default:
log("error");
}
array->retain();
}
三、卡牌點選
需要注意一點的是點選的層級,否則有可能導致觸控被吞掉,如果是menu的話,是預設最高級別的觸控,所以如果不想被menu吞掉觸控的話就要改變menu的優先順序,或者通過this->swallowtouch(false),這樣觸控就不會被吞掉而正常被下發到下一級別了(這裡需要注意true是吞,預設是true),點選卡牌後需要將勢力卡牌放到卡組中去,點選卡組放到勢力卡牌中去,大致的實現過程是在tablecelltouched中進行處理,處理過程大致如下:
auto sp=cell->getChildren();
auto point=table->convertToNodeSpace(Firsttouchpos);
float y=point.y-((int)(point.y/150))*150;
auto touchPos=Point(point.x,y);
auto idx=cell->getIdx();
auto size=Director::getInstance()->getWinSize();
for(auto a:sp){
auto child=(LayerColor *)a;
if(child->getBoundingBox().containsPoint(touchPos)){
//卡牌處理
}
}
四、切換到遊戲場景
在cocos2dx中是很容易的直接通過director中提供的replacescene就可以將場景切換過去,需要注意下這裡需要傳遞一些引數,傳遞的方式很容易通過定義的scene獲得場景下的layer(這裡需要注意自己存放的layer是在第幾層,否則就會出錯),直接通過對面提供的函式來對其進行賦值
this->stopAllActions();
auto scene=Gamescene::createScene();
Gamescene *layer = (Gamescene*)scene->getChildren().at(1);
//layer->setUserData(String::createWithFormat("%d",decknumber));
layer->setdeckarray(sarray);
Dictionary *str=(Dictionary *)leader->objectAtIndex(selectnum);
std::string chr=((String *)str->objectForKey("img"))->getCString();
std::string chrf=((String *)str->objectForKey("Ability"))->getCString();
layer->setleaderdata(chr,chrf);
layer->setInflunce(UTEXT(influence[i].getCString()));
//ascene->addChild(layer);
//layer->setUserData(String::createWithFormat("%d",decknumber));
Director::getInstance()->pushScene(scene);