KeyFansClub

首页 » - 特色讨论区 - » 键社茶餐厅 » MM GAL 企划中,欢迎大家提建议(禁水)
Prz - 2006/4/12 14:15:00
这个标题是不是很让人想入非非? 嘿嘿...

不过事实上也不是想象的那么无聊啦...
MM GAL = Misha's Mad Graphic Audio Language

怎么说呢,应该是一个小型的特效脚本语言。

采用我正在开发中的GDI特效引擎提供支持;(试验作品见土豆星专卖)
目标是能够采用非常接近自然语言的格式,和非常接近电影(游戏)剧本的形式,实现一些华丽的特效场景。

本引擎与现存的各种商业/非商业脚本引擎并非竞争关系,因为设计目标不同:
现存的脚本引擎是为了做出有一定长度和内容的故事(Graphic Novel);
而MMGAL则是为了做出一个短小精干而引人注目的场景

因此,MMGAL也能够提供一些非常有趣的语言特征:

初步的企划如下,欢迎大家提供功能/语法上的建议和意见。

* 脚本语言由一些基本的,类似电影脚本的元素组成:
  Scenario(场景) - 最大的一个元素,整个脚本由一个或者多个场景组成;
  Stage(舞台) - 组成场景的元素,对应屏幕上的窗口
  Prop(道具) - 组成场景的元素,对应一个图片(绘图表面)

* 对道具和舞台可以有多种特效操作
  目前能想到的如下,欢迎大家提供更多建议
  平移,翻转,灰度化,淡入淡出,各种绘图操作(直线/方框/椭圆/填充等),亮度/色彩/对比度调节,放缩,模糊,马赛克

* 整个场景由Track(时间轴)推动
  具体地说应该是每一个道具根据自己的时间轴作出相应的动作。当然如果需要的话,也可以对外部事件(鼠标键盘)做出响应。

* 声音的支持目前列在第二期计划中,初步定义如下
  每一个场景可定义循环播放的(BGMusic)背景音乐;
  每一个道具可定义(Lines)台词,可由时间轴或者事件触发。

整个语言设计的最终目的就是让它神似于自然语言和脚本设定语言,让每个感兴趣的人都能够轻松的做出自己想要的特效场景,不论有没有程序基础。
Prz - 2006/4/12 14:38:00
给出一个粗略的脚本样板吧,当然不保证今后真正支持的格式就是一模一样的:

场景:一架飞机从桌面飞过

舞台:桌面
    大小:全屏
    样式:半透明
    位置:左上角

道具:桌面.飞机
    大小:未知
    位置:左边居中
    样式:半透明

场景(一架飞机从桌面飞过)准备

桌面.飞机:载入图片"飞机.PNG"
          移动:左,全长      // 将飞机彻底移出左边界
          时间轴-长度:10秒
                间隔:0.1秒
                动作:定位:横向,(桌面.全长 + 桌面.飞机.全长*2) * 时间点编号/100
                重复:否

场景(一架飞机从桌面飞过)开始

等待动作结束:桌面.飞机

场景(一架飞机从桌面飞过)结束


以上脚本将会使一个飞机模样的图片用十秒钟从屏幕的左面飞到右面。
watashia - 2006/4/12 14:44:00
……
是用中文编的脚本?!  orz
那这个最后是EXE格式的吧?
[hr]
那么就是一个插件了么?
不懂编程啊,所以没法提供什么专业的意见了。
不过中文编程语言还是要绝对支持啊orz
kkkklll - 2006/4/12 15:04:00
如果能够只用一句话就好了,比如下面的:
一架飞机从屏幕左上角向左飞过,用时10秒。

貌似很难的说说……
Prz - 2006/4/12 15:14:00
楼上的这个的确有难度...因为让计算机懂人类语法到现在都还是不可能的...
多多少少这个GAL也是编程语言,因此只能神似,做不到形也似...

楼上的楼上: 最终产品应该是就一个脚本语言,文本文件。当然也可以编译一下成为MM GAL脚本引擎的专用脚本文件。至于资源打包等就是后话了。

目前需要通过大家的智慧确定一个比较实用而方便的稳定语法结构。

哦,对了,因为本语言的元素较少,语法相对简单,应该可以用语言转译配置文件的方式支持多种语言。编译器支持的"本土语言"应该是英文(因为敲起来速度比较快),但是如果不会英文或者不喜欢英文的用户可以选择自己喜欢的语言(火星语?) ^^
kkkklll - 2006/4/12 15:34:00
嗯,可以把一些最常用的模式 + 填参数 的方法来合并一下,就像宏。
至少这这些模式里,让它像个人……
以后的人们可以加入新模式,让它更像人……但有一点,实现代码上绝对不能重复,对人接口疯狂重复(没歧义的前提下),疯狂引用就好了。DRY(Don't repeat yourself)原则是我认为的最重要的原则之一。楼主应该比我清楚。不过后面加入的那些如何符合标准就不太好办了……
模式的输入可以弄个选择什么的,像VS的自动完成那样……

基本动作,大概就是:
移动,透明度改变(出现和消失都包含了),文字显示(这个和图形不一样,是种特殊方式),执行时间,自动作用的代码范围(比如:自动动作执行到某一步就退出),键盘响应与跳转。

我似乎暂时想不出来更多了。大家补充吧。
深海蓝空 - 2006/4/12 15:52:00
其实感觉做出来的东西和flash是一个效果……—v—b

那么就像楼上所说,可否做成mark language样的脚本语言,
函数+参数式……
模块(函数):move <object= ..., time=...>

那么编译后会变成什么格式的可执行文件?还是一个动态图片?还是什么?
Prz - 2006/4/12 16:21:00
不是每个人都喜欢程序一样的语言的...但是如果喜欢的人,也可以用这些语法,通过一个转译文件就可以实现 ^^

编译后的文件一般来说仍然是不可独立执行的文件,需要和引擎一起发布,就像avg32/Reallive 和seen.txt的关系一样。
不过如果需要,也可以把编译后脚本并为引擎的资源的一部分,这样就可以一个EXE文件发布了。
当然如果引用了外部文件的话,最好还是分开发布,不然带有几十上百MB资源的EXE文件可能会有执行效率问题...
sorabeam~ - 2006/4/12 16:23:00
特效加上旋转扭曲与波动扭曲吧
蓝空公主 - 2006/4/12 16:50:00
这样的设计思路如何

程序执行机构 <- 初级解释脚本 <- 宏定义 <- 高级脚本

比如:
==========================================
高级脚本(结构化描述)
SC [desktop(舞台名称),@Desktop(舞台),full(大小),50(透明度),X,Y,W,H(舞台位置)]  //舞台设定
IT [plane(道具名称),picture(到据类型),"飞机.PNG"(道具载入),X,Y,W,H(初始定位)] //道具设定(坐标相对于舞台坐标)
TL [10(fps设定),noloop(是否循环),desktop(舞台),(plane)(道具列表)]  //时间轴设定
BEGIN
    AF [0(处于帧)]  //关键帧设置
    {
    plane.X = <初始位置X坐标>
    plane.Y = <初始位置Y坐标>
    plane.W = <初始位置W坐标>
    plane.H = <初始位置H坐标>
    }
    AF [100(处于帧)]  //关键帧设置
    {
    plane.X = <结束位置X坐标>
    plane.Y = <结束位置Y坐标>
    plane.W = <结束位置W坐标>
    plane.H = <结束位置H坐标>
    }
END //结束时间轴
==========================================
把以上高级脚本经过宏解释器分解为低级脚本操作序列,具体执行了以下过程:
1.载入桌面场景
2.定义舞台边界
3.定义舞台相对坐标与全局坐标的转换
4.设置相关属性(如alpha等)
5.载入文件"飞机.PNG"
7.定义基于"飞机.PNG"的物件对象
8.在舞台上进行物件位置的初始化
9.设定时间线
10.记录关键帧(第0帧)信息
11.执行关键帧(第0帧)信息
12.记录关键帧(第100帧)信息
13.对比上一关键帧(第0帧)与本关键帧(第100帧)信息
14.制定动画向量方法
15.从关键帧(第0帧)到关键帧(第100帧)顺序运行动画向量方法(绘图)
16.结束标记
==========================================
最后把以上由低级脚本描述的过程付诸实际代码执行


当添加了新的底层功能时只需要扩充低级脚本,并根据实用需求增加一些宏代码就行了
Prz - 2006/4/12 17:09:00
我想象中的语言定义的程度还要粗一点。
一个道具(不用指定任何类型),既可以用来做图形绘制,也可以用来载入图片,还可以用来显示文字。
一个时间轴,既可以用来指定固定时间间隔的事件,又可以用来指定一些列顺序发生的事件(间隔长度不定,不能用fps来表示)

哦,说起来,楼上的楼上提醒了我,还需要加一个离屏道具(就是用来做中间处理,而不显示的),起名叫Morpher,不知道中文命名如何比较合适?
watashia - 2006/4/12 18:55:00
以下引用Prz在2006-4-12 17:09:06的发言:
哦,说起来,楼上的楼上提醒了我,还需要加一个离屏道具(就是用来做中间处理,而不显示的),起名叫Morpher,不知道中文命名如何比较合适?

幕后英雄?
希德船长 - 2006/4/12 20:38:00
首先,补充一个比较实用但可能比较难实现的功能:让道具沿着自定义的不规则曲线以一定速度和加速度运动。

至于脚本语言的设计,首先应该有一套实现基本功能的关键字(这些关键字可以和执行部件中的函数相关联),比如说初始化桌面(位置,尺寸,背景色,透明度,等等),添加道具,删除道具,修改道具属性(位置,尺寸,等),获取道具和桌面的各项属性,等等,这些作为脚本的底层功能。

在这基础上,可以设计一组类似宏操作的指令,比如移动,旋转,淡入淡出,以及百叶窗等图像特效,通过设置包括起始时刻,持续时间(或终止时刻)在内的参数来控制场境内的行为。

以下引用Prz在2006-4-12 17:09:06的发言:
我想象中的语言定义的程度还要粗一点。
一个道具(不用指定任何类型),既可以用来做图形绘制,也可以用来载入图片,还可以用来显示文字。
一个时间轴,既可以用来指定固定时间间隔的事件,又可以用来指定一些列顺序发生的事件(间隔长度不定,不能用fps来表示)


比如说,道具就相当于内存DC,既可以用来做图形绘制,也可以用来载入图片,还可以用来显示文字。

间隔时间不确定的事件可以用道具本身的属性来控制,时间轴指定事件的开始时间,事件执行到满足事先定义好的结束条件时自动结束,还可以让事件具备触发其他事件的功能。
LOVEHINA-AVC - 2006/4/12 22:25:00
指令什么的都无所谓,要让素人也能玩上,最关键的还是那个图形界面编辑器
Prz - 2006/4/13 1:04:00
以下引用LOVEHINA-AVC在2006-4-12 22:25:48的发言:
指令什么的都无所谓,要让素人也能玩上,最关键的还是那个图形界面编辑器


不一定,我觉得自然语言+调试引擎就可以。

比如写一个场景然后就可以立刻运行看看效果...
kkkklll - 2006/4/13 10:10:00
我觉得关键是:能够用什么语句,那语句怎么用,能够清晰地显示出来。
希德船长 - 2006/4/13 12:15:00
以下引用LOVEHINA-AVC在2006-4-12 22:25:48的发言:
指令什么的都无所谓,要让素人也能玩上,最关键的还是那个图形界面编辑器


我也赞成这一观点,只要有了傻瓜型GUI(最好是“所见即所得”的),指令什么样都无所谓了。
Prz - 2006/4/13 14:07:00
恩,这个GUI列为第二期工程,首先把功能作出来后再来完善。
1
查看完整版本: MM GAL 企划中,欢迎大家提建议(禁水)