package {
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;

    public class BulletTrackingGame extends Sprite {
        private var target:MovieClip; // 目标对象
        private var bullet:MovieClip; // 子弹对象
        private var bulletSpeed:Number = 5; // 子弹速度
        private var trackingStrength:Number = 0.1; // 追踪强度

        public function BulletTrackingGame() {
            // 初始化目标和子弹
            target = new MovieClip();
            target.graphics.beginFill(0xFF0000);
            target.graphics.drawCircle(0, 0, 20);
            target.graphics.endFill();
            target.x = stage.stageWidth / 2;
            target.y = stage.stageHeight / 2;
            addChild(target);

            bullet = new MovieClip();
            bullet.graphics.beginFill(0x0000FF);
            bullet.graphics.drawCircle(0, 0, 10);
            bullet.graphics.endFill();
            bullet.x = stage.stageWidth / 4;
            bullet.y = stage.stageHeight / 4;
            addChild(bullet);

            // 添加鼠标移动监听器来更新目标位置
            stage.addEventListener(MouseEvent.MOUSE_MOVE, updateTargetPosition);

            // 每帧更新子弹位置
            addEventListener(Event.ENTER_FRAME, updateBulletPosition);
        }

        private function updateTargetPosition(event:MouseEvent):void {
            target.x = event.stageX;
            target.y = event.stageY;
        }

        private function updateBulletPosition(event:Event):void {
            // 计算目标方向
            var direction:Point = new Point(target.x - bullet.x, target.y - bullet.y);

            // 归一化方向向量
            var length:Number = Math.sqrt(direction.x * direction.x + direction.y * direction.y);
            if (length > 0) {
                direction.x /= length;
                direction.y /= length;
            }

            // 更新子弹速度，使其逐渐转向目标方向
            var bulletVelocityX:Number = bullet.xSpeed ? bullet.xSpeed : 0;
            var bulletVelocityY:Number = bullet.ySpeed ? bullet.ySpeed : 0;
            bulletVelocityX += (direction.x - bulletVelocityX) * trackingStrength;
            bulletVelocityY += (direction.y - bulletVelocityY) * trackingStrength;

            // 限制子弹速度
            length = Math.sqrt(bulletVelocityX * bulletVelocityX + bulletVelocityY * bulletVelocityY);
            if (length > bulletSpeed) {
                bulletVelocityX /= length * bulletSpeed;
                bulletVelocityY /= length * bulletSpeed;
            }

            // 更新子弹位置
            bullet.x += bulletVelocityX;
            bullet.y += bulletVelocityY;
        }
    }
}