//移动方向枚举类
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. hdu1071(抛物线弓形面积阿基米德算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1071 题意:给出抛物线的顶点和它与一直线的两交点,求他们围成的面积: 思路: 可以直接求出他们的方程式 ...

  2. 浅析 - Storyboard / Xib

    大家都知道纯代码写应用的成本是很高的,特别是涉及到UI界面的实现,相当耗费时间.之前自己写应用时有了解过Storyboard,也简单使用过,但随着最近深入了解它之后,发现自己低估了它的作用和影响力,因 ...

  3. C++ STL string

    要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 ...

  4. NYOJ题目198数数

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAAK1CAIAAABEvL+NAAAgAElEQVR4nO3drXLkurvv8X0T4bmQYF

  5. codevs 1488GangGang的烦恼

    题目链接:http://codevs.cn/problem/1488/ 写个高精度大数运算就行 #include<cstdio> #include<iostream> #inc ...

  6. MyBatis魔法堂:即学即用篇

    一.前言                   本篇内容以理解MyBatis的基本用法和快速在项目中实践为目的,遵循Make it work,better and excellent原则. 技术栈为My ...

  7. android 5.1 WIFI图标上的感叹号及其解决办法

    转自:http://blog.csdn.net/w6980112/article/details/45843129 第一次调试android5.1的 WIFI更改小功能 Wifi 源码的相关路径目录  ...

  8. .net学习之泛型、程序集和反射

    一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> ...

  9. POJ3691 DNA repair(AC自动机 DP)

    给定N个长度不超过20的模式串,再给定一个长度为M的目标串S,求在目标串S上最少改变多少字符,可以使得它不包含任何的模式串 建立Trie图,求得每个节点是否是不可被包含的串,然后进行DP dp[i][ ...

  10. maven File encoding has not been set

    原pom.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...