Laya.Stage 类说明文档
目录
- 概述
- 继承关系
- 常量定义
- 核心属性
- 屏幕适配
- 帧率控制
- 事件
- 使用示例
- 最佳实践
概述
Stage 是 LayaAir 引擎中显示列表的根节点,所有显示对象都显示在舞台之上。通过 Laya.stage 单例访问。
核心特点
- 显示列表的根节点,继承自
Laya.Sprite
- 单例模式,通过
Laya.stage 访问
- 提供多种屏幕适配模式
- 提供多种帧率模式,可优化性能和功耗
- 管理舞台焦点、可见性、全屏状态
继承关系
EventDispatcher
└── Node
└── Sprite
└── Stage
常量定义
缩放模式常量 (scaleMode)
| 常量 |
值 |
说明 |
SCALE_NOSCALE |
“noscale” |
不缩放,保持设计尺寸 |
SCALE_EXACTFIT |
“exactfit” |
全屏不等比缩放(可能变形) |
SCALE_SHOWALL |
“showall” |
最小比例缩放,完整显示内容 |
SCALE_NOBORDER |
“noborder” |
最大比例缩放,填满屏幕 |
SCALE_FULL |
“full” |
stage宽高等于屏幕宽高 |
SCALE_FIXED_WIDTH |
“fixedwidth” |
宽度固定,高度自适应 |
SCALE_FIXED_HEIGHT |
“fixedheight” |
高度固定,宽度自适应 |
SCALE_FIXED_AUTO |
“fixedauto” |
根据宽高比自动选择fixedwidth或fixedheight |
屏幕方向常量 (screenMode)
| 常量 |
值 |
说明 |
SCREEN_NONE |
“none” |
不更改屏幕方向 |
SCREEN_HORIZONTAL |
“horizontal” |
自动横屏 |
SCREEN_VERTICAL |
“vertical” |
自动竖屏 |
水平对齐常量 (alignH)
| 常量 |
值 |
说明 |
ALIGN_LEFT |
“left” |
居左对齐 |
ALIGN_CENTER |
“center” |
居中对齐 |
ALIGN_RIGHT |
“right” |
居右对齐 |
垂直对齐常量 (alignV)
| 常量 |
值 |
说明 |
ALIGN_TOP |
“top” |
居顶部对齐 |
ALIGN_MIDDLE |
“middle” |
居中对齐 |
ALIGN_BOTTOM |
“bottom” |
居底部对齐 |
帧率模式常量 (frameRate)
| 常量 |
值 |
说明 |
FRAME_FAST |
“fast” |
快速模式,以最大帧率运行 |
FRAME_SLOW |
“slow” |
慢速模式,帧率为快速模式的一半 |
FRAME_MOUSE |
“mouse” |
鼠标模式,根据2秒内是否有鼠标移动自动切换 |
FRAME_SLEEP |
“sleep” |
睡眠模式,1帧/秒 |
核心属性
尺寸相关
| 属性 |
类型 |
只读 |
说明 |
width |
number |
是 |
舞台宽度 |
height |
number |
是 |
舞台高度 |
designWidth |
number |
否 |
设计宽度(初始化时设置) |
designHeight |
number |
否 |
设计高度(初始化时设置) |
clientScaleX |
number |
是 |
X轴缩放系数 |
clientScaleY |
number |
是 |
Y轴缩放系数 |
适配相关
| 属性 |
类型 |
只读 |
说明 |
scaleMode |
string |
否 |
缩放模式,默认"noscale" |
screenMode |
string |
否 |
屏幕方向,默认"none" |
alignH |
string |
否 |
水平对齐方式,默认"left" |
alignV |
string |
否 |
垂直对齐方式,默认"top" |
性能相关
| 属性 |
类型 |
只读 |
说明 |
frameRate |
string |
否 |
帧率模式 |
renderingEnabled |
boolean |
否 |
是否启用渲染 |
状态相关
| 属性 |
类型 |
只读 |
说明 |
bgColor |
string |
否 |
舞台背景颜色,默认黑色 |
isFocused |
boolean |
是 |
舞台是否获得焦点 |
isVisibility |
boolean |
是 |
舞台是否可见(未进入后台) |
fullScreenEnabled |
boolean |
否 |
是否开启全屏 |
鼠标位置
| 属性 |
类型 |
只读 |
说明 |
mouseX |
number |
是 |
鼠标在Stage上的X轴坐标 |
mouseY |
number |
是 |
鼠标在Stage上的Y轴坐标 |
其他
| 属性 |
类型 |
只读 |
说明 |
focus |
Laya.Node |
是 |
当前焦点对象,影响键盘事件分发 |
canvasRotation |
boolean |
否 |
画布是否翻转 |
canvasDegree |
number |
否 |
画布旋转角度 |
屏幕适配
设置设计尺寸
Laya.init(750, 1334);
Laya.stage.setScreenSize(screenWidth: number, screenHeight: number);
缩放模式选择
Laya.stage.scaleMode = Laya.Stage.SCALE_NOSCALE;
Laya.stage.scaleMode = Laya.Stage.SCALE_EXACTFIT;
Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
Laya.stage.scaleMode = Laya.Stage.SCALE_NOBORDER;
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_WIDTH;
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_HEIGHT;
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_AUTO;
Laya.stage.scaleMode = Laya.Stage.SCALE_FULL;
对齐方式设置
Laya.stage.alignH = Laya.Stage.ALIGN_LEFT;
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
Laya.stage.alignH = Laya.Stage.ALIGN_RIGHT;
Laya.stage.alignV = Laya.Stage.ALIGN_TOP;
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
Laya.stage.alignV = Laya.Stage.ALIGN_BOTTOM;
屏幕方向设置
Laya.stage.screenMode = Laya.Stage.SCREEN_NONE;
Laya.stage.screenMode = Laya.Stage.SCREEN_HORIZONTAL;
Laya.stage.screenMode = Laya.Stage.SCREEN_VERTICAL;
适配组合示例
class Main {
constructor() {
Laya.init(750, 1334);
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_HEIGHT;
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
Laya.stage.bgColor = "#232628";
}
}
帧率控制
帧率模式设置
Laya.stage.frameRate = Laya.Stage.FRAME_FAST;
Laya.stage.frameRate = Laya.Stage.FRAME_SLOW;
Laya.stage.frameRate = Laya.Stage.FRAME_MOUSE;
Laya.stage.frameRate = Laya.Stage.FRAME_SLEEP;
渲染控制
Laya.stage.renderingEnabled = false;
Laya.stage.renderingEnabled = true;
获取帧时间
let time = Laya.stage.getTimeFromFrameStart();
事件
舞台事件列表
| 事件 |
说明 |
Event.RESIZE |
舞台尺寸改变时触发 |
Event.FOCUS |
舞台获得焦点时触发 |
Event.BLUR |
舞台失去焦点时触发 |
Event.FOCUS_CHANGE |
焦点状态改变时触发 |
Event.VISIBILITY_CHANGE |
可见性改变时触发(切换前后台) |
Event.FULL_SCREEN_CHANGE |
全屏状态改变时触发 |
事件监听示例
Laya.stage.on(Laya.Event.RESIZE, this, onResize);
function onResize(): void {
console.log("舞台尺寸:", Laya.stage.width, Laya.stage.height);
}
Laya.stage.on(Laya.Event.FOCUS, this, () => console.log("获得焦点"));
Laya.stage.on(Laya.Event.BLUR, this, () => console.log("失去焦点"));
Laya.stage.on(Laya.Event.VISIBILITY_CHANGE, this, onVisibilityChange);
function onVisibilityChange(): void {
if (Laya.stage.isVisibility) {
console.log("进入前台");
Laya.stage.frameRate = Laya.Stage.FRAME_FAST;
} else {
console.log("进入后台");
Laya.stage.frameRate = Laya.Stage.FRAME_SLOW;
}
}
使用示例
基础初始化
class GameMain {
constructor() {
Laya.init(1334, 750);
this.setupScreen();
Laya.stage.bgColor = "#1e1e1e";
}
private setupScreen(): void {
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_HEIGHT;
Laya.stage.screenMode = Laya.Stage.SCREEN_HORIZONTAL;
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
}
}
动态调整适配
function adaptiveScreen(): void {
const screenRatio = Laya.Browser.clientWidth / Laya.Browser.clientHeight;
const designRatio = 1334 / 750;
if (screenRatio > designRatio) {
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_HEIGHT;
} else {
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_WIDTH;
}
}
获取鼠标位置
Laya.stage.on(Laya.Event.MOUSE_MOVE, this, this.onMouseMove);
function onMouseMove(): void {
const x = Laya.stage.mouseX;
const y = Laya.stage.mouseY;
console.log(`鼠标位置: (${x}, ${y})`);
const localPos = sprite.globalToLocal(new Laya.Point(x, y));
console.log(`相对位置: (${localPos.x}, ${localPos.y})`);
}
全屏控制
function enterFullscreen(): void {
Laya.stage.fullScreenEnabled = true;
}
function exitFullscreen(): void {
Laya.stage.exitFullscreen();
}
Laya.stage.on(Laya.Event.FULL_SCREEN_CHANGE, this, () => {
console.log("全屏状态已改变");
});
性能优化
class PerformanceManager {
constructor() {
this.setupPerformance();
}
private setupPerformance(): void {
Laya.stage.on(Laya.Event.VISIBILITY_CHANGE, this, this.onVisibilityChange);
Laya.stage.frameRate = Laya.Stage.FRAME_MOUSE;
}
private onVisibilityChange(): void {
if (Laya.stage.isVisibility) {
Laya.stage.frameRate = Laya.Stage.FRAME_FAST;
Laya.stage.renderingEnabled = true;
} else {
Laya.stage.frameRate = Laya.Stage.FRAME_SLOW;
Laya.stage.renderingEnabled = false;
}
}
}
最佳实践
1. 横屏游戏适配
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_HEIGHT;
Laya.stage.screenMode = Laya.Stage.SCREEN_HORIZONTAL;
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
2. 竖屏游戏适配
Laya.stage.scaleMode = Laya.Stage.SCALE_FIXED_WIDTH;
Laya.stage.screenMode = Laya.Stage.SCREEN_VERTICAL;
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
3. UI 界面适配
Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
4. 前后台性能优化
Laya.stage.on(Laya.Event.VISIBILITY_CHANGE, this, () => {
if (Laya.stage.isVisibility) {
Laya.stage.renderingEnabled = true;
Laya.stage.frameRate = Laya.Stage.FRAME_FAST;
Laya.timer.resume();
} else {
Laya.stage.renderingEnabled = false;
Laya.stage.frameRate = Laya.Stage.FRAME_SLOW;
Laya.timer.pause();
}
});
5. 动态帧率调整
class FrameRateController {
private busy = false;
setBusy(value: boolean): void {
this.busy = value;
Laya.stage.frameRate = value ?
Laya.Stage.FRAME_FAST :
Laya.Stage.FRAME_MOUSE;
}
enterBattle(): void {
this.setBusy(true);
}
enterIdle(): void {
this.setBusy(false);
}
}
注意事项
-
单例访问:Stage 只有一个实例,通过 Laya.stage 访问,不要手动创建
-
设计尺寸:设计尺寸应与美术资源尺寸保持一致,常见尺寸:
- 竖屏:750×1334、720×1280
- 横屏:1334×750、1280×720
-
适配模式选择:
- 需要完整显示内容用
SCALE_SHOWALL
- 需要填满屏幕用
SCALE_NOBORDER
- 横屏游戏推荐
SCALE_FIXED_HEIGHT
- 竖屏游戏推荐
SCALE_FIXED_WIDTH
-
性能优化:
- 使用
FRAME_MOUSE 可自动节能
- 后台时设置
renderingEnabled = false
- 根据场景复杂度动态调整帧率
-
事件监听清理:注意在场景切换时清理 Stage 上的事件监听
所有评论(0)