
Cocos2d-x制作《单机斗地主》源码解剖1:创建一副扑克牌
触摸开始:检查是否是单机选择状态。
发布日期:2021-05-10 00:53:03
浏览次数:10
分类:精选文章
本文共 3519 字,大约阅读时间需要 11 分钟。
基于Cocos2d-x开发单机斗地主游戏:技术总结
为了让大家更好地理解游戏开发逻辑和技术实现,我将从以下几个方面详细讲解本次项目的实现过程。
一、创建扑克牌
游戏中首先需要创建一张扑克牌的类。这个类基于Cocos2d-x的Sprite
类扩展,主要功能包括显示正反面、处理触摸事件等。以下是类的主要接口说明:
class Poker : public Sprite {public: Poker(); virtual ~Poker(); static Poker* create(const char* pszFileName, const CCRect& rect); 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); void showFront(); void showLast(); Poker* copy(); void setTouchPriority(int num); void SelectPkLuTou(); // 暴露头部 void SelectPkSuoTou(); // 把头部缩回private: CC_SYNTHESIZE(bool, m_isSelect, Select); // 是否已选 CC_SYNTHESIZE(GameScene*, m_gameMain, GameMain); // 游戏主场景引用 CC_SYNTHESIZE(bool, m_isDianJi, DianJi); // 是否能触发点击 CC_SYNTHESIZE(int, m_huaSe, HuaSe); // 花色 CC_SYNTHESIZE(int, m_num, Num); // 牌值 EventListenerTouchOneByOne* touchListener; //触摸事件监听器};
创建扑克牌的实现
具体实现中,我们在GameScene
中使用以下方法创建扑克牌:
Poker* selectPoker(int huaSe, int num) { Poker* pk; if (huaSe != Gui) { pk = Poker::create("poker.png", CCRect(num * pkWidth, huaSe * pkHeight, pkWidth, pkHeight)); } else { pk = Poker::create("poker.png", CCRect((num - XiaoGui) * pkWidth, huaSe * pkHeight, pkWidth, pkHeight)); } pk->setHuaSe(huaSe); pk->setNum(num); pk->setGameMain(this); return pk;}
两、创建扑克牌组
在createPokers
函数中,我们采用双重循环的方式创建标准扑克牌:
bool createPokers() { bool isRet = false; do { Size size = Director::sharedDirector()->getVisibleSize(); Poker* pk; // 让)\ for (int i = 0; i < 4; ++i) { for (int j = 0; j < 13; ++j) { pk = selectPoker(i, j); pk->setPosition(ccp(size.width / 2 + j * 20, size.height / 2 - i * 20)); pk->showLast(); this->addChild(pk); this->m_arrPokers->addObject(pk); } } // 小鬼 pk = selectPoker(Gui, XiaoGui); pk->setPosition(ccp(size.width / 2, size.height / 2 - 4 * 20)); pk->showLast(); this->addChild(pk); this->m_arrPokers->addObject(pk); // 大鬼 pk = selectPoker(Gui, DaGui); pk->setPosition(ccp(size.width / 2 + 20, size.height / 2 - 4 * 20)); pk->showLast(); this->addChild(pk); this->m_arrPokers->addObject(pk); isRet = true; } while (0); return isRet;}
这段代码首先设置了一个可见大小的区域,通过双重循环创建了标准的扑克牌,并根据位置调整每张牌的位置和显示状态。
三、触摸事件处理
扑克牌的触摸事件处理分为四个阶段:
virtual bool onTouchBegan(CCTouch* pTouch, CCEvent* pEvent) { if (m_isSelect) { return true; } return true;}
- 触摸移动:当选中一张牌后,允许移动查看牌面。
- 触摸结束:处理确认选择或取消动作。
- 触摸取消:在外部强制点击时执行自动取消操作。
- 减少重复代码:通过移动象限优化创建扑克牌的代码结构。
- 灵活化触摸事件:通过添加触摸优先级和监听器,提高触摸交互的灵活性。
- 遵循OCPP规范:确保代码符合Cocos2d-x的最佳实践。
virtual void onTouchMoved(CCTouch* pTouch, CCEvent* pEvent) { if (m_isSelect) { // 根据触摸位置调整视角 // 具体实现中可以自定义 }}
virtual void onTouchEnded(CCTouch* pTouch, CCEvent* pEvent) { if (m_isSelect) { // 取消选中选中的牌 SelectPkSuoTou(); }}
virtual void onTouchCancelled(CCTouch* pTouch, CCEvent* pEvent) { if (m_isSelect) { // 取消选中选中的牌 SelectPkSuoTou(); }}
四、触摸优化
为了优化触摸体验,我们为每张牌设置了触摸优先级,并通过自定义触摸监听器调整了触摸事件的响应顺序。
五、游戏场景准备
在GameScene
的创建过程中,我们预先加载了所有扑克牌,并通过m_arrPokers
进行管理,最终将这些扑克牌添加到场景中。
六、优化要点
通过上述技术实现,本次项目不仅完成了扑克牌的创建与管理,还确保了游戏的触摸交互流畅性和用户体验优化。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月17日 00时08分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
关于Entity Framework中的Attached报错的完美解决方案
2019-03-06
分享在winform下实现模块化插件编程-优化版
2019-03-06
利用WCF的双工通讯实现一个简单的心跳监控系统
2019-03-06
SignalR的另类实现技巧
2019-03-06
Web发展简史
2019-03-06
将windows应用程序注册为windows服务
2019-03-06
MVC模型(java)
2019-03-06
网易互娱将星N计划空宣 要点速记
2019-03-06
maven project 部署到tomcat时项目部署不上去
2019-03-06
Unity2D 角色趴下 改变2D盒子碰撞体的大小
2019-03-06
【Vegas】无法确定错误的原因
2019-03-06
[资源分享]LOL MOBA类DEMO
2019-03-06
[Unity][UGUI]滑动条来回滑动在触发范围响应事件,武器命中率滑动条触发判定
2019-03-06
[Unity][EXE]封装打包后怎么Debug错误显示output_log.txt
2019-03-06
「房间里的大象」:让目标检测器一脸懵逼
2019-03-06
计算机网络之rdp爆破
2019-03-06
使用promise封装wx:requset()
2019-03-06