Cocos3.4 横版游戏制作-《KillBear》-边缘检测 地图滚动
来源:互联网 发布:如何建立二维码数据库 编辑:程序博客网 时间:2024/06/06 04:33
转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。
上一篇: Cocos3.4 横版游戏制作-《KillBear》-添加摇杆并控制Hero
上一篇中,我们实现了通过不同层的Joystick控制Hero移动,但是Hero到处跑,还是不能实现我们的效果.
此篇上半部分,限定Hero的移动范围是他不要跑出地图或者是墙上(墙的范围参考第一篇)
下半部分,通过更新MapLayer实现地图滚动效果.
开发环境
- win64 : vs2010
- Cocos2d-x v3.4Final
- TexturePackerGUI
- MapEdit
代码构建A
角色Role
Hero
为什么我会在updateSelf中重复写了好几个坐标但是就用到一次?
在这里更新一下updateSelf
void Hero::updateSelf()//刷新自己{ if(this->getCurrActionState() == ACTION_STATE_WALK) { Vec2 currentP= this->getPosition(); //当前坐标 Vec2 expectP = currentP + this->getVelocity(); //期望坐标 Vec2 actualP = expectP; //实际坐标 float mapWidth = global->tileMap->getContentSize().width; //整张地图宽度 float herofat = this->getBodyBox().actual.size.width/2; //角色横向宽度,以受攻击的bodybox为准 ////不能跑到墙上去 //if(expectP.y<0 || !global->tileAllowMove(expectP)) float maptileHeight = global->tileMap->getTileSize().height; if(expectP.y < 0 || expectP.y > maptileHeight * 3 ) { actualP.y =currentP.y; } //不能跑出地图外面 if(expectP.x < herofat || expectP.x >= mapWidth - herofat) { //if(!global->tileAllowMove(expectP)) actualP.x = currentP.x; } this->setPosition(actualP); this->setLocalZOrder( Director::getInstance()->getVisibleSize().height - this->getPositionY()); }}
这是Hero的BodyBox(蓝色)和HitBox(红色),当我们移动时以蓝色框宽度一半作为判断条件,免得Hero跑出边缘
之后还要注册Global的tileMap,不然Hero::updateSelf()调用都是NULL从而报错
Game
MapLayer
- .cpp
在initMapWithFile最后插入
global->tileMap=TileMap;
结果
我们的Hero没办法跑出地图了!
接下来实现,当Hero跑到新地点时,地图能够同步移动过去
代码构建B
开始之前我不得不强调和感叹下文件结构的重要性.
之前参考别人的代码写的地图滚动,使用了Hero的速度作为参数,到后期出现奇葩的BUG:
受到攻击时候是不能移动的–>Hero受到攻击–>摇杆还是在传递Hero速度–>地图滚没了
这次调整了文件结构,所有关于地图的变化全部放在MapLayer中进行.并且使用了一个泛用性很高的2D横版移动算法.可以同时跟踪X轴和Y轴.
Game
MapLayer
- .h
添加用于更新地图的定时器代码啊
void update(float dt); void setViewpointCenter(Point pos);
- .cpp
init的注释或者是加新的
this->scheduleUpdate();
实现方法是:
void MapLayer::update(float dt){ this->setViewpointCenter(global->hero->getPosition());}void MapLayer::setViewpointCenter(Point pos) //这个是移动地图,同时跟踪X,Y轴标准算法{ Size winSize = Director::getInstance()->getWinSize(); auto _map = global->tileMap; //如果主角坐标小于屏幕的一半,则取屏幕中点坐标,否则取对象的坐标 int x = MAX(pos.x, winSize.width/2); int y = MAX(pos.y, winSize.height/2); //如果X、Y的坐标大于右上角的极限值,则取极限值的坐标(极限值是指不让地图超出屏幕造成出现黑边的极限坐标 ) x = MIN(x, (_map->getMapSize().width * _map->getTileSize().width) - winSize.width/2); y = MIN(y, (_map->getMapSize().height * _map->getTileSize().height) - winSize.height/2); //对象当前所在坐标 Point actualPosition = Vec2(x, y); //计算屏幕中点和所要移动的目的点之间的距离 Point centerOfView = Vec2(winSize.width/2, winSize.height/2); Point viewPoint = centerOfView - actualPosition; //设定一下地图的位置 ,这里一定要注意,单纯移动自己或者是_MAP移动都是无效的,在这里足足卡了好长时间 //_map->setPosition(viewPoint); //this->setPosition(viewPoint); //global->gameLayer->setPosition(viewPoint); this->getParent()->setPosition(viewPoint);}
虽然算法不是从这个地方找到的,但是这位解释这个算法的原理很好:
来源地址:
雨松MOMO带你走进游戏开发的世界之主角的移动与地图的平滑滚动
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任
结果
结语
本篇实现了边缘检测+地图滚动
即是要求人物在移动的时候,保持地图滚动,因为地图足够长的时候,不能让人物一出场就跑出屏幕的范围,而要使其在屏幕上跑完整个地图。
由于
- 本Demo全部资源很少
- 目前手机基是功能过剩
所以就不实现卡马克卷轴算法
下一篇,通过添加一个攻击按钮实现Hero攻击,并在左上角显示一个血条
- Cocos3.4 横版游戏制作-《KillBear》-边缘检测 地图滚动
- Cocos3.4 横版游戏制作-《KillBear》-添加地图
- Cocos3.4 横版游戏制作-《KillBear》-加入Hero
- Cocos3.4 横版游戏制作-《KillBear》-前言
- Cocos3.4 横版游戏制作-《KillBear》- 开始界面
- Cocos3.4 横版游戏制作-《KillBear》-添加摇杆并控制Hero
- Cocos3.4 横版游戏制作-《KillBear》-添加血条 攻击按键
- Cocos3.4 横版游戏制作-《KillBear》-添加敌人+简单AI实现
- Cocos3.4 横版游戏制作-《KillBear》-攻击判定+伤害飘血
- Cocos3.4 横版游戏制作-《KillBear》-技能及CD实现
- Cocos3.4 横版游戏制作-《KillBear》-暂停层+屏蔽下层监听
- Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3) cocos2dx 3.3移植版
- Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3)
- 【cocos3.x+box2d+tileMap】制作马里奥游戏(二) 制作地图
- Cocos2d-X 3.4版-地图无限滚动与边缘检测《赵云要格斗》
- Cocos3.3横版游戏-前言
- Cocos3.3横版游戏-Part1
- 【cocos3.x+box2d+tileMap】制作马里奥游戏(四)碰撞检测
- 使用Raphael绘制流程图,自绘动态箭头,可拖动,有双击事件,纯前端,兼容各种浏览器
- 支付宝快捷支付
- 杭电2031 进制转换
- Download interrupted: URL not found.
- Unable to get the focused window from device
- Cocos3.4 横版游戏制作-《KillBear》-边缘检测 地图滚动
- 使用jsPlumb制作流程图设计器
- 杂谈---NO.1
- 利用Nginx做反向代理的负载均衡配置
- [LeetCode] Evaluate Reverse Polish Notation
- openssl 调用实例
- quartz定时器导致内存溢出
- Super Parsing——基于Super Pixel 的非参数图像理解
- appcompat_v7文件无法自动创建出来