游戏开发引擎—cocos2d-x地图随精灵无限滚动与边缘检测--之游戏开发《赵云要格斗》(3)

上传人:mg****85 文档编号:34142815 上传时间:2018-02-21 格式:DOC 页数:8 大小:61KB
返回 下载 相关 举报
游戏开发引擎—cocos2d-x地图随精灵无限滚动与边缘检测--之游戏开发《赵云要格斗》(3)_第1页
第1页 / 共8页
游戏开发引擎—cocos2d-x地图随精灵无限滚动与边缘检测--之游戏开发《赵云要格斗》(3)_第2页
第2页 / 共8页
游戏开发引擎—cocos2d-x地图随精灵无限滚动与边缘检测--之游戏开发《赵云要格斗》(3)_第3页
第3页 / 共8页
游戏开发引擎—cocos2d-x地图随精灵无限滚动与边缘检测--之游戏开发《赵云要格斗》(3)_第4页
第4页 / 共8页
游戏开发引擎—cocos2d-x地图随精灵无限滚动与边缘检测--之游戏开发《赵云要格斗》(3)_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《游戏开发引擎—cocos2d-x地图随精灵无限滚动与边缘检测--之游戏开发《赵云要格斗》(3)》由会员分享,可在线阅读,更多相关《游戏开发引擎—cocos2d-x地图随精灵无限滚动与边缘检测--之游戏开发《赵云要格斗》(3)(8页珍藏版)》请在金锄头文库上搜索。

1、游戏开发引擎Cocos2d-x 地图随精灵无限滚动与边缘检测-之游戏开发赵云要格斗 (3)本文检索关键词:游戏引擎,游戏开发引擎,cocos 引擎 html5 游戏开发本本章在前文 Cocos2d-x 自定义按钮类控制精灵攻击的基础上,实现了精灵向右运动到地图中间时,地图能跟着移动,但此时精灵是原地不动只是播放跑动画。并且,当地图移动到边缘时,地图不在移动,但此时精灵能移动同时播放跑动画。网上看了些别人写的地图,很多都是通过两张地图交替显示来实现,这里我就想通过一个地图来实现,英雄移动到地图的最左边或最右边时,地图不能移动,但是英雄还是能移动。这样比较符合我们玩游戏时的情形。Cocos2d-x

2、 版本:2.2.5工程环境:windows7+VS2010下面是要滚动的地图,只有一张,但是很长。先看看效果一、在英雄类中增加判断英雄是否运动到了窗口的中间位置函数在上一篇的英雄类中再增加一个函数:12/判断英雄是否运动到了窗口的中间位置,visibleSize 为当前窗口的大小 bool JudgePositona(CCSize visibleSize); 345678910然后这是它的实现:bool Hero:JudgePositona (CCSize visibleSize) if(this-getPositionX()!=visibleSize.width/2)/精灵到达左边 retu

3、rn false; else return true;/到达中间位置 二、自定义地图类这里为了后头地图能再实现其它功能,我自己又设计了一个地图类,它能根据英雄的运动还判断是否要移动地图。其实这里的地图就是一个 CCSprite ,然后把它加到当前类中,这个类是从CCNODE 中派生的。然后根据当前英雄的位置来判断自己是否在进行移动,在MoveMap(CCNode *hero,CCSize visibleSize)这个函数中,其实实现得很简单。传入当前英雄和当前窗口的大小,然后就是一些判断了。直接看代码 Map.h:12345678910111213141#ifndef _MAP_H_ #def

4、ine _MAP_H_ #include cocos2d.h USING_NS_CC; class Map:public CCNode public: Map(); Map(); /初始化地图,window_sizeo 为控制台大小 void InitMap(const char *map_name,const CCSize &window_size); /根据精灵的位置移动地图,visibleSize 为当前窗口的大小 void MoveMap(CCNode *hero,CCSize visibleSize); /判断地图是否到达边缘 bool JudgeMap(CCNode *hero,C

5、CSize visibleSize); /virtual void update(float delta); CREATE_FUNC(Map); private: 51617181920212223CCSprite *m_map;/地图精灵 ; #endif / _MAP_H_然后这是它的实现 Map.cpp:12345678910111213141516#include Map.h Map:Map():m_map(NULL) Map:Map() void Map:InitMap(const char *map_name,const CCSize &window_size) this-m_ma

6、p=CCSprite:create(map_name); m_map-setAnchorPoint(ccp(0,0);/设置锚点 this-setAnchorPoint(ccp(0,0);/设置锚点 this-addChild(m_map); void Map:MoveMap(CCNode *hero,CCSize visibleSize)/ if(hero-getPositionX()=visibleSize.width/2)/精灵运动到中间,地图才移动 if(this-getPositionX()!=-(m_map-getContentSize().width-17181920212223

7、242526272829303132visibleSize.width)/防止地图左边运动后超出边缘 this-setPosition(this-getPositionX()-1,this-getPositionY(); bool Map:JudgeMap(CCNode *hero,CCSize visibleSize) if(this-getPositionX()!=-(m_map-getContentSize().width-visibleSize.width)/防止地图左边运动后超出边缘 return false; else /地图已经移动到达边缘 return true; 三、根据英雄

8、精灵和窗口的大小来移动地图或移动精灵上面自定义的地图类要怎么用呢?在 HelloWorldScene.h 中添加头文件1#include Map.h同时定义一个成员变量12private: Map* mymap;/地图这时就可以直接用了。在 init()函数中, 原本我是用:(在第一篇-虚拟摇杆的开头那里有写)1234/修改背景图片 CCSprite* pSprite = CCSprite:create(background_1.jpg); pSprite-setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2

9、+ origin.y); this-addChild(pSprite, 0);/这里的 0 表示放在最底层把上面的去掉,改成:1234/更改为自己定义的地图 mymap=Map:create(); mymap-InitMap(12.png,visibleSize); this-addChild(mymap,0);然后再改 HelloWorldScene.cpp 中的 updata()事件:1234567891011121314151void HelloWorld:update(float delta) CCSize visibleSize1 = CCDirector:sharedDirecto

10、r()-getVisibleSize(); /判断是否按下摇杆及其类型 switch(rocker-rocketDirection) case 1: /hero-SetAnimation(attack1_animation.plist,attack1_animation.png,attack_,6,rocker-rocketRun); hero-SetAnimation(run_animation.plist,run_animation.png,run_,8,rocker-rocketRun);/run_为 run_animation.png 集合图片中每张图片的公共名称部分 if(hero-

11、getPositionX()JudgePositona(visibleSize1)|mymap-JudgeMap(hero,visibleSize1)/精灵没到达窗口中间位置或者地图已经移动到边缘了,精灵才可以移动,否则只播放动画 hero-setPosition(ccp(hero-61718192021222324252627282930313233343536373getPosition().x+1,hero-getPosition().y); /向右走 /下面是移动地图 mymap-MoveMap(hero,visibleSize1); break; case 2: hero-SetAn

12、imation(run_animation.plist,run_animation.png,run_,8,rocker-rocketRun);/run_为 run_animation.png 集合图片中每张图片的公共名称部分 hero-setPosition(ccp(hero-getPosition().x, hero-getPosition().y+1); /向上走 break; case 3: hero-SetAnimation(run_animation.plist,run_animation.png,run_,8,rocker-rocketRun);/run_为 run_animati

13、on.png 集合图片中每张图片的公共名称部分 if(hero-getPositionX()=8)/不让精灵超出左边,8 可以改成你喜欢的 hero-setPosition(ccp(hero-getPosition().x-1,hero-getPosition().y); /向左走 break; case 4: hero-SetAnimation(run_animation.plist,run_animation.png,run_,8,rocker-rocketRun);/run_为 run_animation.png 集合图片中每张图片的公共名称部分 hero-setPosition(ccp

14、(hero-getPosition().x,hero-getPosition().y-1); /向下走 break; case 0: hero-StopAnimation();/停止所有动画和运动 break; if(btn-isTouch) hero-AttackAnimation(attack1_animation.plist,attack1_animation.png,attack_,6,rocker-rocketRun); 8这样就大功告成了,我们来看看效果:1. 首先,精灵向左运动的边缘时,不能再移动过去。2. 接下来,英雄向右移动到中间时(地图还没到最右边),地图移动,精灵只播放动

15、画但不改变它的位置(相当于英雄一直在中间,但是地图移动了,造成英雄移动的错觉)3. 当地图移动到最右边时。地图不动了,英雄可以移动超过中间的位置效果就是这样了,原本是想弄成地图可以跟着精灵左右移动的,但是这个有点儿麻烦,还得判断左右,就偷了下懒,这里地图移动过去了就不能再移动回来了。想移动回来是有思路,但是写比来比较费事,后头有时间再来把这好好改下吧。四、思路总结其实简单说:1.精灵向右还没运动到窗口中间精灵播放跑动画同时移动位置,但此时地图位置不改变。2.精灵向右运动到窗口中间且地图还没有移动到最右边精灵只播放跑的动画,但是不改变它的位置。但地图要向左移动,造成精灵在移动的错觉。3.地图移动到最右边了此时地图不要改变位置了,精灵播放跑动画同时要移动。源码下载: Cocos2d-x 地图随精灵无限滚动与边缘检测

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号