Phaser 3 开发PacMan游戏:幽灵AI无法通过路口的问题求助
嘿,我完全懂你现在的困扰——用Phaser 3做PacMan的幽灵AI,结果幽灵只会撞墙才换方向,根本不会主动在路口选择可行路径,这确实挺让人头疼的!
你提到的sprite.body.blocked的问题很关键:这个属性只有当精灵实际发生碰撞接触的时候,才会准确返回各个方向的阻挡状态;一旦精灵没有碰撞,它就只会返回{none: true, up: false, down: false, left: false, right: false},这就导致幽灵没法提前感知路口的可走方向,只能等撞墙才反应。
给你几个实用的解决思路,帮你让幽灵学会主动找路:
主动检测瓦片地图的碰撞状态(最靠谱的方案)
既然你用了瓦片地图,直接去检查精灵周围四个方向的瓦片是否是碰撞瓦片,比依赖物理引擎的碰撞反馈要稳定得多。你可以写一个函数,专门获取当前位置可通行的方向:function getAvailableDirections(sprite, tilemap, collisionLayer) { let directions = []; const tileSize = tilemap.tileWidth; // 假设瓦片宽高一致 // 检查上方瓦片是否可通行 const upTile = tilemap.getTileAtWorldXY(sprite.x, sprite.y - tileSize, false, collisionLayer); if (!upTile || !upTile.properties.collides) { directions.push('up'); } // 检查下方瓦片 const downTile = tilemap.getTileAtWorldXY(sprite.x, sprite.y + tileSize, false, collisionLayer); if (!downTile || !downTile.properties.collides) { directions.push('down'); } // 检查左方瓦片 const leftTile = tilemap.getTileAtWorldXY(sprite.x - tileSize, sprite.y, false, collisionLayer); if (!leftTile || !leftTile.properties.collides) { directions.push('left'); } // 检查右方瓦片 const rightTile = tilemap.getTileAtWorldXY(sprite.x + tileSize, sprite.y, false, collisionLayer); if (!rightTile || !rightTile.properties.collides) { directions.push('right'); } // 排除当前移动方向的反方向,避免幽灵来回折返 const currentFacing = sprite.body.facing; if (currentFacing === Phaser.Physics.Arcade.FACING_LEFT) { directions = directions.filter(dir => dir !== 'right'); } else if (currentFacing === Phaser.Physics.Arcade.FACING_RIGHT) { directions = directions.filter(dir => dir !== 'left'); } else if (currentFacing === Phaser.Physics.Arcade.FACING_UP) { directions = directions.filter(dir => dir !== 'down'); } else if (currentFacing === Phaser.Physics.Arcade.FACING_DOWN) { directions = directions.filter(dir => dir !== 'up'); } return directions; }使用的时候,你只需要在幽灵的
update方法里调用这个函数,拿到可走方向后,随机选一个或者根据你的AI逻辑(比如追Pac-Man的路径)来设置新方向就行,不用再等碰撞发生。避免依赖
blocked或touching属性
这两个属性都是“事后反馈”,只有碰撞发生了才会更新,完全不适合用来提前判断路口的可通行性,所以尽量用主动检测瓦片的方式替代它们。额外小建议
记得确认你的瓦片地图碰撞层设置正确:每个需要阻挡的瓦片都要勾选collides属性,不然检测的时候会误判为可通行。另外,幽灵在路口选方向时,排除反方向能让移动更自然,不会出现来回晃的情况。
希望这些方法能帮你解决问题,如果还有细节上的疑问,比如AI逻辑的优化或者瓦片地图的设置,随时可以再探讨~
备注:内容来源于stack exchange,提问作者Sereen Taleb

