昆特牌的显示搞定后,之后就是卡牌的整备界面了,既然要整备卡牌,自然涉及到卡牌数据的存储,这里采用了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);