Sceneobject

代码示例

场景对象的代码示例

场景对象包括场景对象数据和对象实体,场景对象数据主要用于储存读取、传输用,一般是指SceneObject,同时也包括场景对象的自定义属性。

场景对象一般以占位置的方式占用场景中的场景对象列表(scene.sceneObjects)。

场景对象如果属于某个玩家,可以通过so.player找到对应的玩家。

场景对象的实例是根据其原型绑定的场景对象类创建的。

客户端场景对象

单机版:创建场景对象

通过克隆某个场景中某个对象的方式创建对象

克隆出来的对象属性和预设的源对象是一致的。

Script.ts
let fromSceneID = 1; // 对应场景的ID
let sceneObjectID = 5; // 对应该场景下预先摆放的场景对象ID
let soc: ClientSceneObject = Game.currentScene.addSceneObjectFromClone(fromSceneID, sceneObjectID, true) as any;

通过新建的方式创建对象

新建的对象属性需要自己填充,自定义属性也需要自行填充,如果自定义属性和显示对象多而复杂的话则推荐使用克隆的方式,克隆后再修改必要的属性即可。

Script.ts
// 新建场景对象数据
let so = new SceneObject();
// 设置场景对象的基本属性:
so.avatarID = 1; // 行走图设置为1号行走图
so.avatarAct = 1; // 播放1号动作
so.modelID = 1; // 使用1号原型
// 添加到场景对象上,通过数据创建实体对象,返回值是实体场景对象
let soc = Game.currentScene.addSceneObject(so,false,true);
soc.x = 500;
soc.y = 500;
soc.自定义属性 = xxx;

单机版:移除场景对象

默认场景对象未满足出现条件的话会自动从场景上移除,但不会从记录列表(scene.sceneObjects)中移除。

从当前场景上移除,并从记录列表中移除

Script.ts
// so 是场景对象数据或实体,通过so.index找到该位置的实体对象以便移除
Game.currentScene.removeSceneObject(so, true):

从当前场景上移除,但是不从记录列表中移除

Script.ts
// so 是场景对象数据或实体,通过so.index找到该位置的实体对象以便移除
Game.currentScene.removeSceneObject(so, false):

通用:场景对象身上播放和取消播放动画

场景对象身上播放动画

Script.ts
playAnimation(aniID: number, loop: boolean, isHit: boolean, fps: number = null, superposition: boolean = false): Animation

停止播放对象身上的动画

Script.ts
stopAnimation(aniID: any): void;

网络版:创建场景对象

网络版的场景对象数据是在服务端的,客户端场景场景对象一般来自服务器的将场景对象数据传输给客户端后创建。

可参考GameCreator2DNet内核工程,登录连接服务器后,服务器会传输相关场景对象数据以便创建,在自定义属性时可以设置权限,以便制作比如哪些属性是公开,哪些属性是私有。

服务端场景对象

使用克隆方式创建对象

由于场景对象可能带有很多的自定义属性需要配置,推荐使用该方法创建后再修改必要的属性。

Script.ts
// ServerSceneObject 类的静态方法:
static clone(fromSceneID: number, fromSceneObjectindex: number, isCopy: boolean = true): ServerSceneObject

使用新建方式创建对象

由于场景对象可能带有很多的自定义属性需要配置,尽可能使用克隆的方式去创建。

Script.ts
// ServerSceneObject 类的静态方法:
static create(soData: SceneObject, presetCustomAttrs: { [varName: string]: { varType: number, value: any, copy: boolean } } = null, player: ServerPlayer = null, isClone: boolean = true): ServerSceneObject {

自定义对象行为

对象行为是可以自定义的,必须继承于SceneObjectBehaviors类以实现具体的逻辑。

如《ARPG-黑之书》游戏模板中使用了GameSceneObjectBehaviors类实现了对象的具体行为。

Script.ts
class GameSceneObjectBehaviors extends SceneObjectBehaviors

实现逻辑暂停状态的判定:以便判定哪些行为是需要等待结束再继续。(比如RPG游戏中对象处于移动中时则等待其移动完毕再执行下一步)。

Script.ts
protected get logicPause(): boolean {
    // to do 
}

实现重置函数:以便行为编辑器预览时能够重置以及跳转到步骤。

Script.ts
reset(defSceneObejct: SceneObject): void {}

实现具体的行为,对应自定义行为编号,1号自定义行为则执行behavior1,2号则执行behavior2,以此类推。

而自定义行为中的面板属性则自动对应为参数,按照顺序装载参数。

此外还需要实现针对行为编辑器预览的"忽略过程"(this.ignoreProcess,因为在编编辑器预览时需要直接跳过过程而预览结果,比如移动至某个坐标这样的行为。)

Script.ts
// 比如自定义行为编辑器中提供了多个参数,如: x、y、是否使用格子坐标让用户输入。
private behavior12(useVar: number, x: number, y: number, autoFindRoad: boolean, xVarID: number, yVarID: number, useGrid: boolean, relative: boolean, whenCantMoveRetry: boolean, ifObstacleHandleMode: number, moveToGridCenter: boolean, mode: any) {}

alt text

除了该种方式,还可以使用独立的自定义行为实现,参考【自定义行为】。

此外网络版的行为以服务器的行为实例为主,客户端一般仅供行为编辑器预览。


Copyright © 2021 - 2025