位置: 编程技术 - 正文

Cocos2dx 疯狂跑酷(CrazyRun)游戏项目解析

编辑:rootadmin
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任 游戏下载地址: 直入正题,开始剖析涉及到的开发技术

推荐整理分享Cocos2dx 疯狂跑酷(CrazyRun)游戏项目解析,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

作为一个游戏,是由UI和场景构成;开始界面、关卡选择、提示框等等统属于UI,游戏过程中的核心游戏代码在场景中实现:

一、游戏开始界面由背景、菜单、游戏logo、动态飘动的云层、粒子、背景音乐元素构成

1、背景、logo都是Cocos2dx中的图片精灵:

相关代码:

/* 游戏标题图片 */ CCSprite* titleSprite2 = CCSprite::create("pickure/mainUI/.png"); titleSprite2->setPosition(ccp(visibleSize.width / 2, visibleSize.height /2)); this->addChild(titleSprite2, 3);

visibleSize.width / 2 是一个相对屏幕坐标。,我们也可以填写绝对坐标,比如titleSprite2->setPosition(ccp(, ));

2、菜单是用CCMenuItemImage实现,我采用单个的创作模式,因为这样使菜单的位置摆放比较灵活

相关代码:

CCMenuItemImage *tile = CCMenuItemImage::create( "pickure/mainUI/image _1.png", "pickure/mainUI/image _1.png", this, menu_selector(mainUI::enter)); CC_BREAK_IF(! tile); tile->setPosition(ccp(,)); CCMenu* ptile = CCMenu::create(tile, NULL); ptile->setPosition(CCPointZero); CC_BREAK_IF(! ptile); this->addChild(ptile, 3);

菜单和按钮有很多相&#;之处,按钮功能却又可以通过精灵动作来实现,但使用最多的还是菜单,比较方便

3、Cocos2dx在windows上有专门的粒子制作工具,C#编写,我使用的时候对其代码和界面简单的优化了一下

相关代码:

//小树叶特效 CCParticleSystem * lizi = new CCParticleSystemQuad(); //设置plist动画文件 lizi->initWithFile("treedown.plist"); //设置粒子显示位置 lizi->setPosition(ccp(,)); // 把粒子对象添加到场景中 this->addChild(lizi,);4、背景音乐这个就不用多少了,播放本地的一个音乐文件

相关代码:

/* 游戏背景音乐 */ CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("music/bgMusic.wav",-1);

当然我们也可以定义一个ID分配给它,用于控制停止播放,这种播放方式运用在音效的使用上,因为在游戏中可能有多种音效同时播放,我们或有需要停止某个正在播放的音效

5、飘动的云层,采用精灵动作和回调事件来实现,设置好目标点,执行动作回调

相关代码:

//设置精灵动作

CCMoveTo* ToRight = CCMoveTo::create(8.0f, ccp(,thing1->getPositionY())); CCSequence*s = CCSequence::create(ToRight, CCCallFuncN::create(this, callfuncN_selector(MapThings::GetRight)), NULL); thing1->runAction(s);

//回调函数

void MapThings::GetRight(CCObject* pSender){ thing1->setFlipX(true); CCMoveTo* ToLeft = CCMoveTo::create(8.0f, ccp(,thing1->getPositionY())); CCSequence*s = CCSequence::create(ToLeft, CCCallFuncN::create(this, callfuncN_selector(MapThings::GetLeft)), NULL); thing1->runAction(s);}

void MapThings::GetLeft(CCObject* pSender){ thing1->setFlipX(false); CCMoveTo* ToRight = CCMoveTo::create(8.0f, ccp(,thing1->getPositionY())); CCSequence*s = CCSequence::create(ToRight, CCCallFuncN::create(this, callfuncN_selector(MapThings::GetRight)), NULL); thing1->runAction(s);}

二、游戏关卡选择界面涉及到的相关技术与架构

组成元素:游戏得分、金币数量、关卡图标、(任务/仓库、充&#;等菜单)、动作精灵、返回菜单构成

1、金币和游戏得分采用CCLabelAtlas实现

相关代码:

CCLabelAtlas*SumscoreLabs = CCLabelAtlas::create(CCString::createWithFormat("%d", Sumscore)->getCString(), "pickure/ChoiceUI/labelatlasimg.png", , , '0'); SumscoreLabs->setAnchorPoint(ccp(0,0.5)); SumscoreLabs->setPosition(ccp(,)); SumscoreLabs->setScale(0.7f); this->addChild(SumscoreLabs,3); SumscoreLabs->setString("");

2、各个页面是如何跳转?在菜单回调函数中切换场景

相关代码:

//进入商城界面void ChoiceUI::shop(CCObject* pSender){

CCDirector::sharedDirector()->replaceScene(CCTransitionFlipAngular::create(1.0f,shop::scene()));

}

3、这里是如何记录玩家是否已经有权限进入关卡呢?这里设置顺利完成前一关,即可进入下一关

相关代码:

//给没有权限的关卡添加 锁定图标

if(Maxlock!=4) { lock4 =CCSprite::create("pickure/ChoiceUI/suo.png"); lock4->setPosition(ccp(visibleSize.width / 7&#;(visibleSize.width / 6.5&#;visibleSize.width / )*3, visibleSize.height /2)); this->addChild(lock4,3); if(Maxlock!=3) { lock3 =CCSprite::create("pickure/ChoiceUI/suo.png"); lock3->setPosition(ccp(visibleSize.width / 7&#;(visibleSize.width / 6.5&#;visibleSize.width / )*2, visibleSize.height /2)); this->addChild(lock3,3); if(Maxlock!=2) { lock2 =CCSprite::create("pickure/ChoiceUI/suo.png"); lock2->setPosition(ccp(visibleSize.width / 7&#;visibleSize.width / 6.5&#;visibleSize.width / , visibleSize.height /2)); this->addChild(lock2,3);

Cocos2dx  疯狂跑酷(CrazyRun)游戏项目解析

if(Maxlock!=1) { lock1 =CCSprite::create("pickure/ChoiceUI/suo.png"); lock1->setPosition(ccp(,)); this->addChild(lock1,1); } } }

//玩家点击关卡图标,判断是否有权限进入游戏场景

相关代码:

void ChoiceUI::Unlock2(CCObject* pSender){

CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect( "music/button.mp3"); if(golds<) { CCBlink*blink = CCBlink::create(1, 2); CCSequence*s = CCSequence::create( blink, CCCallFuncN::create(this, callfuncN_selector(ChoiceUI::yincang)), NULL); tishi2->setVisible(true); tishi2->runAction(s); return;} if(Maxlock<2){ CCRotateBy* move = CCRotateBy::create(2,); lock2->runAction(move); //showAd();}

CCScaleBy* out = CCScaleBy::create(0.5f,2); CCCallFunc* callFunc = CCCallFunc::create(this, callfunc_selector(ChoiceUI::in)); CCSequence* actions = CCSequence::create(out, callFunc, NULL); ts->runAction(actions);

if(Maxlock>1) {

locknamber=2; CCLOG("tiled x=%d", Maxlock); if(score2!=0) { SUMscore( ,,score2); Messbox (); } else { CCUserDefault::sharedUserDefault()->setIntegerForKey("golds", golds-); CCUserDefault::sharedUserDefault()->flush(); golds=CCUserDefault::sharedUserDefault()->getIntegerForKey("golds"); SumgoldLabs->setString(CCString::createWithFormat("%d", golds)->getCString());

CCDirector::sharedDirector()->replaceScene(CCTransitionPageTurn::create(1.0f,Scenea::scene(),false));

} }}

三、游戏场景中涉及到的相关技术与架构

组成元素:游戏得分计算过程、玩家角色动画的播放,运动的控制,怪物的AI,碰撞宝石的检测,游戏地图的制作与加载,道具的使用,以及对角色的影响等

地图滚动实现代码:

void Scenea::update( float delta )

{

int bgposX1 = m_bgSprite1->getPositionX(); // 背景地图1的x坐标 int bgposX2 = m_bgSprite2->getPositionX(); // 背景地图2的x坐标

int bgiSpeed = 7; // 地图滚动速度

/* 两张地图向左滚动(两张地图是相邻的,所以要一起滚动,否则会出现空隙) */ bgposX1 -= bgiSpeed; bgposX2 -= bgiSpeed;

/* 地图大小 */ CCSize mapSize = m_bgSprite1->getContentSize();

/* 当第1个地图完全离开屏幕时,让第2个地图完全出现在屏幕上,同时让第1个地图紧贴在第2个地图后面 */ if(bgposX1 < -mapSize.width / 2) { bgposX2 = mapSize.width / 2; bgposX1 = mapSize.width &#; mapSize.width / 2; } /* 同理,当第2个地图完全离开屏幕时,让第1个地图完全出现在屏幕上,同时让第2个地图紧贴在第1个地图后面 */ if(bgposX2 < -mapSize.width / 2) { bgposX1 = mapSize.width / 2; bgposX2 = mapSize.width &#; mapSize.width / 2; }

m_bgSprite1->setPositionX(bgposX1); m_bgSprite2->setPositionX(bgposX2);

}

与宝石碰撞检测涉及到的技术

相关代码:

void Scenea::Monstersnock(){for (int i = 0; i < m_monsterArr->count(); i&#;&#;){ CCSprite *target = (CCSprite *)m_monsterArr->objectAtIndex(i); CCRect playerRect = CCRectMake( player->getPosition().x - ( player->getContentSize().width/2),

player->getPosition().y - ( player->getContentSize().height/2),

player->getContentSize().width,

player->getContentSize().height); CCRect gunchildRect = CCRectMake( gunchild->getPosition().x - ( gunchild->getContentSize().width/2),

gunchild->getPosition().y - ( gunchild->getContentSize().height/2),

gunchild->getContentSize().width,

gunchild->getContentSize().height); CCRect coard1Rect = CCRectMake(

target->getPosition().x - ( target->getContentSize().width/2),

target->getPosition().y - (target->getContentSize().height/2),

target->getContentSize().width,

target->getContentSize().height); //子弹击中宝石 if (gunchildRect.intersectsRect(coard1Rect)) { CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect( "music/eat.mp3"); CCMoveTo* robot1moveToright = CCMoveTo::create(2.0f, ccp(,)); target->runAction(robot1moveToright); }

//主角碰撞宝石 if (playerRect.intersectsRect(coard1Rect)) { CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect( "music/eat.mp3"); m_monsterArr->removeObject(target); map->removeChild(target);

}}

其他。。。后续更新。。。

解决cocos项目未能将插入的代码块写入pdb的问题 今天运行程序发现了这个问题,我的解决方案是:点击项目,右键属性,选择配置属性下的c/c,选择常规,把调试信息式里的程序数据库(/ZI)替换为C7兼容(/

quick-lua touch 触摸事件 直接上代码Node:setTouchEnabled(true)Node:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event)print(event.name)ifevent.name==beganthenprint(touchbegan!)returntrue---------这里要返回true

xcode中导入cocos2d_libs到自己项目中 xcode中在自己项目中引入cocos2dx,需要导入cocos2d_libs静态库。以cocos2dx3.3为例1.cocosnew-lcppDemo创建出一个叫Demo的新项目,然后把该项目中cocos文件夹拷贝到

标签: Cocos2dx 疯狂跑酷(CrazyRun)游戏项目解析

本文链接地址:https://www.jiuchutong.com/biancheng/372714.html 转载请保留说明!

上一篇:使用AndroidStudio部署Cocos2dx-Lua项目的处理方法(使用androidx 找不到v7)

下一篇:解决cocos项目未能将插入的代码块写入pdb的问题(cocos onload)

  • 小规模纳税人单张发票最大金额
  • 基本户的利息和本金比例
  • 长期待摊装修费会计分录
  • 财务如何审核合同支付条款风险
  • 收到赠品入库需要用什么记录
  • 小规模纳税人销售收入会计分录
  • 累计所得税前净现金流量计算公式为
  • 环保专项资金可以转让吗
  • 以前漏记的成本怎么处理
  • 企业用于存货的支出
  • 造价服务费收费标准计算器
  • 给分公司开发票由总公司付款怎么办?
  • 企业年金税前扣除标准表
  • 预缴税款后怎么开票
  • 个人所得税生产经营所得税率表2023
  • 房地产开发企业应交税费科目
  • 展厅门口如何布置图片
  • 帮你用好小微企业所得税优惠的7个案例
  • 2021年个体工商户的税率是多少
  • 纳税申报需要去税务局吗
  • 电话费发票个人抬头可以税前扣除
  • 小规模印花税怎么报
  • 火车票飞机票进项税额怎么抵扣
  • 小企业财务入账的办公用品有什么?
  • 无法偿还的应付款项予以转账
  • 2023年王者荣耀世界杯
  • 如何下载网页?
  • win11如何多窗口
  • 事业单位会计凭证收入怎么记账
  • 浏览器播放视频加速怎么设置
  • 上个月做的无票收入,这个月开票怎样做分录
  • media是什么文件
  • 应收账款 预收账款合并
  • 应缴纳增值税计什么科目
  • 计提企业所得税会计分录怎么做
  • 奇托尔加赫城堡
  • php递归实现1到100的和
  • 冲减应收账款的分录
  • html的网址
  • 固定资产和无形资产计提折旧时间
  • echarts中国地图代码
  • 计算机专业的毕业设计作品新颖
  • 代收代付业务需要开发票吗
  • 增值税在纳税申报表中怎么得出
  • 党费返还怎么记账
  • 财政拨款结余的明细科目有哪些
  • php如何判断是移动还是pc
  • 什么企业进项多
  • 对公户取备用金给员工
  • spark sql add jar
  • SQLServer2005与SQLServer2008数据库同步图文教程
  • mysql创建数据库的操作步骤
  • 个人独资企业一般纳税人享受六税两费
  • 水费差额缴税如何计算
  • 春节重要通知发放工资
  • 原始凭证按什么分
  • 普通发票怎么开?
  • 日记账公式怎么设置
  • php的每条语句以什么结尾
  • WINDOWS操作系统内置的GUEST
  • centos如何删除用户组里面的用户
  • 三星笔记是干什么用的
  • win10任务栏恢复原样
  • sqlmangr.exe - sqlmangr是什么进程 有什么用
  • 在linux中安装软件
  • win10系统电脑无限重启
  • 基于centos6安装kvm服务
  • Win7怎么开启存储感知
  • win8出现问题需要重启
  • windows执行bat命令
  • 列举linux常用的几个命令
  • css优化提高性能的方法有哪些
  • 百度地图给map添加
  • javascript中的类型转换
  • 小米手机图库图标
  • 安卓竖屏改横屏
  • 备忘录全部笔记
  • android布局文件详解
  • jquery获取浏览器宽度
  • 江西省税务总局官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设