迷宫游戏 ,如何做碰撞

迷宫的地图,如果用碰撞组件,要把很多碰撞区?是不是很麻烦,对性能有影响吗,有没有其他方法,让角色能碰到墙壁就发生事件?

b站有人做过视频https://www.bilibili.com/video/BV16E411M74V
不妨看看

哈哈哈,这个我用ts自己敲了一遍,他的碰撞检测就是用collision group分组。太耗性能了。

碰撞检测就是用collision,这个是不是太耗性能,设置起来也麻烦啊,没有更优化的方法?

地图网格化

能否具体一些,用Title Map?

TieldMap 给墙壁单独加一个层级。给墙壁加碰撞体 给角色添加碰撞体。墙壁分组wall 角色分组role 勾选可碰撞即可达到碰撞

二维数组储存地图格子信息。每次判断角色的实际坐标对应哪个格子,前进方向上的格子是不是墙,是则无法前进。

最近, 我正在做一个和地牢有关的游戏. 刚好涉及这方面的内容.
这是我生成的地图.

假设目前地图中的对象有:

  1. 英雄
  2. 一堆怪物
  3. 地图中的有 走廊, 房间地板, 房间的墙壁, 门.

我的数据结构如下:
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 二维数组的写法.

迷宫地图哪需要物理碰撞检测 网格坐标判断就好了啊