既然是昆特牌游戏那么毫无疑问,昆特牌无疑就是重点需要关注的地方,本节主要讲解怎样实现昆特牌
对于昆特牌来说,总共有四种类型的卡,单位卡(包括普通单位卡和英雄单位卡),天气卡,特殊卡,领导卡,并且单位卡还具有力量值,能力,所属势力,卡牌的名称等属性,所以单纯的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