Cocos3.4 横版游戏制作-《KillBear》-边缘检测 地图滚动
转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。 上一篇: Cocos3.4 横版游戏制作-《KillBear》-添加摇杆并控制Hero 开发环境
代码构建A角色RoleHero为什么我会在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());
}
}
之后还要注册Global的tileMap,不然Hero::updateSelf()调用都是NULL从而报错 GameMapLayer
在initMapWithFile最后插入 global->tileMap=TileMap;
结果我们的Hero没办法跑出地图了! 代码构建B开始之前我不得不强调和感叹下文件结构的重要性. 受到攻击时候是不能移动的–>Hero受到攻击–>摇杆还是在传递Hero速度–>地图滚没了 这次调整了文件结构,所有关于地图的变化全部放在MapLayer中进行.并且使用了一个泛用性很高的2D横版移动算法.可以同时跟踪X轴和Y轴. GameMapLayer
添加用于更新地图的定时器代码啊 void update(float dt);
void setViewpointCenter(Point pos);
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带你走进游戏开发的世界之主角的移动与地图的平滑滚动 结果结语本篇实现了边缘检测+地图滚动
所以就不实现卡马克卷轴算法 下一篇,通过添加一个攻击按钮实现Hero攻击,并在左上角显示一个血条 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |