少年啊,来一发昆特吗(二)——昆特牌的基础定义

本文详细介绍了一款基于cocos2dx的游戏——昆特牌的开发过程,从自定义卡牌类到实现复杂的触摸交互机制,再到卡牌的初始化及触摸响应注册等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

既然是昆特牌游戏那么毫无疑问,昆特牌无疑就是重点需要关注的地方,本节主要讲解怎样实现昆特牌
对于昆特牌来说,总共有四种类型的卡,单位卡(包括普通单位卡和英雄单位卡),天气卡,特殊卡,领导卡,并且单位卡还具有力量值,能力,所属势力,卡牌的名称等属性,所以单纯的sprite是无法实现这些的,需要自定义类来实现,既然是自定义类,那么就需要有自己的构造方法和create方法,cocos2dx当然也提供了创建create方法的静态宏,但CREATE_FUNC宏为无参宏,只能处理不放置参数的宏,所以既然是自定义昆特牌的类,肯定需要传入参数来初始化卡牌,所以这里并不能使用宏,而需要自己写一个create函数,这个create函数可以参照宏的写法来写,create_func宏的写法如下:

#define CREATE_FUNC(__TYPE__) \
//type即为类名
static __TYPE__* create() \
{ \
    __TYPE__ *pRet = new __TYPE__(); \
    if (pRet && pRet->init()) \
    { \
        pRet->autorelease(); \
        return pRet; \
    } \
    else \
    { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
    } \
}

所以自己的create函数可以这么写,就是将上面的type全部替换为自己所创建的类名,并填上参数

GWentCard* GWentCard::create(Dictionary *dictionary){
    GWentCard* card = new GWentCard(dictionary);
    if (card&& card->init())
    {
        card->autorelease();

        return card;
    }
    CC_SAFE_DELETE(card);
    return card;
}

接一下是类的构造,这个类的目的是为了创建一张昆特牌,那么昆特牌的属性一共有基础力量,能力,卡牌名称,卡牌的种类,存储改变后的力量值,攻击的范围,大致需要用到如上所述的几种属性,对于这个类来说就必须具备上述参数,并提供外部访问函数,而cocos恰好提供了一个非常方便的宏CC_SYNTHESIZE,此宏可以同时定义一个变量,并提供对该变量进行set和get的函数,定义方法如下:

CC_SYNTHESIZE(bool,m_isSelect,Select);//是否已选    
//bool为变量的类型,m_isSelect为变量名称,Select为函数名称,使用时的函数为setSelect和getSelect

基础部分完毕后,就是需要用到的函数了,完整的类定义如下:

#pragma once
#include "cocos2d.h"
class Gamescene;
USING_NS_CC;
class GWentCard : public Layer
{
public:
    GWentCard();//无参构造函数
    GWentCard(Dictionary *dictionary);//带参构造函数
    ~GWentCard();//析构函数
    static GWentCard* create(Dictionary *dictionary);
    static GWentCard * createcard(Dictionary *dictionary);
    virtual void onEnter();//入口函数,在最终将卡牌创建前调用
    virtual void onExit();//退出函数,在其中释放所有数据
    virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);//触摸开始函数
    virtual void onTouchMoved(CCTouch *pTouch, CCEvent *pEvent);//触摸移动函数
    virtual void onTouchEnded(CCTouch *pTouch, CCEvent *pEvent);//触摸结束函数
    virtual void onTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
    virtual bool onTouchBeganSelect(CCTouch *pTouch, CCEvent *pEvent);
    virtual void onTouchMovedSelect(CCTouch *pTouch, CCEvent *pEvent);
    virtual void onTouchEndedSelect(CCTouch *pTouch, CCEvent *pEvent);
    virtual void onTouchCancelledSelect(CCTouch *pTouch, CCEvent *pEvent);
    virtual bool onTouchBeganSelectGrave(CCTouch *pTouch, CCEvent *pEvent);
    virtual void onTouchMovedSelectGrave(CCTouch *pTouch, CCEvent *pEvent);
    virtual void onTouchEndedSelectGrave(CCTouch *pTouch, CCEvent *pEvent);
    virtual void onTouchCancelledSelectGrave(CCTouch *pTouch, CCEvent *pEvent);
    void setPowerLabel(int pow);//改变力量值
    bool init();//初始化
    void setTouchPriority(int num);
    void SelectPkLuTou();//如果选择了牌就露出头
    void SelectPkSuoTou();//如果选择了牌就缩头
    void setothernotlutou();//如果有一张被选择,就让其他的都不露头
    void setNewPow(float scale);//设置新的力量值
    void updatePowerLabel();
private:
    CC_SYNTHESIZE(bool,m_isSelect,Select);//是否已选    
    CC_SYNTHESIZE(Gamescene*,m_gameMain,GameMain);
    CC_SYNTHESIZE(int,newPow,NewPower);
    CC_SYNTHESIZE(bool,m_isDianJi,DianJi);//是否能被点击
    CC_SYNTHESIZE(std::string,m_Ability,Ability);//能力
    CC_SYNTHESIZE(std::string,m_Type,Type);//卡片的种类
    CC_SYNTHESIZE(int,m_pow,Pow);//卡片力量值
    CC_SYNTHESIZE(std::string,m_CardName,CardName);//卡片名称
    CC_SYNTHESIZE(std::string,m_imgpath,imgPath);//卡片的图片
    CC_SYNTHESIZE(std::string,cardrange,CardRange);
    CC_SYNTHESIZE(bool,onlayer,islayer);//是否已放入游戏中
    CC_SYNTHESIZE(int,Spritetype,BType);//设置精灵种类,0为进行游玩时的种类,1是发牌阶段换牌,2为墓地时的调用
    CC_SYNTHESIZE(Dictionary *,dictionary,Dic);//获取dictionary
    Point firstPoint; //点击的第一个位置
    EventListenerTouchOneByOne* touchListener;

};

首先是init函数,该函数在create中调用,目的是初始化卡片的图像要素,以layer为基础,创建一个sprite并将其添加到layer上,具体过程如下:

auto layer=Layer::create();//创建一个layer
    auto sprite=Sprite::create(this->m_imgpath);创建一个sprite,参数为图像路径
    String *pow=String::createWithFormat("%d",newPow);
    sprite->setAnchorPoint(Point::ZERO);//设置描点
    layer->addChild(sprite);
    this->addChild(layer);
    this->setContentSize(sprite->getContentSize());
    return true;

其次就是触摸函数,因为在昆特牌中需要用到多种触摸形式,如果单纯只用一个触摸函数来处理会变得很麻烦,所以在这里用了多种触摸函数来处理,并提供一个参数BType来进行控制,具体使用哪种触摸函数,下面是cocos2dx的触摸机制定义,因为要通过参数来控制,而在调用create的过程中init函数和构造函数都已经调用过了,所以这里放在onEnter中进行定义。

void GWentCard::onEnter(){
    CCLayer::onEnter();
    //触摸响应注册
    touchListener = EventListenerTouchOneByOne::create();//创建单点触摸事件监听器
    this->setTouchEnabled(true);
    //当为0时就使用如下触摸
    if(Spritetype==0){
      touchListener->onTouchBegan = CC_CALLBACK_2(GWentCard::onTouchBegan, this);//触摸开始
      touchListener->onTouchMoved = CC_CALLBACK_2(GWentCard::onTouchMoved, this);//触摸移动
      touchListener->onTouchEnded = CC_CALLBACK_2(GWentCard::onTouchEnded, this);//触摸结束
      touchListener->setSwallowTouches(false);//不向下吞并触摸
      _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);//注册分发器
    }else if(Spritetype==1){
       touchListener->onTouchBegan = CC_CALLBACK_2(GWentCard::onTouchBeganSelect, this);//触摸开始
       touchListener->onTouchMoved = CC_CALLBACK_2(GWentCard::onTouchMovedSelect, this);//触摸移动
       touchListener->onTouchEnded = CC_CALLBACK_2(GWentCard::onTouchEndedSelect, this);//触摸结束
       touchListener->setSwallowTouches(false);//不向下吞并触摸
       _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);//注册分发器

    }else if(Spritetype==2){
         touchListener->onTouchBegan = CC_CALLBACK_2(GWentCard::onTouchBeganSelectGrave, this);//触摸开始
         touchListener->onTouchMoved = CC_CALLBACK_2(GWentCard::onTouchMovedSelectGrave, this);//触摸移动
         touchListener->onTouchEnded = CC_CALLBACK_2(GWentCard::onTouchEndedSelectGrave, this);//触摸结束
         touchListener->setSwallowTouches(false);//不向下吞并触摸
         _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);//注册分发器

    }else if(Spritetype==3){

    }
}

今天就到这里了,具体的触摸函数将会在下一篇一起进行讲解

昆特牌1.0版源代码
http://pan.baidu.com/s/1kTozWTT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值