本人是个后端 但公司里就我一个懂点 web 的被拉去要用 cocos2d-html5 做一个客户端的 demo
大量的 Js 让我痛不欲生啊 遇到各种坑爹问题 这次遇到了找了 2 天没找到 网上也找不到靠谱的 js 社区 慕名而来 Ruby 社区问一下
主要就是 get_move_ranges 和 check_move_ranges 两个方法 这是一个战棋类游戏 寻找用户角色可移动范围的算法。大体的思路就是 角色比如在 (x:10, y: 10) 坐标,然后寻找 上、下、左、右 四个坐标点 然后在这 4 个坐标点再依次展开。
这当中我使用变量 this.move_paths 来存储用户每次可移动的路径 比如每个用户可移动 3 步 他最后存储的就是 [{x: 11, y: 10}, {x: 12, y: 10}, {x: 13, y: 10}]
现在遇到比较奇怪的问题是 this.move_paths 在前几次遍历中是正常的 到后面居然都是重复的值 导致有一些路径无法移动
下面是用到的两个函数
// 获得用户移动范围
get_move_ranges: function(distance, player_position) {
this.check_move_ranges(distance, player_position, 'up');
this.check_move_ranges(distance, player_position, 'down');
this.check_move_ranges(distance, player_position, 'left');
this.check_move_ranges(distance, player_position, 'right');
return this.move_ranges;
// tiled信息
// 是否有障碍物
},
// 递归遍历cover
check_move_ranges: function(distance, position, direction) {
if ( distance > this.move_step ){
return
}
var pls = jQuery.extend({}, position); // 新建对象 因为javascript传递对象是引用
if (direction == 'up')
pls.y += 32;
else if (direction == 'down')
pls.y -= 32;
else if (direction == 'left')
pls.x -= 32;
else if (direction == 'right')
pls.x += 32;
// 定义数据结构
var cover = {
x: pls.x,
y: pls.y
};
// 存储路径坐标
this.move_paths[distance - 1] = pls;
if (cover.x == 272 && cover.y == 208) {
console.log('------------------');
console.log(this.move_paths);
console.log('------------------');
}
// 检查cover是否已经存在数组中
if ( !this.is_cover_exist(cover) )
this.move_ranges.push(cover);
if (this.move_paths.length == this.move_step) {
this.all_paths.push(this.move_paths);
console.log(this.move_paths); // !!!!!!注释行!!!!!
}
this.get_move_ranges(distance + 1, pls);
},
下面就是见证奇迹的时刻 和 让我彻底晕菜的时刻
我在一个特定的点 x:272 y:208 店打印这个 this.move_paths
if (cover.x == 272 && cover.y == 208) {
console.log('------------------');
console.log(this.move_paths);
console.log('------------------');
}
上面代码有个 !!! 注释行!!!
在我注释的时候 this.move_paths 输出的是正常的 this.move_paths 里有 278, 208 这个对象
但是我把这个 注释行去掉 没有更改任何的代码 这个输出的值变了居然 没有 278,208 这个对象 天呐
我不知道是我逻辑的问题还是 js 语法的问题 所以前来请教各位