悠悠楠杉
网站页面
在2D游戏开发中,敌人的智能行为往往是提升游戏体验的关键。本文将使用Phaser JS框架,一步步实现敌人角色的扇形视线检测、动态追踪玩家以及条件触发的射击逻辑,最终打造一个具有挑战性的AI对手。
扇形检测的核心是通过计算敌人与玩家的角度和距离,判断玩家是否位于敌人的视野范围内。以下是实现步骤:
Math.atan2获取敌人到玩家的角度,并与敌人当前朝向角度对比。
// 扇形检测代码示例
function checkSectorVision(enemy, player, radius, angleRange) {
const dist = Phaser.Math.Distance.Between(enemy.x, enemy.y, player.x, player.y);
if (dist > radius) return false;
const angleToPlayer = Phaser.Math.Angle.Between(enemy.x, enemy.y, player.x, player.y);
const angleDiff = Phaser.Math.Angle.Wrap(angleToPlayer - enemy.rotation);
return Math.abs(angleDiff) <= angleRange / 2;
}
当玩家进入视野后,敌人需平滑转向并朝玩家移动。这里采用线性插值(Lerp)优化转向流畅度:
// 敌人追踪逻辑
update() {
if (this.isPlayerInSight) {
// 计算目标角度并平滑转向
const targetAngle = Phaser.Math.Angle.Between(this.x, this.y, player.x, player.y);
this.rotation = Phaser.Math.Angle.RotateTo(this.rotation, targetAngle, 0.05);
// 向玩家移动
this.scene.physics.moveToObject(this, player, this.speed);
}
}
射击行为需满足两个条件:玩家在视线内且未被遮挡。通过Phaser的物理系统实现射线检测:
// 射线检测与射击
function raycastCheck(scene, enemy, player) {
const hit = scene.physics.raycast(enemy, player);
if (!hit || hit.body.gameObject !== player) {
enemy.fireBullet(); // 自定义射击方法
}
}