Cocos Studio 扩展说明(2)

ps:本文档修改比较麻烦,特提供word原件一份。

Sprite Extend 控件是进阶篇中提到的带属性区扩展的自定义控件,而 sprite0 则是基础篇中的基本的自定义控件(其表现出来的形式只和 abc 这个基本的自定义控件一样。)。虽然它们所对应的是同一个 Lua 文件。Ø 如果自己要新建工程的话,请参照示例。目标框架为 .Net Framework4.5,输出类型为类库。

  1. 自定义工程导出
    Cocos Studio默认支持三种导出格式:CSB, Json, Lua 。用户可能选择自己需要的格式进行导出,如果有特殊的需求,可以自定制导出,相应的读取部分也需要自己实现。只需要实现CocoStudio.Projects.IGameProjectSerializer 接口(参见示例工程中的 PublishExtend 目录里的 CustomSerializer 类)。接口的定义如下: TypeExtensionPoint] public interface IGameProjectSerializer { ///

    /// 序列化器ID /// string ID { get; } /// /// 对外显示的名称 /// string Label { get; } /// /// 执行序列化 /// /// 发布设置信息 /// 项目文件 /// 错误信息(正常结束时为空) string Serialize(PublishInfo info, IProjectFile projFile); /// /// 执行上下文初始化操作,在第一次 Serialize 调用之前调用它。 /// 对于一个 Studio 解决方案只应该调用一次。 /// 注:每个 *.csd 文件会调用一次 Serialize. /// void ContextInitialize(PublishInfo publishInfo); /// /// 执行上下文结束操作,在最后一次 Serialize 调用之后调用它。 /// 对于一个 Studio 解决方案只应该调用一次。 /// 注:每个 *.csd 文件会调用一次 Serialize. /// void ContextFinalize(PublishInfo publishInfo);} 其它部分请参见示例工程。
    目前用户可以实现将 CSD 文件(即: Cocos Studio 的工程文件)转化为自己需要的格式。
  2. 示例工程
    本节将介绍一些示例工程 Addins.Sample 的其它细节。
    Ø 示例工程的位置:Windows 上文档位置默认安装时,这个目录会是 userprofile\Documents\Cocos\CocosStudio2\Samples\Addins。文档位置非默认安装时,则在 Cocos Studio 的文档安装目录中的相应位置。例如,如果文档的安装目录为D:\CocosDocuments,则该路径为D:\CocosDocuments\Cocos\CocosStudio2\Samples\Addins 。在Mac 上,这个目录为系统目录 /Library/ApplicationSupport/Cocos/CocosStudio2/Samples/Addins。Ø 示例工程的编译:示例工程是一个 Visual Studio 2013 的解决方案。在 Windows 上直接打开Addins.sln 即可编译。如果没有安装 Mono库及 GTK# 请自行安装。在 Mac 上由于权限的关系,请把示例工程拷贝到一个用户有权限读写的目录时行编译。在 Mac 上可以使用 Xamarin Studio 进行编译。请自行安装 MonoFramework。
    Ø 编译后 DLL 的拷贝。编译成功后,会得到一个 Addins.Sample.dll ,请将其拷贝到 Addins 目录里。(Windows 上文档位置默认安装时,这个目录会是%userprofile%\Documents\Cocos\CocosStudio2\Addins。文档位置非默认安装时,则在 Cocos Studio 的文档安装目录中的相应位置。以在 Windows 上为例,如果文档的安装目录为 D:\CocosDocuments,则该路径为 D:\CocosDocuments\Cocos\CocosStudio2\Addins。在 Mac 上,这个目录为用户目录 ~/Library/ApplicationSupport/Cocos/CocosStudio2/Addins)。

  3. 属性区扩展
    CocoStudio内部的控件支持扩展,对于控件的属性同样支持扩展,对于一些基本类型,编辑器中已经默认自带,只需要按照一定规则即可使用,如果使用者想要扩展自定义属性,可以根据自己意愿制作需要的功能(示例代码中有详细介绍)

Cocos Studio预置控件

string类型
帧事件这个属性是一个string类型,内容是一个可以输入的文本,不限制文本的输入格式,可以随意输入,可为空
范例:
stringcustomString = string.Empty;
UndoPropertyAttribute] //允许撤销回退,不允许则不添加
DisplayName(“字符串”)]//Label显示文本
Category(“Custom_Plug”)]//属于哪个分组
PropertyOrder(0)]//在分组的排序,例如,1在0之后
Browsable(true)]//是否显示当前属性,不允许则设置为false 或者不添加这个属性戳
public stringCustomString
{
get { returncustomString; }
set
{
if (customString != value)
{
customString = value;
//如果允许记录撤销记录,则调用属性通知,如果不需要记录,则不添加
this.RaisePropertyChanged(() => this.CustomString);
}
}
}
名称这个属性是一个string类型,内容是一个可以输入的文本,不限制文本的输入格式,可以随意输入,但是不能为空,如果为空,恢复上一次保存的值,若要使用这类文本框,则要调用ValidTextEditor
范例:
UndoPropertyAttribute]
DisplayName(“ValidTextBox”)]
Editor(typeof(ValidTextEditor), typeof(ValidTextEditor))] //这里的Editor是制定特定的类型控件,这些控件属于自己写的,非系统原生
Category(“Custom_Plug”)]
PropertyOrder(0)]
Browsable(true)]
public stringValidTextBoxString { get; set; }

int 类型

逻辑标签这个属性是一个int类型,内容是一个可以输入数字的控件,限制只能输入数字,最大限制默认是正负9999999,在程序中可以通过SetMaxMin进行设置
范例:
int customInt = 0;
UndoPropertyAttribute]
DisplayName(“整数”)]
Category(“Custom_Plug”)]
PropertyOrder(1)]
Browsable(true)]
public intCustomInt
{
get { returncustomInt; }
set
{
if (customInt != value)
{
customInt = value;
this.RaisePropertyChanged(() => this.CustomInt);
}
}
}

bool 类型

可见性这个属性是一个bool类型,类型是一个checkbox,可以进行选择和不选择
范例: bool customBool = false;
UndoPropertyAttribute]
DisplayName(“布尔”)]
Category(“Custom_Extend”)]
PropertyOrder(4)]
Browsable(true)]
public boolCustomBool
{
get { returncustomBool; }
set
{
if (customBool != value)
{
customBool = value;
this.RaisePropertyChanged(() => this.CustomBool);
}
}
}

enmu 类型

水平对齐这个属性是一个enmu类型,类型是一个下拉combox,可以选择不同的enmu项
范例:

protected enum CocosEnmu
{
None,
Fir,
Sec,
Thi
}

Enum customEnum = CocosEnmu.None;

    UndoPropertyAttribute]
    DisplayName("枚举")]
    Category("Custom_Plug")]
    PropertyOrder(5)]
    Browsable(true)]

public Enum CustomEnum
{
get { returncustomEnum; }
set
{
if (customEnum != value)
{
customEnum = value;
this.RaisePropertyChanged(() => this.CustomEnum);
}
}
}

Color 类型

颜色混合这个属性是一个Color类型,类型是一个组合控件,可以选择不同的颜色
范例:
System.Drawing.Color customColor = System.Drawing.Color.White;
UndoPropertyAttribute]
Editor(typeof(ColorEditor), typeof(ColorEditor))]
DisplayName(“颜色”)]
Category(“Custom_Extend”)]
PropertyOrder(6)]
Browsable(true)]
publicSystem.Drawing.Color CustomColor
{
get { returncustomColor; }
set
{
if (customColor != value)
{
customColor = value;
this.RaisePropertyChanged(() => this.CustomColor);
}
}
}

ScaleValue类型

倾斜这个属性是一个ScaleValue类型,类型是一个组合控件,可以分别设置X和Y的值,并且可以在属性中设置最大值最小值和每次鼠标滚轮幅度
范例:
ScaleValuecustomScaleValue = new ScaleValue(1, 1);
UndoPropertyAttribute]
Editor(typeof(CustomEditor), typeof(CustomEditor))]
ValueRange(int.MinValue, int.MaxValue, 1)]//ValueRange属性是设置控件最大值最小值和幅度
DisplayName(“ScaleValue”)]
Category(“Custom_Extend”)]
PropertyOrder(7)]
Browsable(true)]
public ScaleValue CustomScaleValue
{
get { returncustomScaleValue; }
set
{
if (customScaleValue != value)
{
customScaleValue = value;
this.RaisePropertyChanged(() => this.CustomScaleValue);
}
}

PointF类型

锚点这个属性是一个PointF类型,类型是一个组合控件,可以分别设置XY的值
范例:
/PointFEditor和ScaleValueEditor的内容一致,
只是在其中需要类型的强制转换,Point和ScaleValue两种强类型,
在控件内做处理太繁杂,单一原则,把这两个类型写成了两个控件
/
PointF customPointF = new PointF(1, 1);
UndoPropertyAttribute]
Editor(typeof(PointFEditor), typeof(PointFEditor))]
ValueRange(int.MinValue, int.MaxValue, 1)]//ValueRange属性是设置控件最大值最小值和幅度
DisplayName(“ScaleValue”)]
Category(“Custom_Extend”)]
PropertyOrder(7)]
Browsable(true)]
public PointF CustomPointF
{
get { returncustomPointF; }
set
{
if (customPointF != value)
{
customPointF = value;
this.RaisePropertyChanged(() => this.CustomScaleValue);
}
}
}

CustomObject这个范例文件中,一些已经提供的属性,用户添加了这些属性后,需要在CustomObjectData 类中添加相应的属性,这样属性才能在关闭编辑器后保存起来,下次打开文件读取之前保存的属性。
例如:
ItemProperty]
JsonProperty]
public intCustomInt { get; set; }

具体的代码在CustomObjectData 已经添加。

编写一个自定义控件
CustomEditor 继承了BaseEditor基类和 ITypeEditor 接口
NumberEditorWidget 是一个有两个TextBox的控件(类似于ScaleValue类型的这个控件).
ITypeEditor接口必须实现ResolveEditor 方法,这个方法返回一个显示在界面上的控件,如果需要添加多个,则可以继续添加Table之类的容器控件,在容器控件中自定义完所需内容后,返回容器控件。
如果要处理两个TextBox的值变化,则需要添加下面两个事件:
_widget.PointX += widget_PointX;
_widget.PointY += widget_PointY;

PointX和PointY分别是两个TextBox的事件。

private voidwidget_PointX(object sender, PointEvent e)
{
_scaleValue.ScaleX = (float)e.PointX;
UpdatePropertyValue(_propertyItem.PropertyData, _scaleValue);
}
中, 首先对scaleValue进行赋值, _scaleValue.ScaleX =(float)e.PointX;
然后调用UpdatePropertyValue 对渲染区进行更改,当渲染区数据变化时,则会触发 override void OnPropertyChanged(object sender,PropertyChangedEventArgse) 事件,如果要单独处理事件,则可以在OnPropertyChanged 中加上逻辑代码.
(源代码在CustomEditor这个文件中)

  1. 其它
    Ø 目前 Lua 自定义控件扩展不支持 3D 相关内容。
    Ø 目前所用的引擎版本为 Cocos Framework 3.5。
    Ø CocosStudio 工程中的控件的名字应为合法的 Lua 变量,否则发布到Lua 文件后程序 Lua 程序不可以正常执行。这个在 Cocos Studio 新建的工程中会有校验,对于老的工程则不会,但发布时对于不合法的变量名会在 Cocos Studio 输出区打印相应的提示。
    Ø 这是编辑器第一阶段的开放,上面只是针对控件扩展部分,给出了几个必要的类。在编辑器后续的开发过程中,我们会逐步开放编辑器扩展相关的接口和类。并给出相关的文档说明,敬请期待。
    在后续的开发过程中文档的内容会根据反馈持续更新。如有更新,请以新的版本为准。
    如果您对于 Cocos Studio 扩展有任何的意见或者是建议,请在论坛或者是开发者群里反馈给我们。感谢您对 Cocos Studio 的关注和支持,我们将回报您以更好用的产品。

tips: Mac下示例工程的目录/Library/ 要注意不是当前用户下的~/Library
Mac C# IDE http://www.monodevelop.com/