俄罗斯方块大消除安卓类的游戏音效哪家做的好?

为何在消除手游市场,往往是一家独大?新的消除游戏是否还有机会突围?
为何在消除手游市场,往往是一家独大?新的消除游戏是否还有机会突围?
文 | 王添 月球叛客 boq导语: 今天国内市场上的消除类手游数量并不少,但相信大部分玩家能叫得上名字来的热门消除类手游一只手都能数得过来。这个游戏品类的在国内的特殊性,让它的市场呈现出一股相对古怪的态势,看似玩法简单的某些休闲游戏却达到惊人的用户留存率和非常不俗的收入能力,同时在这个市场上往往也是这几款游戏吃光所有玩家,并且可以持续运营几年之久。这背后这些游戏做了什么?那新的消除手游是否有属于自己的一席之地?要做好这个市场,今天除了玩法创新外,还要注意什么?  报告显示:休闲类手游现是各大移动厂商青睐的游戏品类,而在休闲类手游的二级分支中,消除类手游的营收排行占比高达31.7%,在市场中拥有非常活跃的表现。 目前中国消除类手游的前5名中,《开心消消乐》和《海滨消消乐》都是国民休闲手游开放商乐元素旗下的产品,前段时间在乐元素IPO的公告中我们也可以看到,他们九成的收入都来自于《开心消消乐》等游戏。《宾果消消消》和《快乐点点消》也是分别由业界知名的休闲手游公司柠檬微趣和DreamSky开发和发行,《天天爱消除》则背靠腾讯大树。可以说,消除类手游的头部产品几乎由知名厂商垄断,后来者难以突围。 长盛不衰的消除品类 那么要说形成今天的市场状况,首先我们先了解下这个品类的特质。 说起消除类游戏的起源,大家不难想到:《俄罗斯方块》。《俄罗斯方块》堪称消除类手游的鼻祖,因为它定义了游戏最基本的游戏规则:游戏不断地给玩家一些可供消除的图案,玩家需要根据游戏的规则使这些图案排列成某一种状态进而消除部分图案,玩家的游戏目标就是不断地消除图案以通过关卡获取游戏胜利。 也许我说的比较绕口,不过这种消除的游戏机制可谓再简单、再明确不过了。 维基百科的资料显示:截止到2010年,《俄罗斯方块》仅在手机平台的下载量已突破1亿大关。《俄罗斯方块》自1984年问世之后便风靡全球,至今仍受到各国玩家的喜爱,可谓长盛不衰。  所以我们不妨来总结一下消除类手游到底有哪些优势? 1. 门槛低,减少玩家学习成本,尤受女性玩家青睐 门槛低源于游戏规则的简单。我一直认为,最好的游戏应该采用尽可能少的限制条件来创造尽可能多的变数,中国的古典游戏围棋就是一个明证。玩消除类手游,玩家几乎没有学习成本,不会像某些重度手游那样一开始就将大量的“游戏力”不足的玩家拒之门外,因此天生拥有较为广泛的用户基础。 2. 插缝碎片化,贴合移动趋势 用户在移动设备上的使用有一个非常显著的习惯:碎片化。并且,这种碎片化的趋势越来越强,体现在用户碎片用时的时长越来越短、精力集中度越来越低。 设想一个场景:现在《王者荣耀》已经成为大多数大学生们的手机装机必备软件了,不过他们中的大多数选择在晚上躺床上玩,这一行为我们可以解读为:他们希望寻找一个相对完整的时间来认真对待游戏。因此,大多数人不会选择在下课的10分钟内开局。如何占据大学生在《王者荣耀》之余的这10分钟下课时间,消除类手游无疑是合适的。其较短的每关用时,不会占用到10分钟。3. 不断的实时反馈给予玩家不间断的成就感 关于成就感这一点,休闲手游不同于3A大作,不需要承担第九艺术的重担,只是用来给玩家放松的,因此不能消耗玩家过多的精力,否则就适得其反了。 某些自称休闲的手游让玩家玩得很累,原因在于它们除了游戏目标达成之外不再给玩家任何的成就感,这样会给玩家一种为了完成任务而游戏的感觉,一旦任务没有完成,似乎就白玩了。还是以《王者荣耀》为例,或许你输了某一局,但是你在这一局中你完成了5杀,这“5杀”就是你在游戏目标达成之外获得的成就感。 不断的成就感激励有助于玩家进行深入的游戏体验。消除类手游在这一点上无疑拥有得天独厚的优势,因为每一次成功的消除都是一种成就感的获得,消除成功时那闪烁的动画、清脆的音效正是游戏设计者给玩家的鼓励,就是这样的不间断的鼓励给了玩家一个持续的内在驱动,驱动玩家去寻求更多的成就感,进而深入体验游戏。  不过,消除类手游纵有千般好,目前也遇到了不少问题,其中最具代表性的就是:同质化和营收垄断。 消除类手游头部产品一家独大的秘密 消除类游戏在市场并不少,可见并不难开发,但是奇怪的是,消除类游戏在国内市场已经多年未见有新品能挑战头部产品的地位。那么到底是有哪些因素造成的? 我们来进行下反推。今天很多消除类手游的核心玩法都是一样的,而这种玩法规则又非常简单,深入人心,所以很多用户尝试新的产品后,都会产生和之前产品无异的想法。国内外热门的消除类游戏,大部分内核都是三消,不同之处是用了不一样的美术形象 同时,正因为这一个设定已经普及的用户,后人要花比较大的力气才能做出创新,而且这个创新未必让用户所接收,所以国内普遍都是互相抄袭居多,在玩法和美术上太雷同的情况下,导致没有办法在市场上取得大的突破。 那么,当时的产品做到了这几点,就形成了一个较高的竞争门槛。 1. 入局早,抢占先机 在同质化严重的消除手游市场,市场自然会选择那些“大作”,比如《开心消消乐》、《天天爱消除》等等,首先因为这些大作拥有渠道优势。其次他们在手游市场开拓初期便已入局,打造了自己的品牌影响力,有着相当大的用户基数。乐元素的徐辉曾坦言,《开心消消乐》 之所以取得大好成绩,是因为赶上了智能手机高速增长的时代,赶上了微信游戏渠道第一批开放的机会。如今,虽然出现了不少在玩法和美术上都不输于《开心消消乐》的手游,但是它们都难以复制《开心消消乐》的成功。 2. 游戏可扩展性强,保证用户的留存时间 《开心消消乐》的手机版在2014年初上线,当时极快便在玩家之间传播开来。有了大量用户后游戏就需要通过更新内容来留着玩家,而这一点对于消除游戏来说操作难度并不会太高。此类游戏在内容更新上更加灵活,不像其他游戏类型在立项之初就需要规划好整个游戏系统,它可以在较短的时间内设计出新关卡、新道具甚至是新玩法来保持用户的活跃度,同时又不需花费太多的资源投入。这种灵活的扩展性也是保持产品活力的关键。以《开心消消乐》为例,目前游戏已经有超过1000个关卡、8个关卡类型和50多个障碍,而且目前还在不断地更新当作。 3. 高收入带来持续的推广与渗透,保持曝光率 乐元素的CEO王海宁在采访中就曾说:游戏需要做持续广泛有规模的推广,要适配很多的机型,尤其在中国,一线、二线、三线到五线都非常不一样,你做一个三个月的推广,只能影响到一线城市的人群。你还必须做出简单易玩的游戏类型,无论什么样年龄段的人都可以玩懂,让不花钱的用户也能获得很好的游戏体验。《开心消消乐》游戏带来的收入,让游戏又可以持续得做推广与宣传,玩法天生的易上手又可以保证持续地获取用户,这对于他们来说已经形成了一个增长循环。 根据QuestMobile发布的数据显示,2016年12月份四线及以下城市App活跃渗透率Top 10中,消除游戏《开心消消乐》、《宾果消消乐》、《天天爱消除》等就占据3席,其中,《开心消消乐》以12.7%的渗透率高居游戏类App榜首,而在人均时长方面,《开心消消乐》也以单月478.5分钟(近8小时的的成绩占据头名,领先第二名《天天爱消除》多达134.5分钟。 4. 玩家忠诚度高 而从玩家的角度来看,如果玩家在手机上已经安装了一个消除手游,并且用了相当长一段时间通过到了后期的关卡,又或是已经有了金钱投入,这会让玩家和他们主玩的消除游戏建立起一个相当紧密的联系,这时候的消除游戏已经不是大众印象中的“轻度游戏”了,而是非常重度向了。在这样的情况下,如果又有一个在玩法上大同小异的消除新游出现,很难会吸引到既有玩家的注意,除非是做出了非常大的创新的情况下,而这偏偏又非常不易。 在国内iPhone端的iOS上搜索“消除”关键词,搜索结果数量高达1845。 在欧美市场,消除类游戏的生命力已经得到验证,但一些创新的消除游戏也正在打破垄断局面。King的《糖果粉碎》系列一直是消除游戏的霸主,但来自俄罗斯开发商Playrix的《梦幻花园》正在打破这种局面。2016年上线的《梦幻花园》与2017年上线的《梦幻家园》皆在消除的基本玩法上加入了经营养成模式,这让游戏在玩法上更加多变,同时抵达用户的能力也大大增加。App Annie美国9月份iOS & Google Play收入榜前十 App Annie英国9月份iOS & Google Play收入榜前十,前三皆为消除游戏4. 国内渠道难给量:没有真正有创新的产品 所以,除了几个热门产品外,国内许多消除手游,无论是名字、美术风格还是玩法都十分雷同,这导致在市场不太可能实现突破。而在头部产品已经占据大量用户的前提下,老用户自己不会被吸引到,而新用户在这种情况下,第一选择也是最热门的产品,同时真正创新的产品渠道往往试验一波数据不好就放弃,越发让新晋者不敢冒风险,后期纯拼数值,同质化更严重了。这就变向巩固了头部产品的优势地位。 虽然很难,但做好这6点依旧是后来者突围关键 所以,今天冀望继续在消除品类上发展的从业者,要打破用户固化思维,让他们愿意尝鲜,多半要从本身核心玩法以及一些特色创新上去努力。 如何进行创新?游戏陀螺认为可以从这7个层面考虑。 1. 消除机制本身的玩法创新 消除游戏本身的玩法已经非常精炼,想要进行创新确实不容易。但是如果从维度角度考虑的话,仍然存在创新空间。最初的三消手游(三消手游指3个相同的图案连接在一起会自动消除)是一种线性消除,是一维消除;后来逐渐出现了多向消除,实现了从线到面的跨越,是二维消除。因此未来的消除手游或许可以考虑3维的空间消除乃至于加上时间轴的4维消除。 2. 从玩家市场角度切入:关注女性玩家群体 VOLTAGE公司曾在2015年针对女性玩家做了一项调查: 很明显女性玩家对消除类手游更加偏爱 南加州大学也于2017年公布了一组研究数据,调查结果称女性玩家倾向于消除类游戏和养成类游戏。如果从这组数据出发,在消除手游中融入养成元素将能更加获得女性玩家的青睐。不同于男性,女性的思维逻辑能力不强,是偏感性的动物,不擅长过于复杂的多线程操作,如果让她们玩那种游戏,只会给心理带来负担。与此同时,女性似乎有一种天生的“整理”情结,她们喜欢将一切无序的事物归于有序,消除类手游恰好能够满足她们这种“整理”的心理。而开发出《梦幻花园》与《梦幻家园》等“梦幻”系列休闲游戏的Playrix自2004年成立后,一直致力于开发面对女性玩家的休闲游戏,他们有70%的玩家都是女性玩家。 3. 从游戏市场角度切入:融入热门元素 热门元素有很多,IP、明星、二次元都可以算作其中。套用人气IP确实可以在短时间内快读达到一定效果,但这要考虑到IP成本的投入,当红明星也可以在一定程度上起到立竿见影的效果,如目前排名榜第二的《宾果消消消》就是请到了赵丽颖代言。而在最近这两年二次元火热的时候,《诺文尼亚》抓住了这一契机。这个二次元消除手游《诺文尼亚》的首测次留高达55%,七日留存也平均达到了24%,在同类游戏中表现突出。  4. 深化社交机制 《天天爱消除》制作人吴凡凡曾言道:“玩家可以通过微信、手机QQ等晒出自己的游戏成绩、互相送‘心’等等,这样有利于保持玩家的黏性和活跃度。”不过社交元素的建立可能需有平台助力。 所谓加强社交,如果只是简单地让玩家之间送礼物或是在朋友圈晒成绩,这种社交机制缺乏特色,也较为脆弱。日本手游厂商mixi在2016年推出的消除手游《漫威Tsmu》的做法值得借鉴。  《漫威Tsmu》的最大特色就是其创新性地加入了“实时合作战斗”的社交机制。该作采用实时战斗的模式,玩家的一举一动都将对好友的战斗造成影响。同时,游戏中的敌方并非同时出现在联机双方玩家的屏幕上,而是在双方的屏幕上不断穿梭,这样的设计能营造出两边的超级英雄共同追捕敌方的临场感,在潜移默化中加深了双方玩家的交流。《漫威Tsmu》的这一创新式的社交设计使它在没有进行推广的情况下首周下载量就突破了百万。 5. 了解玩家喜好,重视用户体验 不同于其他品类的游戏,消除类手游是面向大众的,一款成功的消除类手游必然拥有千万级的海量用户,因此如何使得设计尽可能不被多的人讨厌,是一个关键所在。 将中国的消除类手游和海外的消除类手游做一个对比,不难发现,海外消除手游的主角往往是蛋糕、甜点等静物,而中国的消除手游主角往往是动物。《开心消消乐》的制作人甘玉磊曾对此做出过解释。“设计了36个方案最终才确定动物形象。”甘玉磊称,团队在形象设定上就花了将近两三个月的时间。他们最终决定使用动物的形象是因为他们认为中国玩家喜欢有感情的东西,并且容易喜欢上它们,而海外的糕点等形象过于冰冷。另一方面,《开心消消乐》的团队还注意到“欧洲人和亚洲人的眼睛有差异”,因此为了操作更容易和匹配更容易,形象的区分度和饱和度需要加强。 6. 多类型玩法融合 作为在消除手游市场表现相当优异的新秀《梦幻花园》跟其续作《梦幻家园》则给消除类游戏提供了一个新的参考。以《梦幻家园》为例,这款游戏融合了消除与养成的玩法,玩家每通过一关,便可以获得一个星星,而这些星星可以用来添置翻新家具,在这里,玩家可以选择家具的式样与颜色。虽然可供选择的范围不算很多,但这一点经营元素显然让玩家能感受到除了单纯闯关以外其他带来的成就感与动力,给固化的消除市场带来耳目一新的感觉。其他消除新游能不能也通过消除+其他类型的玩法来做创新呢? 在消除类市场的未来,我们能不能看到颠覆性的改变? 作为电子游戏平台上历史最悠久的品类之一,消除游戏目前在手游市场上的表现跟它的核心玩法一模一样:单一又稳定。获利最多的毫无疑问是最先抢占手游市场的那一波产品,相信在许多不怎么接触消除游戏的玩家心中,这个品类已经跟《开心消消乐》、《天天爱消除》、《糖果传奇》等划上等号了。在这种情况下,想做到颠覆并不容易。但并不是说新游就不可能突围,只不过再做一款美术风格跟玩法都没有突破的消除游戏是肯定没办法取得成功的。 首先,要愿意潜入精力去做一款精品。对于用户需求的变化以及制作精品的把握,都是未来突围的必备条件。其次,今天头部产品的地位牢固,而且因为上述原因,这类游戏的生命周期可能做得很长,想接手必须要把握住一个好时机,把握好突围的时间点。当用户真正想从这个品类中尝试新的玩法,新的乐趣,就是你最佳的切入点以及投入时机。在这之前,要时刻判断调整产品。再者,海外对三消游戏有更多的玩法需求,海外渠道也对创新比较宽容,模式上可以先打海外和iOS,产品验证成功之后,再回来做国内的安卓市场。这个过程也有益于口碑的积累。 从近期一些三消产品的表现,加上不少大厂在创新三消产品上的动作,可以看出,其实随着市场几年的发展,或者又到了新的需求更迭点,如果我们研究三消游戏的开发者能坚持沉下心来去做精品,然后捕捉住机会,那么至少能做出一款在市场中站立脚跟的产品。 
来源:游戏陀螺
叶子猪每日行业播报系叶子猪游戏网出品的资讯栏目,仅作于汇聚互联网游戏行业的每日资讯,如需查看文章出处可点击阅读原文。游戏背景音乐_游戏背景音乐排行榜_好听的游戏背景音乐大全 - 365音乐网
最新入榜歌曲
游戏背景音乐歌曲
本列表1-3天更新一次,第一时间发布最新最好听的游戏背景音乐歌曲
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
查看更多...
在线音乐门户,分享最新网络歌曲,带给你最好听的新歌
记住我们的域名:www.yue365.com当下软件园 / 汇聚当下最新最酷的软件下载站!
热门搜索:
您的位置:
> 圣诞谜题 1.0.1.0 鸾霄汉化绿色版 [砖块消除类游戏、带有清脆悦耳的消除音效]
圣诞谜题 1.0.1.0 鸾霄汉化绿色版 [砖块消除类游戏、带有清脆悦耳的消除音效]
网友评分:10分
圣诞谜题是一款圣诞主题的砖块,伴随着温馨甜蜜的圣诞音乐和清脆悦耳的消除音效,不断切换的圣诞雪景图片,营造出轻松欢快的圣诞氛围。游戏为标准的砖块消除类,上手简单,只需要消除所有的金银方砖并把硬币移到板块边缘即可过关,而获得的硬币可以用于购买种类繁多的装饰品,装点主界面的圣诞小屋;游戏没有时间限制,玩家可以一边聆听悦耳的圣诞音乐,泡一杯清茶,点点鼠标,与家人,朋友,恋人一起度过这个寒冷但又温馨的圣诞之夜。
软件特别说明
其他版本下载
圣诞谜题 1.0.1.0 鸾霄汉化绿色版 [砖块消除类游戏、带有清脆悦耳的消除音效]
138.07M / 简体中文 /10
139.87M / 简体中文 /7.2
123.69M / 简体中文 /8.1
46.41M / 简体中文 /7
27.94M / 简体中文 /5.8
43.47M / 简体中文 /9.5
Copyright (C)
www.downxia.com.All rights reserved.AppDelegate.cpp#include "AppDelegate.h"
#include"WelcomeScene.h"
#include "SimpleAudioEngine.h"//声音管理类
using namespace CocosD//声音类处于该命名空间中
USING_NS_CC;
AppDelegate::AppDelegate() {
AppDelegate::~AppDelegate()
//if you want a different context,just modify the value of glContextAttrs
//it will takes effect on all platforms
void AppDelegate::initGLContextAttrs()
//set OpenGL context attributions,now can only set six attributions:
//red,green,blue,alpha,depth,stencil
GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};
GLView::setGLContextAttrs(glContextAttrs);
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director-&getOpenGLView();
&span style="white-space:pre"& &/span&if (!glview)
&span style="white-space:pre"& &/span&{
&span style="white-space:pre"&
&/span&glview = GLViewImpl::create("Halloween");
&span style="white-space:pre"&
&/span&director-&setOpenGLView(glview);
&span style="white-space:pre"&
&/span&glview-&setFrameSize(360, 600);&span style="white-space:pre"& &/span&//设置屏幕大小
&span style="white-space:pre"& &/span&}
director-&getOpenGLView()-&setDesignResolutionSize(360, 600, ResolutionPolicy::EXACT_FIT);//适配策略,适应屏幕
&span style="white-space:pre"& &/span&
// turn on display FPS
/* director-&setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
director-&setAnimationInterval(1.0 / 60);
&span style="white-space:pre"& &/span&*/
FileUtils::getInstance()-&addSearchPath("res");
// create a scene. it's an autorelease object
auto scene = WelcomeScene::createScene();
director-&runWithScene(scene);
// This function will be called when the app is inactive. When comes a phone call,it's be invoked too
void AppDelegate::applicationDidEnterBackground() {
Director::getInstance()-&stopAnimation();
// if you use SimpleAudioEngine, it must be pause
SimpleAudioEngine::getInstance()-&pauseBackgroundMusic();
&span style="white-space:pre"& &/span&
// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
Director::getInstance()-&startAnimation();
// if you use SimpleAudioEngine, it must resume here
SimpleAudioEngine::getInstance()-&resumeBackgroundMusic();
#pragma once
#define Screen_Width 360
#define Screen_Height 600
#define TOTAL_SPRITE 6
#define ROW 10
#define COL 6
#define SpriteWideth 48
#define BorderWideth 5
static const char * spriteNormal[10] =
GameScene.h#pragma once
#include"cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
#include"Define.h"
#include"SpriteShape.h"
USING_NS_CC;
class GameScene :public cocos2d::Layer
static Scene * createScene();
virtual bool init();
virtual void onBackItemCallback(Ref * pSender);
void initMap();
void createSprite(int r, int c);
Vec2 PositionOfItem(int r, int c);
void update(float dt);
void checkAndRemoveSprite();
void getColChain(SpriteShape * spr, std::list&SpriteShape*&&chainList);
void getRowChain(SpriteShape * spr, std::list&SpriteShape*&&chainList);
void SpriteRemoveAction(SpriteShape *spr);
void markRemove(SpriteShape* spr);
void removeSprite();
void FillSprite();
bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* evt);
void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* evt);
SpriteShape *spriteOfPoint(Vec2 *position);
void swapSprite();
void MyClock(float dr);
void gameOverCallback(Node *node);
CREATE_FUNC(GameScene);
SpriteShape * map[ROW][COL];
bool isA//表示是否正在执行动作
bool isFillS//表示是否需要进行填充操作
bool isTouchE
bool isGameO
SpriteShape *startS
SpriteShape* endS
GameScene.cpp
#include"cocos2d.h"
#include"GameScene.h"
#include"WelcomeScene.h"
#include"SpriteShape.h"
#include"Define.h"
#include"SetScene.h"
#include "SimpleAudioEngine.h"//声音管理类
#pragma execution_character_set("utf-8")
using namespace CocosD//声音类处于该命名空间中
USING_NS_CC;
Scene* GameScene::createScene()
auto scene = Scene::create();
auto layer = GameScene::create();
scene-&addChild(layer);
bool GameScene::init()
if (!Layer::init())
SpriteFrameCache::getInstance()-&addSpriteFramesWithFile("res/sucai.plist");
//设置背景图片
auto pDirector = Director::getInstance();
auto pSprite = Sprite::create("res/GameBackground.png");
pSprite-&setPosition(Vec2(Screen_Width / 2, Screen_Height / 2)); //通过宏定义,保证图片在屏幕中间
this-&addChild(pSprite);
//设置返回按钮
auto setItem = MenuItemImage::create("res/back1.png", "res/back2.png", CC_CALLBACK_1(GameScene::onBackItemCallback, this));
setItem-&setPosition(Vec2(Screen_Width / 2 , Screen_Height / 8-30));
auto menu = Menu::create(setItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//监听移动触摸事件
this-&scheduleUpdate();
auto touchListener = EventListenerTouchOneByOne::create();
touchListener-&onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this);
touchListener-&onTouchMoved = CC_CALLBACK_2(GameScene::onTouchMoved, this);
_eventDispatcher-&addEventListenerWithSceneGraphPriority(touchListener, this);
//_eventDispatcher-&addEventListenerWithSceneGraphPriority(touchListener-&clone(), this);
isAction =
isFillSprite =
isTouchEnable =
isGameOver =
m_score = 0;
m_time = 60;
initMap();//初始化地图
//创建分数字体
auto ptextScore = ui::Text::create(StringUtils::format("Score:
%d",0), "res/marry.ttf", 25);
ptextScore-&setTag(10);//因为下面需要在update中访问,所以通过tag访问
ptextScore-&setPosition(Vec2(Screen_Width/4,Screen_Height-20));
this-&addChild(ptextScore);
auto ptextTime = ui::Text::create(StringUtils::format("Time: %d", 0), "res/marry.ttf", 25);
ptextTime-&setTag(11);//因为下面需要在update中访问,所以通过tag访问
ptextTime-&setPosition(Vec2(Screen_Width / 4*3, Screen_Height - 20));
this-&addChild(ptextTime);
if (SetScene::isMusicPlay)
SimpleAudioEngine::getInstance()-&playBackgroundMusic("res/GameBackGround.wav", true);
auto pParticle = ParticleSnow::create();
this-&addChild(pParticle);
schedule(schedule_selector(GameScene::MyClock),1.0f);//添加控制时间倒计时的定时器
bool GameScene::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* evt)
startShape = NULL;
endShape = NULL;
if (isTouchEnable)
auto pos = touch-&getLocation();
if (pos.x & 327 || pos.x & 39 || pos.y&519 || pos.y & 69)//如果点击在外面,则不做任何操作
startShape = spriteOfPoint(&pos);
if (startShape-&getImgIndex() == 8)//如果是那只猪,就消除整行
Vec2 mapPos = PositionOfItem(startShape-&getRow(), startShape-&getCol());//得到它在地图中的位置
auto pParticle = ParticleSystemQuad::create("res/leftrow.plist");
pParticle-&setPosition(mapPos);
this-&addChild(pParticle);
pParticle = ParticleSystemQuad::create("res/rightrow.plist");
pParticle-&setPosition(mapPos);
this-&addChild(pParticle);
int row = startShape-&getRow();
for (int c = 0; c & COL; c++)
markRemove(map[row][c]);
removeSprite();
return isTouchE
//实时判定移动的位置是否可以交换位置
void GameScene::onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* evt)
if (!startShape || !isTouchEnable)
int row = startShape-&getRow();
int col = startShape-&getCol();
auto pos = touch-&getLocation();
auto halfSpriteWideth = SpriteWideth / 2;
auto halfSpriteHeight = SpriteWideth / 2;
//判定是否向上移动到了上方的那个糖果中
auto upRect = Rect(startShape-&getPositionX() - halfSpriteWideth,
startShape-&getPositionY() + halfSpriteHeight + BorderWideth,
SpriteWideth, SpriteWideth);
if (upRect.containsPoint(pos))
if (row & ROW)
endShape = map[row][col];
swapSprite();
//判定是否向xia移动到了下方的那个糖果中
auto downRect = Rect(startShape-&getPositionX() - halfSpriteWideth,
startShape-&getPositionY() - halfSpriteHeight*3 - BorderWideth,
SpriteWideth, SpriteWideth);
if (downRect.containsPoint(pos))
if (row &=0)
endShape = map[row][col];
swapSprite();
//判定是否向zuo移动到了上方的那个糖果中
auto leftRect = Rect(startShape-&getPositionX() - halfSpriteWideth*3-BorderWideth,
startShape-&getPositionY() - halfSpriteHeight,
SpriteWideth, SpriteWideth);
if (leftRect.containsPoint(pos))
if (col &= 0)
endShape = map[row][col];
swapSprite();
//判定是否向右移动到了右方的那个糖果中
auto rightRect = Rect(startShape-&getPositionX() + halfSpriteWideth+BorderWideth,
startShape-&getPositionY() - halfSpriteHeight,
SpriteWideth, SpriteWideth);
if (rightRect.containsPoint(pos))
if (col & COL)
endShape = map[row][col];
swapSprite();
void GameScene::swapSprite()
// isAction =
isFillSprite =
isTouchEnable =
if (!startShape || !endShape)
Vec2 posOfScr = startShape-&getPosition();
Vec2 posOfDes = endShape-&getPosition();
float time = 0.2;
//交换开始位置跟结束位置
SpriteShape * temp=new SpriteShape();
/*map[startShape-&getRow()][startShape-&getCol()] = endS
map[endShape-&getRow()][endShape-&getCol()] = startS*/
temp = map[startShape-&getRow()][startShape-&getCol()];
map[startShape-&getRow()][startShape-&getCol()] = map[endShape-&getRow()][endShape-&getCol()];
map[endShape-&getRow()][endShape-&getCol()] =
int tempRow = startShape-&getRow();
int tempCol = startShape-&getCol();
startShape-&setRow(endShape-&getRow());
startShape-&setCol(endShape-&getCol());
endShape-&setRow(tempRow);
endShape-&setCol(tempCol);
//判断移动后的开始和结束两个精灵是否可以有消除的
std::list&SpriteShape *&colChainListOfF
getColChain(startShape, colChainListOfFirst);
std::list&SpriteShape *&rowChainListOfF
getRowChain(startShape, rowChainListOfFirst);
std::list&SpriteShape *&colChainListOfS
getColChain(endShape, colChainListOfSecond);
std::list&SpriteShape *&rowChainListOfS
getRowChain(endShape, rowChainListOfSecond);
if (colChainListOfFirst.size() &= 3
|| rowChainListOfFirst.size() &= 3
|| colChainListOfSecond.size() &= 3
|| rowChainListOfSecond.size() &= 3
//可以消除,进行移动
startShape-&runAction(MoveTo::create(time, posOfDes));
endShape-&runAction(MoveTo::create(time, posOfScr));
//不可移除的话就还移回来
map[startShape-&getRow()][startShape-&getCol()] = endS
map[endShape-&getRow()][endShape-&getCol()] = startS
tempRow = startShape-&getRow();
tempCol = startShape-&getCol();
startShape-&setRow(endShape-&getRow());
startShape-&setCol(endShape-&getCol());
endShape-&setRow(tempRow);
endShape-&setCol(tempCol);
//startShape-&runAction(Sequence::create(MoveTo::create(time, posOfDes), MoveTo::create(time, posOfScr),nullptr));
//endShape-&runAction(Sequence::create(MoveTo::create(time, posOfScr), MoveTo::create(time, posOfDes), nullptr));
SpriteShape *GameScene::spriteOfPoint(Vec2 *position)//获得当前位置的糖果
SpriteShape *spr = NULL;
Rect rect = Rect(0, 0, 0, 0);
sz.height = SpriteW
sz.width = SpriteW
for (int r = 0; r & ROW; r++)
for (int c = 0; c & COL; c++)
spr = map[r][c];
rect.origin.x = spr-&getPositionX() - (SpriteWideth / 2);
rect.origin.y = spr-&getPositionY() - (SpriteWideth / 2);
rect.size =
if (rect.containsPoint(*position))
void GameScene::initMap()
for (int r = 0; r & ROW; r++)
for (int c = 0; c & COL; c++)
createSprite(r, c);
void GameScene::createSprite(int r, int c)
isAction =
isTouchEnable =
SpriteShape * spr = SpriteShape::create(r, c);
Vec2 endPosition = PositionOfItem(r, c);
Vec2 startPosition = Vec2(endPosition.x, endPosition.y + Screen_Height / 2);
spr-&setPosition(startPosition);
float speed = startPosition.y / (1.2*Screen_Height);
spr-&runAction(MoveTo::create(speed, endPosition));//通过一个动画进行下落动作
this-&addChild(spr);
map[r][c] =
//每帧调用是否有可以消除的
void GameScene::update(float dr)
if (isAction)
isAction =
for (int r = 0; r & ROW; r++)
for (int c = 0; c & COL; c++)
SpriteShape *spr = map[r][c];
//int index = spr-&getImgIndex();
// if (spr-&getImgIndex()==8)
// auto pParticle = ParticleSystemQuad::create("res/fire.plist");
// pParticle-&setPosition(PositionOfItem(r, c));
// addChild(pParticle);
if (spr&&spr-&getNumberOfRunningActions()&0)//如果正在执行动作,就不执行消除的判定
isAction =
isTouchEnable =
if (!isAction)
isTouchEnable =
if (isFillSprite)
if(!isGameOver)
FillSprite();
isFillSprite =
checkAndRemoveSprite();
auto pscore = (ui::Text*)this-&getChildByTag(10);
pscore-&setString(StringUtils::format("Score:
%d", m_score));
void GameScene::MyClock(float dr)
if (m_time &=0)
auto ptime = (ui::Text*)this-&getChildByTag(11);
ptime-&setString(StringUtils::format("Time:
%d", m_time));
if (m_time == 10)
SimpleAudioEngine::getInstance()-&playEffect("res/daojishi.wav");
if (m_time == 0)
//游戏结束
SimpleAudioEngine::getInstance()-&pauseAllEffects();
SimpleAudioEngine::getInstance()-&playEffect("res/timeover.wav");
auto overSprite = Sprite::create("res/GameOver.png");
overSprite-&setPosition(Vec2(Screen_Width / 2 + 10, Screen_Height - 20));
overSprite-&runAction(Sequence::create(MoveTo::create(3.0f, Vec2(Screen_Width / 2 + 10, Screen_Height / 2)),
CallFuncN::create(CC_CALLBACK_1(GameScene::gameOverCallback, this)), nullptr));
this-&addChild(overSprite, 1);
isTouchEnable =
for (int r = 0; r & ROW; r++)
for (int c = 0; c & COL; c++)
markRemove(map[r][c]);
removeSprite();
isGameOver =
void GameScene::gameOverCallback(Node *node)
auto pDirector = Director::getInstance();
auto scene = WelcomeScene::createScene();
TransitionSplitCols * ptrans = TransitionSplitCols::create(1.0f, scene);//设置切换场景的方式,书本 P25
pDirector-&replaceScene(ptrans); //切换场景
void GameScene::FillSprite()
int colRemoveNumber[10] = { 0 };
SpriteShape *spr = NULL;
for (int c = 0; c & COL; c++)
int removeSpriteOfCol = 0;
for (int r = 0; r & ROW; r++)//从下往上遍历
spr = map[r][c];
if (spr == NULL)
removeSpriteOfCol++;
if (removeSpriteOfCol & 0)
//从上往下落
int newRow = r - removeSpriteOfC//比如有两个空的,原本第5行的就要到3行去
map[newRow][c] =
map[r][c] = NULL;
Vec2 startPostion = spr-&getPosition();
Vec2 endPosition = PositionOfItem(newRow, c);
float speed = (startPostion.y - endPosition.y) / Screen_Height * 3;
spr-&stopAllActions();
spr-&runAction(MoveTo::create(speed, endPosition));
spr-&setRow(newRow);
colRemoveNumber[c] = removeSpriteOfC//记录下每一列的空行数
for (int c = 0; c & COL; c++) //填充顶部的空的部分
for (int r = ROW - colRemoveNumber[c]; r & ROW; r++)
createSprite(r, c);
void GameScene::checkAndRemoveSprite()//判定是否有可以移除的糖果
SpriteShape *spr = new SpriteShape();
for (int r = 0; r & ROW; r++)
for (int c = 0; c & COL; c++)
spr = map[r][c];
//如果糖果已经被标记为需要被移除,则不需要进行判定
if (spr-&getIsNeedRemove())
//先遍历上下相邻的糖果,把相同的糖果放到一个list中
std::list&SpriteShape*&colChainL
getColChain(spr, colChainList);
if (colChainList.size() &= 3)//如果相同的大于等于3
std::list&SpriteShape*&::
for (it = colChainList.begin(); it != colChainList.end(); it++)
spr = (SpriteShape*)*
markRemove(spr);
for (int c = 0; c & COL; c++)
for (int r = 0; r & ROW; r++)
spr = map[r][c];
if (spr-&getIsNeedRemove())
std::list&SpriteShape*&RowChainL
getRowChain(spr, RowChainList);
//取更长的那个
// std::list&SpriteShape*&&longerList = colChainList.size()&RowChainList.size() ? colChainList : RowChainL
//if (longerList.size() & 3)
if (RowChainList.size() &= 3)//如果相同的大于等于3
std::list&SpriteShape*&::
for (rowit = RowChainList.begin(); rowit != RowChainList.end(); rowit++)
spr = (SpriteShape*)*
markRemove(spr);
removeSprite();
void GameScene::getColChain(SpriteShape * spr, std::list&SpriteShape*&&chainList)//判断列
chainList.push_back(spr);
//向下查找
int neiborRow = spr-&getRow() - 1;
while (neiborRow &= 0)
SpriteShape * neiborSprite = map[neiborRow][spr-&getCol()];
if (neiborSprite&&neiborSprite-&getImgIndex() == spr-&getImgIndex() && !neiborSprite-&getIsNeedRemove())
chainList.push_back(neiborSprite);
neiborRow--;
neiborRow = spr-&getRow() + 1;
while (neiborRow &ROW)
SpriteShape * neiborSprite = map[neiborRow][spr-&getCol()];
if (neiborSprite&&neiborSprite-&getImgIndex() == spr-&getImgIndex() && !neiborSprite-&getIsNeedRemove())
chainList.push_back(neiborSprite);
neiborRow++;
void GameScene::getRowChain(SpriteShape * spr, std::list&SpriteShape*&&chainList)//判断行
chainList.push_back(spr);
int neiborCol = spr-&getCol() - 1;
while (neiborCol &= 0)
SpriteShape * neiborSprite = map[spr-&getRow()][neiborCol];
if (neiborSprite&&neiborSprite-&getImgIndex() == spr-&getImgIndex() && !neiborSprite-&getIsNeedRemove())
chainList.push_back(neiborSprite);
neiborCol--;
neiborCol = spr-&getCol() + 1;
while (neiborCol & COL)
SpriteShape * neiborSprite = map[spr-&getRow()][neiborCol];
if (neiborSprite&&neiborSprite-&getImgIndex() == spr-&getImgIndex() && !neiborSprite-&getIsNeedRemove())
chainList.push_back(neiborSprite);
neiborCol++;
void GameScene::markRemove(SpriteShape* spr)
if (spr-&getIsNeedRemove())
spr-&setIsNeedRemove(true);
void GameScene::removeSprite()
SpriteShape *spr = new SpriteShape();
for (int r = 0; r & ROW; r++)
for (int c = 0; c & COL; c++)
spr = map[r][c];
if (spr-&getIsNeedRemove())
SpriteRemoveAction(spr);
map[r][c] = NULL;
void GameScene::SpriteRemoveAction(SpriteShape *spr)//精灵消失的动画
if(SetScene::isEffectPlay)
SimpleAudioEngine::getInstance()-&playEffect("res/xiaochu.mp3");
m_score += 30;
isAction =
isTouchEnable =
auto pFadeIn = FadeOut::create(0.6);
auto pRotateBy = RotateBy::create(0.6f, 180);//顺时针旋转30°,同样也有RotateTo版本
auto pScaleBy = ScaleBy::create(0.6f, 0.5f);
spr-&runAction(Spawn::create(pFadeIn, pRotateBy, pScaleBy, nullptr));
if (!isAction)
spr-&removeFromParent();
isFillSprite =
Vec2 GameScene::PositionOfItem(int r,int c) //一个小的精灵在地图中显示的位置
float x = (c + 1) * SpriteWideth + BorderWideth+10;
float y = (r + 1) * SpriteWideth + BorderWideth+40;
Vec2(x, y);
//返回到主界面按钮的回调函数
void GameScene::onBackItemCallback(Ref * pSender)
auto pDirector = Director::getInstance();
auto scene = WelcomeScene::createScene();
TransitionSplitCols * ptrans = TransitionSplitCols::create(1.0f, scene);//设置切换场景的方式,书本 P25
pDirector-&replaceScene(ptrans); //切换场景
//SimpleAudioEngine::getInstance()-&stopBackgroundMusic();
SetScene.h
#pragma once
#include"cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
class SetScene :public cocos2d::Layer
static cocos2d::Scene * createScene();
virtual bool init();
void onOpenMusicCallback(Ref * pSender);
void onCloseMusicCallback(Ref * pSender);
void onOpenEffectCallback(Ref * pSender);
void onCloseEffectCallback(Ref * pSender);
void onBackItemCallback(Ref * pSender);
static bool isEffectP
static bool isMusicP
CREATE_FUNC(SetScene);
SetScene.cpp
#include"cocos2d.h"
#include"SetScene.h"
#include"Define.h"
#include"WelcomeScene.h"
#include "SimpleAudioEngine.h"//声音管理类
using namespace CocosD//声音类处于该命名空间中
USING_NS_CC;
bool SetScene::isEffectPlay =
bool SetScene::isMusicPlay =
Scene* SetScene::createScene()
auto scene = Scene::create();
auto layer = SetScene::create();
scene-&addChild(layer);
bool SetScene::init()
if (!Layer::init())
cocos2d::Menu *
auto pDirector = Director::getInstance();
auto pSprite = Sprite::create("res/Set.png");
pSprite-&setPosition(Vec2(Screen_Width / 2, Screen_Height / 2)); //通过宏定义,保证图片在屏幕中间
this-&addChild(pSprite);
//添加打开音乐按钮
auto openMusicItem = MenuItemImage::create("res/openMusic.png", "res/openMusic2.png", CC_CALLBACK_1(SetScene::onOpenMusicCallback, this));
openMusicItem-&setPosition(Vec2(Screen_Width / 3 -20, Screen_Height / 3*2));
menu = Menu::create(openMusicItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//添加关闭音乐按钮
auto closeMusicItem = MenuItemImage::create("res/closeMusic.png", "res/closeMusic2.png", CC_CALLBACK_1(SetScene::onCloseMusicCallback, this));
closeMusicItem-&setPosition(Vec2(Screen_Width /3*2+20 , Screen_Height / 3*2));
menu = Menu::create(closeMusicItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//打开音效
auto openEffectItem = MenuItemImage::create("res/openEffect.png", "res/openEffect2.png", CC_CALLBACK_1(SetScene::onOpenEffectCallback, this));
openEffectItem-&setPosition(Vec2(Screen_Width / 3-20 , Screen_Height / 3));
menu = Menu::create(openEffectItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//关闭音效
auto closeEffectItem = MenuItemImage::create("res/closeEffect.png", "res/closeEffect2.png", CC_CALLBACK_1(SetScene::onCloseEffectCallback, this));
closeEffectItem-&setPosition(Vec2(Screen_Width / 3*2+20, Screen_Height / 3));
menu = Menu::create(closeEffectItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//设置返回按钮
auto bakcItem = MenuItemImage::create("res/back1.png", "res/back2.png", CC_CALLBACK_1(SetScene::onBackItemCallback, this));
bakcItem-&setPosition(Vec2(Screen_Width / 2 + 10, Screen_Height / 8 - 30));
menu = Menu::create(bakcItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
void SetScene::onOpenMusicCallback(Ref * pSender)
SimpleAudioEngine::getInstance()-&resumeBackgroundMusic();
isMusicPlay =
void SetScene::onCloseMusicCallback(Ref * pSender)
SimpleAudioEngine::getInstance()-&stopBackgroundMusic();
isMusicPlay =
void SetScene::onOpenEffectCallback(Ref * pSender)
isEffectPlay =
void SetScene::onCloseEffectCallback(Ref * pSender)
isEffectPlay =
void SetScene::onBackItemCallback(Ref * pSender)
auto pDirector = Director::getInstance();
auto scene = WelcomeScene::createScene();
TransitionTurnOffTiles * ptrans = TransitionTurnOffTiles::create(1.0f, scene);//设置切换场景的方式,书本 P25
pDirector-&replaceScene(ptrans); //切换场景
//SimpleAudioEngine::getInstance()-&stopBackgroundMusic();
SpriteShape.h#pragma once
#include"cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
class SpriteShape :public cocos2d::Sprite
SpriteShape();
static SpriteShape * create(int row, int col);
CC_SYNTHESIZE(int, m_row, Row);
CC_SYNTHESIZE(int, m_col, Col);
CC_SYNTHESIZE(int, m_imgIndex, ImgIndex);
CC_SYNTHESIZE(bool, m_isNeedRemove, IsNeedRemove);
CREATE_FUNC(SpriteShape);
SpriteShape.cpp
#include"cocos2d.h"
#include"SpriteShape.h"
#include"Define.h"
USING_NS_CC;
SpriteShape::SpriteShape() :m_isNeedRemove(false)
SpriteShape* SpriteShape::create(int row, int col)
SpriteShape *spr = new SpriteShape();
int randNum = rand() % 20;
spr-&m_row =
spr-&m_col =
if (randNum == 0)//20分之1的概率出现那只猪
spr-&m_imgIndex = 8;
spr-&initWithSpriteFrameName(spriteNormal[8]);
spr-&m_imgIndex = rand() % TOTAL_SPRITE;//10
spr-&initWithSpriteFrameName(spriteNormal[spr-&m_imgIndex]); //通过index加载图片
spr-&m_isNeedRemove =
spr-&setRow(row);
spr-&setCol(col);
spr-&autorelease();
WelcomeScene.h
#pragma once
#include"cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
class WelcomeScene:public cocos2d::Layer
static cocos2d::Scene * createScene();
virtual bool init();
virtual void onStartItemCallback(Ref * pSender);
virtual void onExitItemCallback(Ref * pSender);
virtual void onSetItemCallback(Ref * pSender);
CREATE_FUNC(WelcomeScene);
WelcomeScene.cpp
#include"cocos2d.h"
#include"WelcomeScene.h"
#include"GameScene.h"
#include"Define.h"
#include "SimpleAudioEngine.h"//声音管理类
#include"SetScene.h"
using namespace CocosD//声音类处于该命名空间中
USING_NS_CC;
Scene* WelcomeScene::createScene()
auto scene = Scene::create();
auto layer = WelcomeScene::create();
scene-&addChild(layer);
bool WelcomeScene::init()
if (!Layer::init())
cocos2d::Menu *
auto pDirector = Director::getInstance();
auto pSprite = Sprite::create("res/Welcome.png");
pSprite-&setPosition(Vec2(Screen_Width/2,Screen_Height/2)); //通过宏定义,保证图片在屏幕中间
this-&addChild(pSprite);
//添加开始按钮
auto pNormalSprite = Sprite::create("res/start.png"); //导入两张图片作为精灵,代表按钮正常和选定的样子
auto pSelectedSprite = Sprite::create("res/start2.png");
pNormalSprite-&setOpacity(220);//透明度设置0-255
pNormalSprite-&setScale(0.8f);//图片太大了,缩放一半
pSelectedSprite-&setScale(0.8f);
auto StartItem = MenuItemSprite::create(pNormalSprite, pSelectedSprite, nullptr,
CC_CALLBACK_1(WelcomeScene::onStartItemCallback, this));
StartItem-&setPosition(Vec2(Screen_Width/2 + 15,Screen_Height/6));
menu = Menu::create(StartItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//添加退出按钮
auto exitItem = MenuItemImage::create("res/EXIT1.png", "res/EXIT2.png", CC_CALLBACK_1(WelcomeScene::onExitItemCallback, this));
exitItem-&setPosition(Vec2(Screen_Width / 6*5+25, Screen_Height / 8));
menu = Menu::create(exitItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//添加设置按钮
auto setItem = MenuItemImage::create("res/SET1.png", "res/SET2.png", CC_CALLBACK_1(WelcomeScene::onSetItemCallback, this));
setItem-&setPosition(Vec2(Screen_Width / 8 -20, Screen_Height /8));
menu = Menu::create(setItem, NULL);//菜单项放到菜单里
menu-&setPosition(Vec2::ZERO);
this-&addChild(menu, 1);
//添加背景音乐
if(SetScene::isMusicPlay)
SimpleAudioEngine::getInstance()-&playBackgroundMusic("WelcomeBackground.mp3", true);
auto pParticle = ParticleSystemQuad::create("res/fire.plist");
pParticle-&setPosition(Vec2(Screen_Width / 2, 0));
this-&addChild(pParticle);
void WelcomeScene::onStartItemCallback(Ref * pSender)
auto pDirector = Director::getInstance();
auto scene = GameScene::createScene();
TransitionPageTurn * ptrans = TransitionPageTurn::create(1.0f, scene, true);//设置切换场景的方式,书本 P25
pDirector-&replaceScene(ptrans); //切换场景
//SimpleAudioEngine::getInstance()-&stopBackgroundMusic();
SimpleAudioEngine::getInstance()-&playEffect("res/WelcomeToGame.wav");//默认为不重复播放
void WelcomeScene::onSetItemCallback(Ref * pSender)
auto pDirector = Director::getInstance();
auto scene =SetScene::createScene();
TransitionPageTurn * ptrans = TransitionPageTurn::create(1.0f, scene, true);//设置切换场景的方式,书本 P25
pDirector-&replaceScene(ptrans); //切换场景
void WelcomeScene::onExitItemCallback(Ref * pSender)
Director::getInstance()-&end();
复制粘贴都很多啊~~自己慢慢研究把,图片声音资源似乎不能上传啊,需要的留言把
游戏界面:
一个&em&消除类&/em&的&em&游戏&/em&,当点击图形中方框的任意一个颜色方块时,只要这个方块的上下左右有和此方块相同颜色的方框,消除的方框分别向下方和左方靠拢。可设置方块的大小和...
没有更多推荐了,

我要回帖

更多关于 天天爱消除pk模式在哪 的文章

 

随机推荐