SuperAPI AI 工具集

cameras

编程与开发

查看项目

更新于 10-15 15:35

技能介绍

用途

本技能用于在 Phaser 4 中处理摄像机(Camera)相关功能。它面向需要在游戏场景中控制视角、实现多摄像机布局、镜头跟随与镜头特效的开发者,提供从核心概念到具体 API 的完整说明与代码示例。

主要能力

  • CameraManager 管理:每个 Scene 通过 this.cameras 访问 CameraManager,可添加、移除、查找、计数、重置摄像机,并支持最多 32 个可使用 ignore() 排除对象的摄像机。
  • 主摄像机:this.cameras.main 指向默认主摄像机,在场景启动、传入 makeMain: true 或当前主摄像机被移除时自动设置。
  • 视口与滚动:视口是画布上的物理矩形,由 setPosition、setSize、setViewport 控制;滚动是摄像机在世界中“看向”的位置,由 scrollX/scrollY 或 setScroll 控制,两者相互独立。
  • 缩放:支持统一缩放与水平/垂直独立缩放,缩放值最小被限制为 0.001。
  • 边界:通过 setBounds 限制滚动范围,可临时用 useBounds = false 禁用或 removeBounds() 移除;边界只限制滚动,不影响视口位置。
  • 跟随精灵:startFollow 可跟随任意具有 x、y 属性的对象,支持 lerp 平滑、偏移、死区与停止跟随。
  • 摄像机特效:包括淡入淡出(fadeIn/fadeOut/fade/fadeFrom)、闪光(flash)、抖动(shake)、平移(pan)、缩放动画(zoomTo)、旋转动画(rotateTo),均返回 this 支持链式调用,并可通过 resetFX() 重置。
  • 忽略列表:ignore() 通过更新对象的 cameraFilter 位掩码让摄像机跳过渲染,适用于 HUD 分层。
  • 死区:setDeadzone 定义跟随目标周围不滚动的矩形区域。
  • 世界坐标转换:getWorldPoint 将屏幕坐标转换为世界坐标,考虑滚动、缩放与旋转。
  • 渲染列表:renderList 每帧填充当前摄像机可见的对象。
  • 强制离屏合成:setForceComposite(true) 让摄像机渲染到离屏帧缓冲,供 CaptureFrame 等使用。
  • 摄像机滤镜(v4):cam.filters.internal 与 cam.filters.external 两个 FilterList,可添加模糊、发光、颜色矩阵等后处理效果,需 WebGL。
  • 键盘控制:提供 FixedKeyControl(固定速度)与 SmoothedKeyControl(带加速度、阻力、最大速度)两种内置控制类,需在 update 中调用 update(delta)。
  • 事件:摄像机继承 EventEmitter,可监听淡入淡出、闪光、抖动、平移、缩放、旋转的开始/完成事件,以及 FOLLOW_UPDATE、PRE_RENDER、POST_RENDER、DESTROY 等。

使用方式

在 Scene 的 create() 方法中通过 this.cameras.main 获取默认摄像机,然后调用相应方法,例如 cam.setScroll(200, 100)、cam.centerOn(400, 300)、cam.setZoom(2)、cam.startFollow(player, false, 0.1, 0.1)、cam.setBounds(0, 0, 2048, 2048)、cam.fadeIn(1000)、cam.filters.external.addBlur(1, 2)。多摄像机场景中可用 this.cameras.add(...) 创建小地图或 HUD 摄像机,并用 ignore() 互相排除对象。键盘控制类需在 create() 中实例化,并在 update(time, delta) 中调用其 update(delta)。

适用场景

  • 需要滚动、缩放、跟随角色的 2D 游戏视角控制。
  • 多摄像机布局,如主视图加小地图、HUD 与游戏世界分层渲染。
  • 镜头特效,如受击抖动、场景切换淡入淡出、闪光、平移与缩放动画。
  • 需要将屏幕点击转换为世界坐标的交互逻辑。
  • 需要为摄像机添加后处理滤镜(WebGL 环境)。

限制

  • 摄像机滤镜需要 WebGL,且滤镜激活时摄像机需通过帧缓冲渲染。
  • 缩放值不能为 0,最小被限制为 0.001。
  • 边界只限制滚动,不阻止对象放置在边界外,也不影响视口位置。
  • 已运行的特效不会自动重启,除非传入 force: true。
  • 超过 32 个摄像机时,额外摄像机 ID 为 0,无法使用 ignore() 排除对象。
  • 键盘控制类需要手动在 update 中调用 update(delta)。
  • 关于收费、价格、平台等信息,资料中暂未提供。