【v2.x OGE教程 12】 关卡编辑器帮助文档

【v2.x OGE教程 12】

关卡编辑器帮助文档

一、简介

关卡编辑器用于游戏关卡界面元素的可视化编辑,包括元素的位置、尺寸以及其它自定义属性。通过解析生成的数据文件即可获取关卡信息,并能随时调整,以减少开发工作量,提高开发效率。

二、界面

主界面

图01_主界面

1) 画布

① 简介

画布用于关卡元素的预览,并提供元素选择和坐标设置等功能;画布的尺寸与其正在显示的关卡的尺寸相同

图02_画布

② 选择元素

a. 单选:鼠标左键单击即可选中单个元素,选中后的元素周围出现蓝色的方框,未选中的则为灰色虚线框

b. 多选:按住Ctrl键不放,再依次点击要多选的元素即可多选

c. 取消选择:点击画布的任意空白区域即可取消选中

③ 移动元素

选中要移动的元素,用鼠标拖拽或者借助键盘的方向按键均可移动所选元素,也可以通过在属性列表中直接输入元素的坐标来移动元素

2) 菜单栏

① 简介

菜单栏是编辑器常用操作的集合,包括“文件”和“帮助”菜单两大类。

图03_菜单栏

② 文件菜单

a. 新建项目

用于打开“新建项目”窗口,在该窗口中输入新项目名称后点击确定按钮即可创建一个新项目

图04_新建项目

注意:新项目名称不能与已有项目的名称重复

b. 打开项目

用于打开已有项目。

点击菜单按钮,在弹出窗口中选择要打开的项目配置文件(xml格式的)即可打开项目

图05_打开项目

c. 保存项目

用于保存对项目的修改

d. 导出项目

用于导出项目所生成的关卡数据文件。

点击菜单,在弹出窗口中选择要导出的目标文件夹,再点击确定后将在指定目录下 生成关卡数据文件

图06_导出项目

③ 帮助菜单

打开帮助

3) 快捷工具栏

① 简介

快捷工具栏是常用功能按钮的集合

图07_快捷工具栏

② 项目相关按钮

用于新建、打开和保存项目

③ 对齐按钮组

用于对齐界面元素,仅当画布中已选中了多个元素时有效;对齐时,以多选时第一个选中的元素为标准

a. 顶端对齐

将所有选中元素的纵坐标设为第一个选中的元素的纵坐标

b. 底端对齐

将所有选中元素的底端与第一个选中的元素的底端对齐

c. 左对齐

将所有选中元素的横坐标设为第一个选中的元素的横坐标

d. 右对齐

将所有选中元素的右端与第一个选中的元素的右侧对齐

e. 横向居中对齐

将所有选中元素的中心点的纵坐标设为第一个选中的元素的中心点的纵坐标

f. 纵向居中对齐

将所有选中元素的中心点的横坐标设为第一个选中的元素的中心点的横坐标

g. 中心对齐

将所有选中元素的中心点的坐标设为第一个选中的元素的中心点的坐标

④ 布局按钮组

用于快速设置界面元素的位置,只对单个元素有效

a. 置顶

将选中元素的纵坐标设为0

b. 置底

将选中元素的底端与画布的底端对齐

c. 左置

将选中元素的横坐标设为0

d. 右置

将选中元素的右端与画布右端对齐

e. 横向居中

将选中元素的中心点的纵坐标设置为画布中心点的纵坐标

f. 纵向居中

将选中元素的中心点的横坐标设置为画布中心点的横坐标

g. 居中

将选中元素的中心点的坐标设置为画布中心点的坐标

⑤ 删除按钮

用于删除画布中选中的元素,支持多选

4) 元素列表

① 简介

元素列表区域显示精灵列表和关卡元素列表

② 精灵列表

精灵列表显示项目的所有精灵,选中某个精灵后,“属性列表”和“自定义属性列表”

将显示该精灵的属性信息

图08_精灵列表

a. 精灵简介

精灵指关卡编辑器中可以在关卡内或者关卡间复用的界面元素,将精灵添加到关卡后,关卡中将生成一个与精灵的各项属性相同的关卡元素

b. 添加精灵按钮

点击后添加一个新的精灵

c. 删除精灵按钮

点击后删除选中的精灵

d. 将精灵添加到关卡中

选择要添加的精灵,将其用鼠标拖拽到画布中即可将该精灵添加到当前的关卡中

5) 关卡列表

关卡列表显示项目中的所有关卡及关卡的元素列表,是一个树形结构

图09_关卡列表

① 关卡

树形结构的第一层显示项目中的关卡列表,选中某个关卡后,“属性列表”和“自定义属性列表”将显示其相关属性,画布将切换到该关卡的布局

② 元素

树形结构的第二层显示关卡的元素列表,选中某个元素后,“属性列表”和“自定义属性列表”将显示其相关属性,画布将切换到该元素所属关卡的布局,并框选该元素对应的画布元素

③ 添加关卡按钮

点击后添加一个新的关卡

④ 删除关卡按钮

点击后删除选中的关卡

6) 属性列表

① 简介

属性列表区域用于显示和修改精灵、关卡及关卡元素的基本信息(如果“元素列表”区域中选中的选项卡为“精灵列表”,则显示当前选中的精灵信息,反之则显示关卡或者关卡元素信息),包括坐标和尺寸等

图10_属性列表

② 名称

用于显示和修改当前对象的名称(注:名称仅用于方便编辑器的显示,在引擎中无意义)

③ 位置

用于显示和修改当前对象的坐标,仅当显示对象为关卡元素时有效

④ 尺寸

用于显示和修改当前对象的宽和高,如果修改了关卡的尺寸,画布将同步更新

⑤ 类型

用于显示和修改当前对象的类型值,仅当显示对象为精灵和关卡元素时有效

⑥ 图片

用于设置该元素的背景图片(仅用于方便编辑器的显示,在引擎中无意义),仅当显示对象为精灵或者关卡元素时有效,点击右侧的按钮可以导入图片资源

7) 自定义属性列表

① 简介

自定义属性列表区域用于显示和修改精灵、关卡及关卡元素的扩展信息(如果“元素列表”区域中选中的选项卡为“精灵列表”,则显示当前选中的精灵信息,反之则显示关卡或者关卡元素信息)

图11_自定义属性

② 修改自定义属性

用鼠标选中要修改的单元格,再单击单元格或按下F2即可修改自定义属性的名称或者值

③ 添加自定义属性

在标有“*”的行(一般为列表的最后一行)中依次输入属性名称和值即可添加一个自定义属性

④ 删除自定义属性

选则要删除的属性所在的行,按Delete键即可删除

注意:自定义属性的名称不能重复,如果输入了重复的名称,将会被自动设置为一个不重复的默认值Property_N

三、示例

1. 新建项目

1) 点击文件菜单,选择新建项目

2) 在弹出的对话框中输入项目名称,点击确定

2. 创建精灵

1) 选中程序右上角的“精灵列表”选项卡

2) 点击“添加精灵”按钮,将创建一个新的精灵,如图12

图12_示例_创建精灵

3) 依次修改精灵的名称、尺寸和类型

4) 设置精灵的图片,如果列表中没有需要的图片,可以通过点击右侧的“+”按钮来导入

5) 重复上述步骤,创建需要的精灵

3. 创建关卡

1) 选中程序右上角的“关卡列表”选项卡

2) 点击“添加关卡”按钮,将创建一个新的关卡,如图13

图13_示例_添加关卡

3) 依次设置关卡的名称和尺寸

4. 添加关卡元素

1) 选中“精灵列表”

2) 选中需要的精灵,将其拖拽到“画布”中,如图14

图14_示例_添加元素

3) 重复上述步骤,添加需要的关卡元素

5. 修改元素属性

1) 选中“关卡列表”选项卡

2) 展开指定的关卡,选中指定元素(也可以用鼠标左键单击画布中的图片来选中指定的关卡元素)如图15

图15_示例_选择元素

3) 设置自定义属性

① 选中“自定义属性”列表中,最左标识有“*”的行

② 选中“名称”单元格,再用鼠标左键单击一次该单元格

③ 输入新的名称

④ 选中“值”单元格,再用鼠标左键单击一次该单元格

⑤ 输入新的值

⑥ 重复上述步骤

四、在项目中使用

1. 导出为数据文件

在关卡编辑器中将关卡导出,生成相应的xml数据文件,然后将数据文件拷贝到项目的合适位置

2. 加载关卡数据文件并使用

注:关卡加载器已集成到引擎中,所在包名:com.orange.util.level

//自定义属性的名称

public static final String TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_BOX = "box";

public static final String TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_CIRCLE = "circle";

public static final String TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_TRIANGLE = "triangle";

public static final String TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_HEXAGON = "hexagon";

@Override

public void onSceneCreate(SceneBundle bundle) {

// TODO Auto-generated method stub

super.onSceneCreate(bundle);

final String FACE_BOX = "face_box.png";

RegionRes.loadBitmapTextureFromAssets(FACE_BOX);

//关卡的容器

final EntityGroup entityGroup = new EntityGroup(this);

this.attachChild(entityGroup);

//初始化关卡加载器对象

final LevelLoader levelLoader = new LevelLoader();

//关卡元素的容器

levelLoader.registerEntityLoader(LevelConstants.TAG_LEVEL, new IEntityLoader() {

@Override

public IEntity onLoadEntity(final String pEntityName, final Attributes pAttributes) {

final int width = SAXUtils.getIntAttributeOrThrow(pAttributes, LevelConstants.TAG_LEVEL_ATTRIBUTE_WIDTH);

final int height = SAXUtils.getIntAttributeOrThrow(pAttributes, LevelConstants.TAG_LEVEL_ATTRIBUTE_HEIGHT);

entityGroup.setWidth(width);

entityGroup.setHeight(height);

return entityGroup;

}

});

//关卡元素

levelLoader.registerEntityLoader(LevelConstants.TAG_ENTITY, new IEntityLoader() {

@Override

public IEntity onLoadEntity(final String pEntityName, final Attributes pAttributes) {

final int x = SAXUtils.getIntAttributeOrThrow(pAttributes, LevelConstants.TAG_ENTITY_ATTRIBUTE_X);

final int y = SAXUtils.getIntAttributeOrThrow(pAttributes, LevelConstants.TAG_ENTITY_ATTRIBUTE_Y);

final int width = SAXUtils.getIntAttributeOrThrow(pAttributes, LevelConstants.TAG_ENTITY_ATTRIBUTE_WIDTH);

final int height = SAXUtils.getIntAttributeOrThrow(pAttributes, LevelConstants.TAG_ENTITY_ATTRIBUTE_HEIGHT);

final String type = SAXUtils.getAttributeOrThrow(pAttributes, LevelConstants.TAG_ENTITY_ATTRIBUTE_TYPE);

Debug.d("x=" + x);

Debug.d("y=" + y);

final VertexBufferObjectManager vertexBufferObjectManager = LevelScene.this.getVertexBufferObjectManager();

final AnimatedSprite face;

if(type.equals(TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_BOX)) {

face = new AnimatedSprite(x, y, FACE_BOX, vertexBufferObjectManager);

} else if(type.equals(TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_CIRCLE)) {

face = new AnimatedSprite(x, y, FACE_BOX, vertexBufferObjectManager);

} else if(type.equals(TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_TRIANGLE)) {

face = new AnimatedSprite(x, y, FACE_BOX, vertexBufferObjectManager);

} else if(type.equals(TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_HEXAGON)) {

face = new AnimatedSprite(x, y, FACE_BOX, vertexBufferObjectManager);

} else {

throw new IllegalArgumentException();

}

face.animate(200);

return face;

}

});

try {

//开始加载

levelLoader.loadLevelFromAsset("Level_1.lvl");

} catch (final IOException e) {

Debug.e(e);

}

}

时间: 2024-08-27 12:04:09

【v2.x OGE教程 12】 关卡编辑器帮助文档的相关文章

【v2.x OGE教程 11】 动画编辑器帮助文档

[v2.x OGE教程 11] 动画编辑器帮助文档 版本号 日期 作者 说明 1.0 2014-9-3 橙子游戏 文档创建       一.简单介绍 动画编辑器用于游戏动画的可视化编辑,支持序列帧动画和关键帧动画.通过解析生成的数据文件就可以获取动画信息,并能随时调整,以降低开发工作量.提高开发效率. 二.相关概念 1. 帧 帧是动画在某个时间点的状态.一系列的帧组成了动画的时间线.动画播放时.通过帧的切换,实现动画效果 2. 序列帧 序列帧组成序列帧动画,这样的动画中.仅通过静态图片的切换来实

【v2.x OGE教程 13】 Scene场景使用

[v2.x OGE教程 13] Scene场景使用 一.场景介绍 OGE开源引擎中,场景(Scene)是用于展示游戏画面的,装载各种精灵.按钮.文字等,例如开始场景需要装载一个游戏标题.开始游戏按钮.背景等 二.Scene场景创建 创建一个类,让其继承Scene类或者Scene的子类,ISceneLauncher的接口定义了一系列对Scene的使用规范 三.Scene场景跳转 ISceneLauncher的是实现类(例如Scene或GameLauncher)可以对场景进行跳转 实现代码:publ

AppleWatch开发教程之调试程序使用帮助文档

AppleWatch开发教程之调试程序使用帮助文档 AppleWatch开发教程之调试程序 调试又被称为排错,是发现和减少程序错误的一个过程.在Xcode中进行调试的需要实现以下几个步骤: 1.添加断点 在进行程序调试之前,首先需要为程序添加断点,断点是调试器应该停止程序的运行并让开发者可以运来查看成的地方.将光标移到到要添加断点的地方,按住Command+\键或者选择菜单栏中的"Degbug|Breakpoints|Add Breakpoint at Current Line"命令进

用VC++MFC做文本编辑器(单文档模式)

用VC++MFC做文本编辑器(单文档模式) 原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下: < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默

ABBYY FineReader 12 能够识别哪些文档语言

ABBYY FineReader可以识别单语言文本和多语言文本(如使用两种及以上语言).对于多语言文本,需要选择多种识别语言. 要为文本指定一种 OCR 语言,请从主工具栏或任务窗口的文档语言下拉列表中选择下列选项之一: ● 自动选择 ABBYY FineReader 将自动从用户自定义的语言列表中选择恰当的语言.要修改此列表: 1. 选择更多语言… 2. 在 语言编辑器对话框中选择 从以下列表中自动选择文档语言选项. 3. 单击指定…按钮. 4. 在 语言对话框中选择所需语言. ● 一种语言或

【v2.x OGE教程 20】粒子效果

1.介绍 粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的 game physics.经常使用粒子系统模拟的现象有火.爆炸.烟.水流.火花.落叶.云.雾.雪.尘.流星尾迹或者象发轨迹这样的抽象视觉效果等等. 2.粒子系统结构 OGE引擎的粒子系统中由粒子.粒子发射器.粒子初始化器.粒子修改器来表现粒子效果. 粒子系统:是Entity的子类,管理粒子发射器,发射比率,粒子孵化,管理粒子修改器等的一个系统 粒子发射器:继承IUpdateHa

【v2.x OGE教程 19】 引擎状态控制

1.手机button监听 OGE中提供了在BaseGameLauncher(GameLauncher的父类)和IScene(Scene实现的接口)中定义了onKeyUp和onKeyDown的方法.使得能开发人员能监听到手机button.OGEKeyEvent提供了丰富的button标记,能够用于推断keycode产生的button标记.return的boolean代表事件是否已处理,假设为false代表未处理,传递到别的onKeyDown中.(可參考android事件处理机制) @Overrid

【v2.x OGE教程 17】事务处理

游戏代码中经常有些逻辑需要处理,因此OGE引擎添加了一个IUpdateHandler的类.IUpdateHandler类是OGE引擎中使用频率非常之高的组件之一,其本身是一个接口,内部有onUpdate以及reset两个函数等待实现,几乎所有OGE引擎应用中都必然会看到它的身影,它也是OGengine开源引擎添加具体业务到游戏业务线程中的主要方法之一. 1.创建IUpdateHandler private IUpdateHandler handler = new IUpdateHandler()

【v2.x OGE教程 16】 Modifier使用相关

OGE引擎的修改器功能很强大,为我们提供了丰富的修改器的实现类,可以修改实体的属性,提供了移动.旋转.缩放.透明.自定义序列.同步.循环等功能,而且改变的效果可以当场生效,也可以在某一个时间段内生效并且可以提供一些缓动函数达到更加丰富的效果. 一.Modifier创建 使用实例: IEntity ball=new Sprite(0,0,ballRegion,this.getVertexBufferObjectManager()); MoveXModifier moveModifier = new