转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。
资源为网上寻找的,仅研究学习用,若是侵犯版权请通知本人整改。

上一篇: 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》-边缘检测 地图滚动的更多相关文章

  1. ios – 如何在没有抗锯齿的情况下缩放SKSpirteNode

    我正在尝试扩展一个SKSpriteNode对象,没有平滑/反锯齿.有没有一个财产我需要设置这样做?

  2. Swift - Swift数组迭代

    依据不同情形,swift提供很多种方式对数组进行迭代比如有如下数组:1.通过变量递增的for循环2.使用Range操作符3.使用enumerate进行枚举

  3. swift – 如何将对象多次追加到数组中

    我想将所有对象追加到一行中.我有一些像这样的对象:英雄对象是这样的:我想把它们放到这个数组中:varheroes=[Hero]()但我看到追加只能每次放一个物体.如何在单行中追加多个对象,如下所示:任何帮助将不胜感激,谢谢.如果要附加多个对象,可以将它们自己包装到数组中并使用appendContentsOf.

  4. Android集成高德地图详细介绍

    大家好,本篇文章主要讲的是Android集成高德地图详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

  5. 微信小程序地图标记多个位置的方法详解

    地图是我们平时经常用到的组件,而且地图是显示在最高层的原生组件,下面这篇文章主要给大家介绍了关于微信小程序地图标记多个位置的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

  6. 详解angular中使用echarts地图

    这篇文章主要为大家介绍了angular中使用echarts地图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  7. python数字图像处理之边缘轮廓检测

    这篇文章主要介绍了python数字图像处理之边缘轮廓检测示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  8. Vue echarts 实现离线中国地图的示例代码(细化到省份)

    这篇文章主要介绍了Vue echarts 实现离线中国地图,细化到省份,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. vue使用echarts实现地图的方法详解

    这篇文章主要为大家详细介绍了vue使用echarts实现地图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  10. 如何利用Echarts根据经纬度给地图画点画线

    最近工作中遇到了一个需求,需要利用echarts在地图上面标记点位,所下面这篇文章主要给大家介绍了关于如何利用Echarts根据经纬度给地图画点画线的相关资料,需要的朋友可以参考下

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部