Cocos2d-x游戏实例-《跑跑跑》制作教程(第四篇)——地图卷动

简介:

上一篇我们已经把我们跑的主题体现出来了,但是,主角跑没多久就离开地图了,也离开屏幕了,这不靠谱啊喂,我们得让地图也动起来(难道我做这么长的地图是摆设么~)。

 

1. 地图卷动规则

首先要定一个规则,地图怎么卷动?我们定义为这样,地图只会横向往左卷动,当主角超过屏幕中点的时候地图就开始卷动。最终的效果应该是这样的:

留意最左边,地图最左边已经有部分没有显示出来了,证明地图已经往左移动了一小段距离。

 

2. 触发卷动

我们在主角坐标改变的时候就判断是否需要移动地图,来,我们给Player类增加一个函数:

01 voidPlayer::setViewPointByPlayer()
02 {
03     if(mSprite == NULL) {
04         return;
05     }
06     CCLayer* parent = (CCLayer* )mSprite->getParent();
07  
08 /* 地图方块数量 */
09 CCSize mapTiledNum = map->getMapSize();
10  
11     /* 地图单个格子大小 */
12     CCSize tiledSize = map->getTileSize();
13  
14 /* 地图大小 */
15     CCSize mapSize = CCSize::CCSize(
16         mapTiledNum.width * tiledSize.width,
17         mapTiledNum.height * tiledSize.height);
18  
19     /* 屏幕大小 */
20     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
21  
22     /* 精灵的坐标 */
23     CCPoint spritePos = mSprite->getPosition();
24  
25     /* 如果精灵坐标小于屏幕的一半,则取屏幕中点坐标,否则取精灵的坐标 */
26     floatx = max(spritePos.x, visibleSize.width / 2);
27     floaty = max(spritePos.y, visibleSize.height / 2);
28  
29     /* 如果x、y的坐标大于右上角的极限值,则取极限值的坐标(极限值是指不让地图超出屏幕造成出现黑边的极限坐标) */
30     x = min(x, mapSize.width - visibleSize.width / 2);
31     y = min(y, mapSize.height - visibleSize.height / 2);
32  
33     CCPoint destPos = CCPoint::CCPoint(x, y);
34     CCPoint centerPos = CCPoint::CCPoint(visibleSize.width / 2, visibleSize.height / 2);
35  
36     /* 计算屏幕中点和所要移动的目的点之间的距离 */
37     CCPoint viewPos = ccpSub(centerPos, destPos);
38  
39     parent->setPosition(viewPos);
40 }

这个函数的功能是,让地图所在图层以主角为中心进行移动,也就是,让世界的焦点停留在主角身上,屏幕随着主角移动,这样说比较清晰。

这个函数的算法解释起来可能有点繁琐,总之就是为了让地图跟随主角移动,并且要判断边界值,不能让地图超出屏幕从而导致有黑边出现。大家可以根据这个思路自己写一个算法,也许比我的更好~

然后,我们的Player要重写父类的setSimplePosition函数:

1 voidPlayer::setSimplePosition(intx,inty )
2 {
3     Entity::setSimplePosition(x, y);
4  
5     /* 以主角为中心移动地图 */
6     setViewPointByPlayer();
7 }

记得在头文件里加上这句:

1 /* 重写父类的函数 */
2 virtualvoidsetSimplePosition(intx,inty);

于是,编译运行,就能看到主角在跑,地图也随之移动!

呼呼,终于有点意思了~

 

下一篇我们将给主角添加一个新的很帅的功能——上下移动。

来自未来的PS(2013.01.14):

多位朋友问过我为什么map变量未声明,可能是我忘记说了,map变量在Entity.h文件里声明的:

01 classEntity : publicCCNode,publicControllerListener {
02 public:
03     voidsetSprite(CCSprite* mSprite);
04     voidsetController(Controller* controller);
05  
06     /* 实现SimpleMoveListener接口的方法 */
07     virtualvoidsetSimplePosition(intx,inty);
08     virtualCCPoint getCurPosition();
09 protected:
10     CCSprite* mSprite;
11     Controller* mController;
12     CCTMXTiledMap* map;  /* ------------------------ Hi,我在这里~~!!! --------------------------- */
13  
14     CCTMXLayer* meta;   /* 检测碰撞的地图层 */
15     CCTMXLayer* barrier;/* 障碍物层 */
16  
17     /* 将像素坐标转换为地图格子坐标*/
18     CCPoint tileCoordForPosition(CCPoint pos);
19 };

















本文转蓬莱仙羽51CTO博客,原文链接: http://blog.51cto.com/dingxiaowei/1366382 ,如需转载请自行联系原作者
相关文章
|
6天前
|
云安全 人工智能 自然语言处理
|
10天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
880 30
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
491 4
|
6天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
411 19
|
13天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
830 59
Meta SAM3开源:让图像分割,听懂你的话
|
3天前
|
弹性计算 网络协议 Linux
阿里云ECS云服务器详细新手购买流程步骤(图文详解)
新手怎么购买阿里云服务器ECS?今天出一期阿里云服务器ECS自定义购买流程:图文全解析,阿里云服务器ECS购买流程图解,自定义购买ECS的设置选项是最复杂的,以自定义购买云服务器ECS为例,包括付费类型、地域、网络及可用区、实例、镜像、系统盘、数据盘、公网IP、安全组及登录凭证详细设置教程:
182 114
|
10天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
476 42
大厂CIO独家分享:AI如何重塑开发者未来十年