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;}
    1. 触摸移动:当选中一张牌后,允许移动查看牌面。
    2. virtual void onTouchMoved(CCTouch* pTouch, CCEvent* pEvent) {    if (m_isSelect) {        // 根据触摸位置调整视角        // 具体实现中可以自定义    }}
      1. 触摸结束:处理确认选择或取消动作。
      2. virtual void onTouchEnded(CCTouch* pTouch, CCEvent* pEvent) {    if (m_isSelect) {        // 取消选中选中的牌        SelectPkSuoTou();    }}
        1. 触摸取消:在外部强制点击时执行自动取消操作。
        2. virtual void onTouchCancelled(CCTouch* pTouch, CCEvent* pEvent) {    if (m_isSelect) {        // 取消选中选中的牌        SelectPkSuoTou();    }}

          四、触摸优化

          为了优化触摸体验,我们为每张牌设置了触摸优先级,并通过自定义触摸监听器调整了触摸事件的响应顺序。

          五、游戏场景准备

          GameScene的创建过程中,我们预先加载了所有扑克牌,并通过m_arrPokers进行管理,最终将这些扑克牌添加到场景中。

          六、优化要点

        3. 减少重复代码:通过移动象限优化创建扑克牌的代码结构。
        4. 灵活化触摸事件:通过添加触摸优先级和监听器,提高触摸交互的灵活性。
        5. 遵循OCPP规范:确保代码符合Cocos2d-x的最佳实践。
        6. 通过上述技术实现,本次项目不仅完成了扑克牌的创建与管理,还确保了游戏的触摸交互流畅性和用户体验优化。

    上一篇:cocos2d-x 播放音乐和音效
    下一篇:Cocos2d-x制作《单机斗地主》源码解剖2:洗牌和发牌

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月17日 00时08分21秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章