迷宫的地图,如果用碰撞组件,要把很多碰撞区?是不是很麻烦,对性能有影响吗,有没有其他方法,让角色能碰到墙壁就发生事件?
b站有人做过视频https://www.bilibili.com/video/BV16E411M74V
不妨看看
哈哈哈,这个我用ts自己敲了一遍,他的碰撞检测就是用collision group分组。太耗性能了。
碰撞检测就是用collision,这个是不是太耗性能,设置起来也麻烦啊,没有更优化的方法?
地图网格化
能否具体一些,用Title Map?
TieldMap 给墙壁单独加一个层级。给墙壁加碰撞体 给角色添加碰撞体。墙壁分组wall 角色分组role 勾选可碰撞即可达到碰撞
二维数组储存地图格子信息。每次判断角色的实际坐标对应哪个格子,前进方向上的格子是不是墙,是则无法前进。
最近, 我正在做一个和地牢有关的游戏. 刚好涉及这方面的内容.
这是我生成的地图.
假设目前地图中的对象有:
- 英雄
- 一堆怪物
- 地图中的有 走廊, 房间地板, 房间的墙壁, 门.
我的数据结构如下:
hero : 英雄
monsters: 数组存储一堆怪物
map:Tile [][]: 二维数组. 存储地图中的瓷砖(Tile). Tile的属性type标识了走廊, 地板, 墙壁, 门.
英雄只能在走廊, 房间的地板, 门的瓷砖上面移动.
如果英雄移动的方向上遇到了怪物也会停下来(攻击,或者对话).
实现英雄在地图中行走, 我并没有使用官方碰撞的组件, 因为没必要. 当数据结构确定后, 能不能行走只不过是做一下判断就可以了.我使用伪代码:
// 举例: 如何判断英雄是否能够向右走?
let x = hero.x; // 英雄在第几列
let y = hero.y; // 英雄在第几行
// 向右走后的那个瓷砖 x + 1, y 不变
let newX = x + 1;
let newY = y;
// 判断右边的瓷砖是否可以在地图走动
let isCanMoveInMap = false;
let tile = map[newX][newY];
if(tile.type == 走廊 || tile.type == 房间的地板 || tile.type == 门){
isCanMoveInMap = true;
}
// 判断右边的砖块是否有怪物
let isMonsterExit = false;
for(let i = 0 ; i < monsters.length; i++){
let monster = monsters[i];
if(monster.x == newX && monster.y == newY){
isMonsterExit = true;
break;
}
}
if(isCanMoveInMap == true && isMonsterExit == false){
// 英雄可以向右边移动
}else{
// 英雄不能向右边移动
}
希望对你有帮助.
上下左右各判断一次了这样
感谢了,受到了启发了。
map:Tile [][]:
这个在COCOS格式 怎么写 法?
如果角色是随意行走的话,那碰撞会比较复杂点。如果角色是按格子走的话,那就单纯的判断角色行走的下一个格子能不能通行,就容易些了。
Typescript 二维数组的写法.
迷宫地图哪需要物理碰撞检测 网格坐标判断就好了啊

