p5.js网格游戏move()函数异常 玩家移动效果不符合预期
问题根因
两个问题直接导致右、下方向移动不符合预期:
- 四套方向判断逻辑重复硬编码,网格行列索引和方向的映射写混了,右、下方向的坐标增减对应错了轴
- 移动逻辑只改了格子上的玩家/箱子标记,没有同步更新玩家自身的坐标,后续移动计算一直基于旧位置取值
修复方法
别写四个独立if堆逻辑,先定义统一的方向偏移表,从根源上避免索引写错,同时补上越界判断防止数组访问报错,移动完同步更新坐标。
直接替换move方法即可:
// 方向偏移配置,索引对应dir值,格式为[i方向增量, j方向增量] // 顺序对应:0上、1右、2下、3左 const dirMap = [ [0, -1], [1, 0], [0, 1], [-1, 0] ]; move() { const [di, dj] = dirMap[dir]; // 计算玩家要移动到的目标格子坐标 const targetI = this.i + di; const targetJ = this.j + dj; // 提前做越界拦截,避免访问不存在的网格报错 if (targetI < 0 || targetI >= gridColCount || targetJ < 0 || targetJ >= gridRowCount) return; const targetCell = grid[targetI][targetJ]; // 目标格是墙直接返回 if (targetCell.wall) return; // 目标格有箱子的情况,判断箱子能不能推 if (targetCell.box) { const boxNextI = targetI + di; const boxNextJ = targetJ + dj; if (boxNextI < 0 || boxNextI >= gridColCount || boxNextJ < 0 || boxNextJ >= gridRowCount) return; const boxNextCell = grid[boxNextI][boxNextJ]; // 箱子前面有墙或者其他箱子,推不动 if (boxNextCell.wall || boxNextCell.box) return; // 推箱子逻辑 boxNextCell.box = true; targetCell.box = false; } // 移动玩家 this.player = false; targetCell.player = true; // 如果你是用独立对象存储玩家,记得在这里同步更新玩家的坐标属性 // player.i = targetI; // player.j = targetJ; }
要是你初始化网格的时候是先行后列(外层循环跑行、内层循环跑列,数组是grid[行号][列号]的结构),把dirMap里每组的两个增量换个顺序就能用。代码里的gridColCount、gridRowCount替换成你项目里实际的网格列数、行数变量即可。
内容的提问来源于stack exchange,提问作者MarcoGaLo
相关产品推荐
相关产品推荐

