cocos2d-x 仿 消灭星星(满天星) 源码+解析

今天要写一篇关于cocos2d-x的实战教程, 仿消灭星星(满天星)。..... 如果你不知道什么是消灭星星.. 百度!

这是大一刚学cocos2d-x时候写的一个例子,  今天整理文件的时候发现的。

觉得直接丢了怪可惜的, 就稍微整理了下, 写篇教程让大家一起学习。

当然, 在这之前你如果没有cocos2d-x 基础知识... 那么还是先学习了再参考吧。

此篇博文作为cocos2d-x 实战练习, 并非教学教程。

首先, 看下游戏运行效果。

                  

可以从我的git上下载对应的源码:   myPopStar

下面简单对源码做下介绍, 具体还是自己看代码, 玩玩。

一。划分网格, 建立棋盘。

// 网格划线,利用格子长宽
void StarLayer::draw(void)
{
    CCLayer::draw();
    // 横线
    for (int x=0; x<=10; x++)
    {
        CCPoint pos1 = ccp( 0, height*x );
        CCPoint pos2 = ccp( wid_num*width, height*x );
        ccDrawLine(pos1, pos2);
    }

    //竖线
    for (int y=0; y<=10; y++)
    {
        CCPoint pos1 = ccp( width*y, 0 );
        CCPoint pos2 = ccp( width*y, hei_num*height );
        ccDrawLine(pos1, pos2);
    }

}

这里简单用到了ccDrawLine来画出一条条白线, 便于观察。

在每个格子中, 填充星星。也就是初始化棋盘, 添加星星。

//初始化棋盘
    dataHandle->initDateHandleWith(wid_num, hei_num, width, height);

    //作为所有已经加入到棋盘中棋子的父结点
    starsSpriteParent = CCNode::create();
    this->addChild(starsSpriteParent);
    starsSpriteParent->setAnchorPoint(ccp(0,0));
    starsSpriteParent->setPosition(0, 0);

    //添加棋子。
    for (int i = 0; i<count_num; i++)
    {
        int _type = arc4random() % 5 + 1;

        StarSprite *_sprite = StarSprite::create();
        _sprite->initWith( dataHandle->SD_convertIndexToLinesProperty(i), _type );
        _sprite->setPosition(dataHandle->SD_getPositionAtIndex(i));

        starsSpriteParent->addChild(_sprite);
        dataHandle->SD_resetStateAtIndex(i, _type);
    }

这里设计的主要操作包括:

    //初始化棋盘
    void initDateHandleWith(int _column,int _row,float _width,float _height);

    //返回该下标处棋子的状态。  0表示空,非0表示该位置有棋子了。
    int SD_getStateAtIndex(int _index);

    //在相应下标位置设置棋盘上棋子种类。
    void SD_resetStateAtIndex(int _index,int _value);

    //返回棋子下标。  利用棋子行列数返回棋子下标
    int SD_getIndexAt(const StarProperty & _p);

    //返回对应下标处棋子格子的坐标
    CCPoint SD_getPositionAtIndex(int _index);

    //通过传来的坐标,和宽度,返回棋子下标
    int SD_getIndexAtPosition(CCPoint _pos,float _diatance);

    //返回选中棋子的具体行数列数。   参数为棋子下标
    StarProperty SD_convertIndexToLinesProperty(int _index);

至于具体实现过程, 还是看代码吧。 内容比较多就不一一介绍了。代码中注释也写的比较详细。

二。游戏逻辑

这里主要要考虑到这么几个问题:

1. 点击的地方, 是否是一次有效点击? 即是否点到了一个还存在的星星?

2. 选中一个星星, 它附近有几个紧邻的?

3. 消除一次星星后, 是否有空出的行/ 列?

4. 游戏是否介绍, 即是否没有可消除的星星?

考虑完这几个问题, 那么这个游戏就差不多了。

至于如何判断, 怎么实现, 可以自己先想想。之后再看代码。

下面给出判断各个方向是否有紧邻星星的办法。

当然, 这个办法只是为了实现这个功能, 具体的效率我不敢保证,毕竟没经过优化。

//检查函数
int StarDataHandle::SD_check_total( int _index, int type ,bool style_check)
{
    is_gameover_check = style_check;
    total_same_color = 1;
    now_index = _index;
    now_type = type;
    now_w = _index % total_x;
    now_h = _index / total_x;

    SD_check_up(now_index+total_x, now_type);

    SD_check_down(now_index-total_x, now_type);

    SD_check_left(now_index-1, now_type);

    SD_check_right(now_index+1, now_type);

    return total_same_color;

}
void StarDataHandle::SD_check_up( int _index, int type )
{
    if (_index >= 0 && _index < total_count && (_index / total_x >= now_h) && SD_getStateAtIndex(_index) == type)
    {
        if (!is_gameover_check)
        {
            SD_resetStateAtIndex(_index, 0);
        }
        total_same_color++;
        SD_check_up(_index+total_x, type);

        SD_check_left(_index-1, type);

        SD_check_right(_index+1, type);
    }
}
void StarDataHandle::SD_check_down( int _index, int type )
{
    if (_index >= 0 && _index < total_count && (_index / total_x <= now_h) &&SD_getStateAtIndex(_index) == type)
    {
        if (!is_gameover_check)
        {
            SD_resetStateAtIndex(_index, 0);
        }
        //        CCLog("%d", _index);
        total_same_color++;

        SD_check_left(_index-1, type);

        SD_check_right(_index+1, type);

        SD_check_down(_index-total_x, type);
    }
}
void StarDataHandle::SD_check_left( int _index, int type )
{
    if (_index >= 0 && _index < total_count && (_index % total_x <= now_w) && SD_getStateAtIndex(_index) == type)
    {
        if (!is_gameover_check)
        {
            SD_resetStateAtIndex(_index, 0);
        }
        //        CCLog("%d", _index);
        total_same_color++;

        SD_check_left(_index-1, type);

        SD_check_up(_index+total_x, type);

        SD_check_down(_index-total_x, type);
    }
}
void StarDataHandle::SD_check_right( int _index, int type )
{
    if (_index >= 0 && _index < total_count && (_index % total_x >= now_w) && SD_getStateAtIndex(_index) == type )
    {
        if (!is_gameover_check)
        {
            SD_resetStateAtIndex(_index, 0);
        }
        //        CCLog("%d", _index);
        total_same_color++;

        SD_check_right(_index+1, type);

        SD_check_up(_index+total_x, type);

        SD_check_down(_index-total_x, type);
    }

}

这篇文章就写到这里了。希望对大家有所帮助。

学习的路上, 与君共勉。

时间: 2024-10-07 06:36:12

cocos2d-x 仿 消灭星星(满天星) 源码+解析的相关文章

礼物说仿写项目iOS源码

礼物说仿写(updating...) 源码下载:http://code.662p.com/view/14507.html api: 礼物说 首页精选 banner2: http://api.liwushuo.com/v2/secondary_banners?gender=1&generation=2 banner1: http://api.liwushuo.com/v2/banners?channel=iOS 精选: http://api.liwushuo.com/v2/channels/101

Android应用源码仿暴风影音安卓客户端源码

Android应用源码仿暴风影音安卓客户端源码 本项目是一个模仿暴风影音的UI项目源码,仿照的界面有菜单页,主页,分类页等,项目内的所有数据都使用的本地模拟数据,仿照度一般在大分辨设备上布局显示会有问题,480x800的分辨率应该正合适,默认编译版本4.2.2编码GBK,注释不多,需要的朋友可以下载看一下. 下载地址:http://www.devstore.cn/code/info/133.html 运行截图:     版权声明:本文为博主原创文章,未经博主允许不得转载.

仿hao123网址导航源码HTML整站下载

仿hao123网址导航源码HTML整站下载 功能分类:导航            支持平台:其他        运行环境:其他 开发语言:Javascript   开发工具:其他        源码大小:3.24MB 下载地址:http://sina.lt/z4V 源码简介 经典实用的风格,集时间日期.天气预报.邮箱登陆.搜索引擎.名站.酷站.实用工具.分类目录等常用模板,布局合理,版面简洁,文字清晰,让浏览者一步直达目标网站. 源码运行截图

高仿&lt;饿了么&gt;源码

高仿饿了么源码 高仿饿了么界面效果,动画效果还是不错滴,分享给大家一下. 下载地址:http://www.devstore.cn/code/info/1110.html 运行截图:    3 热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章,未经博主允许不得转载.

高仿精仿安卓疯狂猜图游戏源码

给大家分享一款不错的高仿精仿安卓疯狂猜图游戏源码,喜欢的朋友可以下载看看.游戏<ignore_js_op> 源码下载 http://code.662p.com/view/2960.html 详细说明:http://android.662p.com/thread-359-1-1.html

android 仿网易新闻客户端源码都有

原文:android 仿网易新闻客户端源码都有 android 仿网易新闻服务端源码 源代码下载地址: http://www.zuidaima.com/share/1550463560944640.htm http://www.zuidaima.com/share/1550463561206784.htm android 仿网易新闻 客户端和服务端 源码都有 ,有些功能还未实现,因为文件有点大,所以分为2次上传  java源代码截图:

Android仿联系人列表分组悬浮列表,PinnedHeaderListView源码解析

github地址:https://github.com/JimiSmith/PinnedHeaderListView 关于实现类似联系人列表,组的头部总是悬浮在listview最顶部的效果,github上面有两个比较好的实现,分别是pinnedSectionListview和pinnedHeaderListView,之所以选择后者进行源码解析,是因为后者的源码比较简单,便于我们理解实现的精髓所在. 如果你想直接实现Android仿联系人列表分组悬浮列表, 自定义PinnedHeaderListV

android版高仿淘宝客户端源码V2.3

android版高仿淘宝客户端源码V2.3,这个版本我已经更新到2.3了,源码也上传到源码天堂那里了,大家可以看一下吧,该应用实现了我们常用的购物功能了,也就是在手机上进行网购的流程的,如查看产品(浏览),下订单,进行付款等流程,该应用一一实现了,同时还可以远程读取图片功能,和实时监控网络状态等操作,大家如果有什么不同的意见可以留下,我们会定时来查看. 原文地址:http://www.cnblogs.com/androidioscom/p/3613035.html [1].[代码] [Java]

Dialog与FragmentDialog源码解析

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/46402845 [导航] - 弹出式对话框各种方案 从仿QQ消息提示框来谈弹出式对话框的实现方式 (Dialog,PopupWind,自定义View,Activity,FragmentDialog) - Dialog源码解析 从源码上看Dialog与DialogFragment 1.概述 前一篇写了