1. 程式人生 > >少年啊,來一發昆特嗎(三)——昆特牌的選擇介面

少年啊,來一發昆特嗎(三)——昆特牌的選擇介面

昆特牌的顯示搞定後,之後就是卡牌的整備介面了,既然要整備卡牌,自然涉及到卡牌資料的儲存,這裡採用了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);