//移动方向枚举类
var MoveDirection = cc.Enum({
NONE: 0,
UP: 1,
DOWN: 2,
LEFT: 3,
RIGHT: 4
}); var minTilesCount = 2;
var mapMoveStep = 1;
var minMoveValue = 50; cc.Class({
extends: cc.Component,
editor: {
requireComponent: cc.TiledMap
}, properties: {
_touchStartPos: {
default: null,
serializable: false,
},
_touching: {
default: false,
serializable: false,
}, _isMapLoaded : {
default: false,
serializable: false,
}, floorLayerName: {
default: 'floor'
}, barrierLayerName: {
default: 'barrier'
}, objectGroupName: {
default: 'players'
}, startObjectName: {
default:'SpawnPoint'
}, successObjectName: {
default:'SuccessPoint'
}
}, onLoad: function () {
console.log(" init") //获取英雄
this._player = this.node.getChildByName('player');
if (! this._isMapLoaded) {
this._player.active = false;
} //注册按键点击
var self = this;
cc.eventManager.addListener({
event: cc.EventListener.KEYBOARD,
onKeyPressed: function(keyCode, event) {
self._onKeyPressed(keyCode, event);
}
}, self); //注册触摸事件
this.node.on(cc.Node.EventType.TOUCH_START, function (event) {
self._touching = true;
self._touchStartPos = event.touch.getLocation(); //this._onTouchStart()
}, self); this.node.on(cc.Node.EventType.TOUCH_END, function (event) {
if (!self._touching) return; self._touching = false;
var touchPos = event.touch.getLocation();
var movedX = touchPos.x - self._touchStartPos.x;
var movedY = touchPos.y - self._touchStartPos.y;
var movedXValue = Math.abs(movedX);
var movedYValue = Math.abs(movedY); //过小
if (movedXValue < minMoveValue && movedYValue < minMoveValue) {
// touch moved not enough
return;
} //新建一个点
var newTile = cc.p(this._curTile.x, this._curTile.y);
var mapMoveDir = MoveDirection.NONE;
//x方向移动
if (movedXValue >= movedYValue)
{
// move to right or left
if (movedX > 0) {
newTile.x += 1;
mapMoveDir = MoveDirection.LEFT;
} else {
newTile.x -= 1;
mapMoveDir = MoveDirection.RIGHT;
}
}
//y方向移动
else
{
// move to up or down
if (movedY > 0) {
newTile.y -= 1;
mapMoveDir = MoveDirection.UP;
}
else
{
newTile.y += 1;
mapMoveDir = MoveDirection.DOWN;
}
}
this._tryMoveToNewTile(newTile, mapMoveDir);
}, self);
}, //我推测这个是回调函数
theMapLoaded: function(err) {
//有错误退出
if (err) return; console.log("map init") //初始化地图位置
this._initMapPos(); // 获取成功层
this._succeedLayer = this.node.getParent().getChildByName('succeedLayer');
this._succeedLayer.active = false; //初始化英雄 位置
this._tiledMap = this.node.getComponent('cc.TiledMap');
var objectGroup = this._tiledMap.getObjectGroup(this.objectGroupName);
if (!objectGroup) return; var startObj = objectGroup.getObject(this.startObjectName);
var endObj = objectGroup.getObject(this.successObjectName);
if (!startObj || !endObj) return; var startPos = cc.p(startObj.x, startObj.y);
var endPos = cc.p(endObj.x, endObj.y); this._layerFloor = this._tiledMap.getLayer(this.floorLayerName);
this._layerBarrier = this._tiledMap.getLayer(this.barrierLayerName);
if (!this._layerFloor || !this._layerBarrier) return; this._curTile = this._startTile = this._getTilePos(startPos);
this._endTile = this._getTilePos(endPos); if (this._player) {
this._updatePlayerPos();
this._player.active = true;
} this._isMapLoaded = true;
}, //讲地图设置为地步坐下端
_initMapPos: function() {
this.node.setPosition(cc.visibleRect.bottomLeft);
}, _getTilePos: function(posInPixel) {
var mapSize = this.node.getContentSize();
var tileSize = this._tiledMap.getTileSize();
var x = Math.floor(posInPixel.x / tileSize.width);
var y = Math.floor((mapSize.height - posInPixel.y) / tileSize.height); return cc.p(x, y);
}, _onKeyPressed: function(keyCode, event) {
if (!this._isMapLoaded || this._succeedLayer.active) return; var newTile = cc.p(this._curTile.x, this._curTile.y);
var mapMoveDir = MoveDirection.NONE;
switch(keyCode) {
case cc.KEY.up:
newTile.y -= 1;
mapMoveDir = MoveDirection.DOWN;
break;
case cc.KEY.down:
newTile.y += 1;
mapMoveDir = MoveDirection.UP;
break;
case cc.KEY.left:
newTile.x -= 1;
mapMoveDir = MoveDirection.RIGHT;
break;
case cc.KEY.right:
newTile.x += 1;
mapMoveDir = MoveDirection.LEFT;
break;
default:
return;
} this._tryMoveToNewTile(newTile, mapMoveDir);
}, _tryMoveToNewTile: function(newTile, mapMoveDir) {
var mapSize = this._tiledMap.getMapSize(); //超出边界
if (newTile.x < 0 || newTile.x >= mapSize.width) return;
if (newTile.y < 0 || newTile.y >= mapSize.height) return; //障碍
if (this._layerBarrier.getTileGIDAt(newTile)) {
cc.log('This way is blocked!');
return false;
} // update the player position
this._curTile = newTile;
this._updatePlayerPos(); // 必要的时候移动地图
this._tryMoveMap(mapMoveDir); // 检测是否成功
if (cc.pointEqualToPoint(this._curTile, this._endTile)) {
cc.log('succeed');
this._succeedLayer.active = true;
}
}, _updatePlayerPos: function() {
var pos = this._layerFloor.getPositionAt(this._curTile);
this._player.setPosition(pos);
}, _tryMoveMap: function(moveDir) {
// get necessary data
var mapContentSize = this.node.getContentSize();
var mapPos = this.node.getPosition();
var playerPos = this._player.getPosition();
var viewSize = cc.size(cc.visibleRect.width, cc.visibleRect.height);
var tileSize = this._tiledMap.getTileSize();
var minDisX = minTilesCount * tileSize.width;
var minDisY = minTilesCount * tileSize.height; var disX = playerPos.x + mapPos.x;
var disY = playerPos.y + mapPos.y;
var newPos;
switch (moveDir) {
case MoveDirection.UP:
if (disY < minDisY) {
newPos = cc.p(mapPos.x, mapPos.y + tileSize.height * mapMoveStep);
}
break;
case MoveDirection.DOWN:
if (viewSize.height - disY - tileSize.height < minDisY) {
newPos = cc.p(mapPos.x, mapPos.y - tileSize.height * mapMoveStep);
}
break;
case MoveDirection.LEFT:
if (viewSize.width - disX - tileSize.width < minDisX) {
newPos = cc.p(mapPos.x - tileSize.width * mapMoveStep, mapPos.y);
}
break;
case MoveDirection.RIGHT:
if (disX < minDisX) {
newPos = cc.p(mapPos.x + tileSize.width * mapMoveStep, mapPos.y);
}
break;
default:
return;
} if (newPos) {
// calculate the position range of map
var minX = viewSize.width - mapContentSize.width - cc.visibleRect.left;
var maxX = cc.visibleRect.left.x;
var minY = viewSize.height - mapContentSize.height - cc.visibleRect.bottom;
var maxY = cc.visibleRect.bottom.y; if (newPos.x < minX) newPos.x = minX;
if (newPos.x > maxX) newPos.x = maxX;
if (newPos.y < minY) newPos.y = minY;
if (newPos.y > maxY) newPos.y = maxY; if (!cc.pointEqualToPoint(newPos, mapPos)) {
cc.log('Move the map to new position: ', newPos);
this.node.setPosition(newPos);
}
}
}, restartGame: function() {
this._succeedLayer.active = false;
this._initMapPos();
this._curTile = this._startTile;
this._updatePlayerPos();
},
});

ccc tiledmap的更多相关文章

  1. ccc tiledmap 获取元素属性

    cc.Class({ extends: cc.Component, properties: { elementLable: { default: null, type : cc.Label }, ma ...

  2. C段旁注工具CCC.exe

    C段旁注工具CCC.exe可以进行C段的web站点批量查询 自动排除DNS错误的域名以及IP和当前服务器不符的域名 抓取bing上的所有URL,不光是域名信息,方便直接进入 自动生成html报告,方便 ...

  3. code vs1262 不要把球传我(组合数学) 2012年CCC加拿大高中生信息学奥赛

    1262 不要把球传我 2012年CCC加拿大高中生信息学奥赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解  查看运行结果     题目描述 De ...

  4. cocos2dx使用TiledMap创建斜45度地图场景

    做游戏,场景是一个很重要的部分,如果缺少这一步,很难做出好的游戏,对于cocos2dx来说,有很多2D的地图编辑器可以用,效果都还可以,其中Tiled是支持的比较好的,它支持Tiled编辑出来的几种模 ...

  5. [CCC 1996 01]Deficient, Perfect, and Abundant

    CCC加拿大高中生信息学奥赛 其余来源 CODEVS[3312]——CCC 1996 01 Deficient, Perfect, and Abundant ——http://codevs.cn/pr ...

  6. cocos2dx A* + tiledMap

    本文转自:http://blog.csdn.net/w18767104183/article/category/1757765 前面一章讲了cocos2dx 中使用A星算法 这章中讲 A*结合tile ...

  7. awk匹配以aaa开头,以bbb结尾的内容,同时aaa和bbb之间还包含ccc

    如果是匹配以A开头,以B结尾的内容,同时A和B之间还包含C的这种怎么做?比如 [root@localhost ~]#cat file aaa grge ddd bbb aaa gege ccc bbb ...

  8. LOJ #2802. 「CCC 2018」平衡树(整除分块 + dp)

    题面 LOJ #2802. 「CCC 2018」平衡树 题面有点难看...请认真阅读理解题意. 转化后就是,给你一个数 \(N\) ,每次选择一个 \(k \in [2, N]\) 将 \(N\) 变 ...

  9. Pentaho BI server 中 CCC table Component 的使用小技巧

    我使用的版本 Pentaho BI Server 5.3.0.0.213 CDE/CDF/CDA/CCC 15.04.16 stable   Q: 如何设置表格中各种提示文字的语言(默认为英语)? C ...

随机推荐

  1. 三、jQuery--jQuery基础--jQuery基础课程--第11章 jQuery 工具类函数

    1.获取浏览器的名称与版本信息 在jQuery中,通过$.browser对象可以获取浏览器的名称和版本信息,如$.browser.chrome为true,表示当前为Chrome浏览器,$.browse ...

  2. SAE云平台上传图片和发送邮件

    1.远程图片保存至Storage 其中public是Storage中的容器名,"目录1/目录2/"是容器下的路径 $file_content 是得到的文件数据 $s = new S ...

  3. iOS 判断第一个字符是数字还是汉字

       NSString *titleStr = @"琳小兮";  //先截取字符串,拿到第一个字符         NSString *firstStr = [titleStr s ...

  4. 昨晚把家里的ie升级到11

    其实网上有些东西是实用的,不过之前的一次锁屏唤醒机器死机我就强制关机了,昨天把大部分驱动升级.

  5. PHP 获取图像信息 getimagesize 函数

    getimagesize() 函数用于获取图像尺寸,类型等信息. imagesx() 函数用于获取图像的宽度. imagesy() 函数用于获取图像的高度. getimagesize() getima ...

  6. JAVA基础学习之final关键字、遍历集合、日期类对象的使用、Math类对象的使用、Runtime类对象的使用、时间对象Date(两个日期相减)(5)

    1.final关键字和.net中的const关键字一样,是常量的修饰符,但是final还可以修饰类.方法.写法规范:常量所有字母都大写,多个单词中间用 "_"连接. 2.遍历集合A ...

  7. Python无类再理解--metaclass,type

    上次理解过一次,时间久了,就忘了.. 再学习一次.. http://blog.jobbole.com/21351/ ======================= 但是,Python中的类还远不止如此 ...

  8. 【sicily】卡片游戏

    卡片游戏  Time Limit: 1sec    Memory Limit:32MB Description 桌上有一叠牌,从第一张牌(即位于顶面的牌)开始从上往下依次编号为1~n.当至少还剩两张牌 ...

  9. 理解JavaScript中的事件处理

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  10. elementar OS体验

    关于其说明请参考https://linuxtoy.org/archives/elementary-os-luna.html