场景框

文档创建者:admin
浏览次数:57
最后更新:2025-07-07
# 场景框.js 详细使用文档

## 概述

场景框是一个基于 PixiJS 的可视化编辑容器,提供了丰富的交互功能,包括对象选择、移动、缩放、对齐等。它适用于构建可视化编辑器、设计工具或交互式应用程序。

## 基本用法

### 初始化

```javascript
// 创建场景框实例
var 我的场景框 = new 场景框();

// 初始化场景框
我的场景框.初始化(x, y, 宽度, 高度, 选项);

// 添加到 PixiJS 应用
pixiApp.stage.addChild(我的场景框.容器);
```

### 初始化参数

- `x`: 场景框 X 坐标
- `y`: 场景框 Y 坐标
- `宽度`: 场景框宽度
- `高度`: 场景框高度
- `选项`: 配置选项对象

### 配置选项

```javascript
{
    // 调试相关
    调试模式: true,                // 是否显示调试信息

    // 舞台相关
    舞台宽度: 2000,               // 舞台宽度
    舞台高度: 1500,               // 舞台高度
    舞台背景颜色: 0xFFFFFF,       // 舞台背景颜色
    舞台边框颜色: 0xCCCCCC,       // 舞台边框颜色
    舞台边框宽度: 1,              // 舞台边框宽度

    // 网格相关
    显示网格: true,               // 是否显示网格
    网格大小: 20,                 // 网格大小
    网格颜色: 0xCCCCCC,           // 网格颜色
    网格透明度: 0.3,              // 网格透明度

    // 选中相关
    显示选中边框: true,           // 是否显示选中边框
    选中边框颜色: 0x4A90E2,       // 选中边框颜色
    选中边框宽度: 2,              // 选中边框宽度
    选中边框透明度: 1.0,          // 选中边框透明度
    选中边框虚线: [5, 5],         // 选中边框虚线样式
    选中背景颜色: 0x4A90E2,       // 选中背景颜色
    选中背景透明度: 0.1,          // 选中背景透明度

    // 控制点相关
    显示控制点: true,             // 是否显示控制点
    控制点颜色: 0x4A90E2,         // 控制点颜色
    控制点大小: 8,                // 控制点大小

    // 框选相关
    选中框选边框颜色: 0x4A90E2,   // 框选边框颜色
    选中框选边框宽度: 1,          // 框选边框宽度
    选中框选边框透明度: 1.0,      // 框选边框透明度
    选中颜色: 0x4A90E2,           // 框选区域颜色
    选中透明度: 0.1,              // 框选区域透明度

    // 缩放相关
    缩放最小值: 0.1,              // 最小缩放比例
    缩放最大值: 5.0,              // 最大缩放比例
    缩放速度: 0.1,                // 缩放速度

    // 对齐相关
    启用对齐: true,               // 是否启用对齐功能
    对齐距离: 5,                  // 对齐吸附距离
    对齐线颜色: 0xFF0000,         // 对齐线颜色
    对齐线宽度: 1,                // 对齐线宽度
    对齐线透明度: 0.8             // 对齐线透明度
}
```

## 核心功能

### 对象管理

```javascript
// 添加对象
var 对象 = 我的场景框.添加对象(显示对象, x, y);

// 删除对象
我的场景框.删除对象(对象);

// 获取所有对象
var 所有对象 = 我的场景框.获取所有对象();

// 获取对象容器
var 对象容器 = 我的场景框.获取对象容器();
```

### 选择操作

```javascript
// 全选
我的场景框.全选();

// 删除选中对象
var 删除数量 = 我的场景框.删除选中对象();

// 添加选中变化监听器
我的场景框.添加选中变化监听器(function() {
    // 当选中对象变化时调用
    console.log('选中对象变化');
});

// 获取当前选中对象列表
var 选中对象列表 = 我的场景框.选中对象列表;
```

### 视图控制

```javascript
// 设置缩放
我的场景框.设置缩放(缩放比例);

// 设置视图位置
我的场景框.设置视图位置(x, y);

// 重置视图(回到原始位置和缩放)
我的场景框.重置视图();

// 居中视图(将舞台居中显示)
我的场景框.居中视图();
```

### 外观设置

```javascript
// 设置舞台选项
我的场景框.设置舞台选项({
    舞台宽度: 2000,
    舞台高度: 1500,
    舞台背景颜色: 0xFFFFFF
});

// 设置网格选项
我的场景框.设置网格选项({
    显示网格: true,
    网格大小: 20,
    网格颜色: 0xCCCCCC,
    网格透明度: 0.3
});

// 设置选中边框选项
我的场景框.设置选中边框选项({
    显示选中边框: true,
    选中边框颜色: 0x4A90E2,
    选中边框宽度: 2
});

// 设置虚线样式
我的场景框.设置虚线样式([5, 5]);
```

### 对齐功能

```javascript
// 设置对齐选项
我的场景框.设置对齐选项({
    启用对齐: true,
    对齐距离: 5,
    对齐线颜色: 0xFF0000
});

// 显示对齐线
我的场景框.显示对齐线(x, y, 是否水平线);

// 隐藏对齐线
我的场景框.隐藏对齐线();
```

### 资源管理

```javascript
// 销毁场景框,释放资源
我的场景框.销毁();
```

## 交互操作

场景框支持以下用户交互:

1. **选择对象**:
   - 左键点击选择单个对象
   - Shift + 左键点击添加/移除选择
   - 左键拖拽框选多个对象

2. **移动对象**:
   - 选中后直接拖拽
   - 使用键盘方向键微调位置

3. **缩放对象**:
   - 拖拽控制点调整大小
   - 角点控制点可同时调整宽高
   - 边缘控制点单独调整宽度或高度

4. **场景导航**:
   - 鼠标滚轮:缩放场景
   - Shift + 滚轮:垂直滚动
   - Alt + 滚轮:水平滚动
   - 右键拖拽:平移场景

5. **对齐辅助**:
   - 移动对象时自动显示对齐线
   - 接近其他对象边缘时自动吸附

## 事件系统

场景框内部实现了完整的事件处理系统,处理用户交互并触发相应的功能。主要事件包括:

- 鼠标按下:开始选择、移动或框选操作
- 鼠标移动:更新选择框、移动对象或调整大小
- 鼠标抬起:完成操作,更新选中状态
- 鼠标滚轮:控制缩放或滚动
- 键盘事件:辅助操作(如方向键移动、删除键等)

## 高级功能

### 自定义组件集成

场景框设计为可以与自定义组件无缝集成。自定义组件需要满足以下条件:

1. 包含一个 `容器` 属性,指向 PIXI.Container 实例
2. 可选实现 `设置位置(x, y)` 方法
3. 可选实现 `设置宽高(宽, 高)` 方法

### 嵌套组件支持

场景框支持嵌套组件结构,可以在容器内添加子组件,并保持正确的事件传递和选择行为。

### 热点设置

所有添加到场景框的对象热点(pivot)都会被设置为(0,0),确保定位准确一致。

## 最佳实践

1. **组件设计**:
   - 确保所有组件都有一个主容器属性 `容器`
   - 实现 `设置位置` 和 `设置宽高` 方法以支持拖拽和缩放
   - 保持热点(pivot)为(0,0)以确保准确定位

2. **性能优化**:
   - 限制场景中对象的数量
   - 对于复杂组件,考虑使用缓存或优化渲染
   - 大型场景考虑使用对象池管理

3. **事件处理**:
   - 确保子组件的事件不会被父容器阻止
   - 使用 `e.stopPropagation()` 控制事件冒泡
   - 避免在全局范围内添加过多事件监听器

## 示例代码

```javascript
// 创建PixiJS应用
const pixiApp = new PIXI.Application();
await pixiApp.init({
    width: container.clientWidth,
    height: container.clientHeight,
    backgroundColor: 0xffffff,
    antialias: true
});
document.getElementById('container').appendChild(pixiApp.canvas);

// 创建场景框
const 我的场景框 = new 场景框();
我的场景框.初始化(0, 0, container.clientWidth, container.clientHeight, {
    调试模式: true,
    舞台宽度: 2000,
    舞台高度: 1500,
    网格大小: 20,
    网格透明度: 0.3
});

// 添加场景框到应用
pixiApp.stage.addChild(我的场景框.容器);

// 添加自定义组件
const 按钮组件 = new 按钮();
按钮组件.初始化(100, 100, 120, 40, {
    文本: '测试按钮',
    背景颜色: 0x4a90e2
});
我的场景框.添加对象(按钮组件.容器);

// 监听选中变化
我的场景框.添加选中变化监听器(function() {
    if (我的场景框.选中对象列表.length > 0) {
        console.log('选中了对象:', 我的场景框.选中对象列表);
    }
});
```

## 注意事项

1. 场景框依赖于 PixiJS v8 或更高版本
2. 所有坐标都基于左上角(0,0)点
3. 对象的交互性通过 `eventMode = 'static'` 启用
4. 在销毁场景框时,需要调用 `销毁()` 方法释放资源

发表评论已发布 1

admin

发表于 3 天前 | 显示全部楼层

I'll search for and read the `场景框.js` file to provide documentation of all its methods.
Read file: 场景框.js
Let me read the rest of the file to capture all methods:
Read file: 场景框.js
Let me continue reading through the file to document all the methods:
Search files...
Let me use grep to search for method definitions:
Ran tool
Now let me look for any additional methods not captured by the previous search:
Ran tool
Let me search for additional methods that might be declared in a different way:
Ran tool
Let me look for more method declarations using other patterns:
Ran tool
Let me check for layer manipulation methods specifically:
Ran tool
Let's search for any methods related to object position in the z-order:
Ran tool
Let me look for additional new methods in the file:
Ran tool
Ran tool
Ran tool
Let me look for methods related to child index management:
Ran tool
Let me check for other methods related to layer manipulation:
Ran tool
Based on all the searches, let me now compile a comprehensive list of all methods in `场景框.js` with their documentation.

## 场景框.js 方法文档

### 初始化和基本设置方法

1. **初始化(x, y, 宽, 高, 选项)**
   - 描述:初始化场景框组件,设置基本参数和创建必要的容器、对象
   - 参数:
     - x: X坐标位置
     - y: Y坐标位置
     - 宽: 宽度
     - 高: 高度
     - 选项: 可选配置对象

2. **设置位置(x, y)**
   - 描述:设置场景框的位置
   - 参数:
     - x: X坐标位置
     - y: Y坐标位置

3. **设置宽度(宽度)**
   - 描述:设置场景框的宽度
   - 参数:
     - 宽度: 新的宽度值

4. **设置高度(高度)**
   - 描述:设置场景框的高度
   - 参数:
     - 高度: 新的高度值

5. **设置宽高(类型, 宽, 高)**
   - 描述:设置场景框或舞台的宽高
   - 参数:
     - 类型: 设置对象类型,如'场景'或'舞台'
     - 宽: 宽度值
     - 高: 高度值

6. **设置圆角(圆角)**
   - 描述:设置场景框的圆角大小
   - 参数:
     - 圆角: 圆角的半径值

7. **设置舞台透明模式(透明模式)**
   - 描述:设置舞台是否为透明模式
   - 参数:
     - 透明模式: 布尔值,true为透明模式

8. **设置网格显示(显示)**
   - 描述:设置是否显示网格
   - 参数:
     - 显示: 布尔值,控制网格显示状态

9. **设置网格颜色(颜色, 透明度)**
   - 描述:设置网格的颜色和透明度
   - 参数:
     - 颜色: 网格颜色值
     - 透明度: 网格透明度值

10. **设置棋盘格(选项)**
    - 描述:设置舞台棋盘格的相关参数
    - 参数:
      - 选项: 棋盘格配置对象

11. **设置虚线样式(虚线样式)**
    - 描述:设置选中框等的虚线样式
    - 参数:
      - 虚线样式: 虚线样式数组,如[5, 5]

### 对象操作方法

1. **添加对象(对象, x, y)**
   - 描述:添加一个对象到场景中
   - 参数:
     - 对象: 要添加的PIXI对象
     - x: 对象的X坐标
     - y: 对象的Y坐标

2. **删除对象(对象)**
   - 描述:从场景中删除一个对象
   - 参数:
     - 对象: 要删除的PIXI对象

3. **删除选中对象()**
   - 描述:删除所有当前选中的对象

4. **全选()**
   - 描述:选中场景中的所有对象

5. **获取所有对象()**
   - 描述:获取场景中的所有对象
   - 返回:对象数组

6. **获取选中对象()**
   - 描述:获取当前选中的对象
   - 返回:选中对象的数组

7. **事件添加对象(fn)**
   - 描述:注册一个回调函数,当需要添加对象时会被调用
   - 参数:
     - fn: 回调函数,接收parent, x, y三个参数

### 对齐和分布方法

1. **左对齐()**
   - 描述:将选中的多个对象左对齐

2. **右对齐()**
   - 描述:将选中的多个对象右对齐

3. **顶对齐()**
   - 描述:将选中的多个对象顶对齐

4. **底对齐()**
   - 描述:将选中的多个对象底对齐

5. **水平居中对齐()**
   - 描述:将选中的多个对象水平居中对齐

6. **垂直居中对齐()**
   - 描述:将选中的多个对象垂直居中对齐

7. **左右平均分布()**
   - 描述:将选中的多个对象在水平方向上平均分布

8. **上下平均分布()**
   - 描述:将选中的多个对象在垂直方向上平均分布

9. **左右真平均分布()**
   - 描述:将选中的多个对象在水平方向上真正平均分布(考虑对象宽度)

10. **上下真平均分布()**
    - 描述:将选中的多个对象在垂直方向上真正平均分布(考虑对象高度)

11. **设置吸附选项(选项)**
    - 描述:设置对象吸附相关的选项
    - 参数:
      - 选项: 吸附相关配置对象

### 视图和选择方法

1. **重置视图()**
   - 描述:重置场景视图到初始状态,包括位置和缩放

2. **设置选中边框选项(选项)**
   - 描述:设置选中对象时显示的边框样式选项
   - 参数:
     - 选项: 边框样式配置对象

3. **添加选中变化监听器(回调函数)**
   - 描述:添加一个监听器,当选中对象变化时会被调用
   - 参数:
     - 回调函数: 选中变化的回调函数

4. **获取舞台容器()**
   - 描述:获取舞台容器对象
   - 返回:PIXI.Container对象

5. **获取对象容器()**
   - 描述:获取对象容器
   - 返回:PIXI.Container对象

### 撤销和重做功能

1. **撤销()**
   - 描述:撤销上一步操作

2. **重做()**
   - 描述:重做上一步被撤销的操作

### 导入导出功能

1. **导出JSON()**
   - 描述:将场景内容导出为JSON格式
   - 返回:JSON字符串

2. **导入JSON(json)**
   - 描述:从JSON数据导入场景内容
   - 参数:
     - json: JSON字符串或对象

### 内部方法(以下是带下划线的私有方法)

1. **_输出调试(类型, 信息)**
   - 描述:输出调试信息到控制台

2. **_输出错误(类型, 信息)**
   - 描述:输出错误信息到控制台

3. **_创建背景()**
   - 描述:创建场景框背景

4. **_创建网格()**
   - 描述:创建网格背景

5. **_创建舞台()**
   - 描述:创建舞台容器

6. **_创建对齐线()**
   - 描述:创建对齐辅助线

7. **_创建调试文本()**
   - 描述:创建调试文本显示

8. **_更新调试文本()**
   - 描述:更新调试文本内容

9. **_启动动画循环()**
   - 描述:启动场景的动画循环

10. **_初始化事件()**
    - 描述:初始化各种事件监听

11. **_处理鼠标按下(e)**
    - 描述:处理鼠标按下事件

12. **_处理鼠标移动(e)**
    - 描述:处理鼠标移动事件

13. **_处理鼠标抬起(e)**
    - 描述:处理鼠标抬起事件

14. **_处理鼠标滚轮(e)**
    - 描述:处理鼠标滚轮事件,通常用于缩放

15. **_处理键盘按下(e)**
    - 描述:处理键盘按下事件

16. **_处理键盘抬起(e)**
    - 描述:处理键盘抬起事件

17. **_设置缩放比例(新缩放比例, 缩放中心)**
    - 描述:设置场景的缩放比例
    - 参数:
      - 新缩放比例: 新的缩放值
      - 缩放中心: 缩放的中心点

18. **_获取点击对象(位置, 优先子对象, 透视检测)**
    - 描述:获取指定位置点击的对象
    - 参数:
      - 位置: 点击位置坐标
      - 优先子对象: 是否优先考虑子对象
      - 透视检测: 是否进行透视检测

19. **_触发添加对象事件(parent, x, y)**
    - 描述:触发添加对象事件
    - 参数:
      - parent: 父容器
      - x: X坐标
      - y: Y坐标

20. **_框选对象(x, y, w, h, 仅更新临时列表)**
    - 描述:通过框选方式选择对象
    - 参数:
      - x, y: 框选起始坐标
      - w, h: 框选宽高
      - 仅更新临时列表: 是否只更新临时选中列表

21. **_移动选中对象(dx, dy)**
    - 描述:移动当前选中的对象
    - 参数:
      - dx, dy: 移动的X、Y偏移量

22. **_检查对齐(对象列表)**
    - 描述:检查对象列表是否与其他对象对齐
    - 参数:
      - 对象列表: 要检查的对象列表

23. **_更新选中边框()**
    - 描述:更新选中对象的边框显示

24. **_处理控制点点击(e, 控制点类型, 控制点索引)**
    - 描述:处理控制点被点击的事件
    - 参数:
      - e: 事件对象
      - 控制点类型: 控制点类型
      - 控制点索引: 控制点索引

25. **_获取控制点对象(控制点类型, 控制点索引)**
    - 描述:获取指定类型和索引的控制点对象
    - 参数:
      - 控制点类型: 控制点类型
      - 控制点索引: 控制点索引

26. **_处理缩放鼠标移动(e)**
    - 描述:处理缩放操作时的鼠标移动
    - 参数:
      - e: 事件对象

27. **_处理缩放鼠标抬起()**
    - 描述:处理缩放操作结束时的鼠标抬起

28. **_更新控制点位置()**
    - 描述:更新控制点的位置

29. **_创建控制点()**
    - 描述:创建选中对象的控制点

30. **_更新框选区域()**
    - 描述:更新框选区域的显示

31. **_绘制框选区域(x, y, w, h)**
    - 描述:绘制框选区域
    - 参数:
      - x, y: 框选起始坐标
      - w, h: 框选宽高

32. **_处理选中边框点击(e)**
    - 描述:处理选中边框被点击的事件
    - 参数:
      - e: 事件对象

33. **_开始缩放选中对象(e, 控制点类型, 控制点索引)**
    - 描述:开始缩放选中的对象
    - 参数:
      - e: 事件对象
      - 控制点类型: 控制点类型
      - 控制点索引: 控制点索引

34. **_绘制吸附线(方向, 位置, 起点, 终点, 参考对象)**
    - 描述:绘制对象吸附辅助线
    - 参数:
      - 方向: 吸附线方向(水平或垂直)
      - 位置: 吸附线位置
      - 起点, 终点: 吸附线的起点和终点
      - 参考对象: 参考对象

35. **_绘制选中边框(最小X, 最小Y, 宽度, 高度)**
    - 描述:绘制选中对象的边框
    - 参数:
      - 最小X, 最小Y: 边框左上角坐标
      - 宽度, 高度: 边框宽高

36. **_触发选中变化()**
    - 描述:触发选中对象变化的事件

37. **_更新舞台背景()**
    - 描述:更新舞台背景

38. **_创建遮罩()**
    - 描述:创建场景遮罩,防止内容溢出

39. **_是否为子对象(子对象, 父对象)**
    - 描述:检查一个对象是否为另一个对象的子对象
    - 参数:
      - 子对象: 可能的子对象
      - 父对象: 可能的父对象

40. **_处理控制点拖动(event)**
    - 描述:处理控制点被拖动的事件
    - 参数:
      - event: 事件对象

41. **销毁()**
    - 描述:销毁场景框及其相关资源

### 其他辅助函数

此外,文件中还包含一些不直接挂载在That对象上的辅助函数:

1. **_pushHistory(cmd)**
   - 描述:将操作添加到历史记录栈中

2. **_applyUndo(cmd)**
   - 描述:应用撤销操作

3. **_applyRedo(cmd)**
   - 描述:应用重做操作

4. **循环()**
   - 描述:动画循环函数

5. **_hit(container, globalX, globalY)**
   - 描述:检测点击是否命中对象

6. **findAllHits(container, x, y, depth, path)**
   - 描述:查找所有被命中的对象

7. **计算全局边界(对象)**
   - 描述:计算对象的全局边界

8. **_serializeContainer(container)**
   - 描述:序列化容器对象

9. **_serializeDisplay(obj)**
   - 描述:序列化显示对象

10. **_getType(o)**
    - 描述:获取对象的类型

11. **_buildFromData(arr,parent)**
    - 描述:从数据构建对象

12. **_createDisplay(item)**
    - 描述:创建显示对象

13. **_祖先已被选(obj,list)**
    - 描述:检查对象的祖先是否已被选中

14. **_移除后代(parent,list)**
    - 描述:从列表中移除对象的后代

15. **_可编辑(o)**
    - 描述:检查对象是否可编辑

16. **递归检查容器(容器)**
    - 描述:递归检查容器中的对象

17. **获取累计偏移(对象)**
    - 描述:获取对象相对于舞台的累计偏移
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则