YDWE咸鱼编辑器最新版版

|  
|  
|  
|  
|  
只需一步,快速开始
查看: 6784|回复: 0
【魔兽地图编辑器】【CJass教程】YDWE版 By Warft_TigerCN 『必须要有YDWE』
主题帖子积分
大家叫我奶茶0.0
【写在前面的话】
────────────────────────────────────────
Cj中有很多非常好的语法,不用实在是可惜了,所以我拿出来和大家一起分享。如果使用YDWE,必须是1.18以及以后的版本才可以,使用之前请先到YDWE的配置程序里把cjass启用。Cj是对Vj的扩展,所以,二者可以混合使用。但不能在zinc中使用Cj语法。接下来我将用自身心得去描述该语言。────────────────────────────────────────
Cj的语法不多,但都是很实用的语法,对于有C语言基础的朋友来说,是很容易掌握的。Cj的语法我总结了下,大致有如下11个方面。
1、#include &path.j& — 包含头文件语法
这个语法相信C语言的忠实读者是绝对不陌生的,它的作用是包含一个后缀名为j(jass文本文件的缩写)的文件的所有内容。相当于Vj里的//! import path.j语法,他们的作用都是外导文件,或者叫导入汇外文件。因此,其语法如下:#include &文件路径名\...\文件名.j&众所周知这是相对路径,而且每次必须将头文件包含在相同文件下,比较麻烦,推荐的做法是将编辑好的头文件放在Cjass启动目录下的lib文件夹下。比如,我编辑了一个名为cj_math.j的文件,jassnewgenpack安装在D盘主目录下,则该文件必须存放在D:\jassnewgenpack\AdicHelper\lib目录下。打开编辑器,在代码框任意位置输入#include &cj_math.j&,就可以使用事先在该文件内写好的代码。当然,Cjass的作者事先已经写好了一些头文件,主要的有cj_types和cj_print;以及本人所编辑的常用的头文件,例如cj_branch、cj_function、cj_timerutils、cj_xebasic和cj_xefx等。由于其内容主要是迎合C++的部分语法,因此这些头文件保持不变即可。
2、函数隐匿关键字、不确定行以及局域变量自由声明
①、jass中函数的关键字无非是set和call,意即书写时可以省略这2个关键字,return是无论如何不能缺省的。如下例:function Test takes nothing returns integer
& && &unit u = GetTriggerUnit()
& && &BJDebugMsg(GetUnitName(u))
& && &return GetHandleId(u)
endfunction复制代码②、所谓不确定行功能是指原本属于多行的语句可以并在一行,必须用“;”隔开,如下例:function Test takes nothing returns nothing
& && &unit u = GetTriggerUnit(); BJDebugMsg(GetUnitName(u)); u = null
endfunction复制代码③、局域变量自由声明与全局变量自由声明遥相呼应,是指局域变量在一个函数体内可以不必出在最前端,位置可以是任意的,如下例:function Test takes nothing returns nothing
& && &BJDebugMsg(GetUnitName(u))
& && &unit u = GetTriggerUnit()
& && &set u = null
endfunction复制代码编译后会自动将这些局域变量置于函数体内的首端,如下:function Test takes nothing returns nothing
& && &local unit u
& && &set u = GetTriggerUnit()
& && &call BJDebugMsg(GetUnitName(u))
& && &set u = null
endfunction复制代码值得注意的是,全局变量声明所需要的globals~endglobals也可以省略不写,写在任何函数的外面即全局变量。
3、#define — 宏定义
这是Cj中最强大的语法之一,为什么这么说呢,过去在我的Vj教程里提到过函数内联,它的作用就
类似于宏,不过要比宏的功能要弱得多。
I、函数内联
①、常函数定式,此种函数在Vj编译器下会将所有名为Hero()的名字替换成'Hamg',其优点是:用一个有意义的标识符来代替一个字符串,便于记忆,易于修改,提高程序的可读性和可移植性。假如我要修改'Hamg'(大法师)为'Hmkg'(山丘之王),那么按普通方式,就需要替换所有的'Hamg',不但修改麻烦,也不利于辨识。最好的方法是利用函数内联将函数Hero里的'Hamg'直接替换为'Hmkg'。constant function Hero takes nothing returns integer
& && &return 'Hamg'
endfunction复制代码②、常函数变式,这是针对往往按一定规律排列的数而产生的,如下所示:constant function Level takes unit u returns integer
& && &return GetHeroLevel(u) * 2
endfunction
function Test takes nothing returns nothing
& && &local unit u = CreateUnit(Player(0),'Hamg',0,0,0)
& && &local integer i = Level(u)
& && &//上行编译后结果如下:local integer i = GetHeroLevel(u) * 2
& && &set u = null
endfunction复制代码可以想见,当我们用变式来解决诸如由技能、单位等级带来的每等级所代表的伤害、等级数值、范围、长度、位移等有规律的数字组时,是极其的直观于方便。
II、全局常量
函数内联需要写一个完整的函数,比较麻烦,至少增加了书写的代码量,因此,全局常量逐渐取代了函数内联的定式的形式,如下例:globals
& && &constant integer SpellId = 'AHtb'
& && &constant integer HeroId&&= 'Hamg'
endglobals复制代码然而,全局常量不能被删除,而且占据内存较大,大量的声明全局常量不是明智之举,况且对于一些只用几次的函数,这样做太过于浪费。宏的出现将该问题迎刃而解。
III、功能丰富的宏定义[/b]①、宏的声明
#define 宏名 = 字符串
比如#define TigerCN = &I`m a chinese!&function Test takes nothing returns nothing
& && &call BJDebugMsg(TigerCN)
endfunction复制代码要知道,宏定义仅仅是替换文本,所以最终的结果是被替换的文本被执行,如此一来,不知道可以节约多少全局变量,而且定义自由度高。需要注意的是,宏不能像变量那样最终被解释,也就是说它不能做任何的运算。如下例:
#define IntA = 5
#define IntB = IntA + 3
这是不可以的,因为很明显这样做是将IntA作为一个变量来使用的,事实上却不是,因此编译
器报错在所难免。多个宏的声明既可以写多个#define,也可以用一对{}号来表示,内部允许
存在扩展的{}。如下:#define {
& & China = &Great&
& & TigerCN = GetTriggerUnit()
& & Warft = CreateItem('itic', 0, 0)
& & Hello = {
& && && && && && &&&BJDebugMsg(&Hello, TigerCN!&)
& && && && && && &&&BJDebugMsg(&Hello, China!&)
& && && && && &}
}复制代码②、宏的更换
假如我不打算让宏名China等价于&Great&,而想让他等价于&God&,则可以在适当位置使用#setdef 宏名 = 新字符串。如#setdef China = &God&。
③、宏的撤销
要撤销一个宏就是希望它不再发生任何替换作用,可以使用#undef 宏名的语法,如#undef China,此时China不代表任何字符串。
④、带参数的宏定义
声明格式很简单,与①一样,只不过多了一对括号而已,如下所示:
#define NewUnit(id,x,y) = CreateUnit(Player(0),id,x,y,0)
⑤、利用带参数的宏实现函数重载
需要注意一点,宏定义时参数列表内的项数不应当相同,在使用的时候,编译器会自动找寻匹
配的字符串,并进行合适的替换。#define {
& && &&new obj&(id) = CreateUnit(Player(0),id,0,0,0)
& && &&new obj&(x,y) = CreateUnit(Player(0),id,x,y,0)
& && &&new obj&(x,y,f) = CreateUnit(Player(0),'hpea',x,y,f)
& && &&new obj&(id,x,y,f) = CreateUnit(Player(0),id,x,y,f)
& && &&new obj&(p,id,x,y,f) = CreateUnit(p,id,x,y,f)
}
function Test takes nothing returns nothing
& && &local unit u
& && &set u = new obj('hpea')
& && &set u = new obj(100,200)
& && &set u = new obj(100,200,270)
& && &set u = new obj('hpea',100,200,270)
& && &set u = new obj(Player(0),'hpea',100,200,270)
endfunction复制代码⑥、实现类似文本宏的指定文本替换
有时候,我不需要替换所有的文本,只需要替换文本中指定的几处位置,以达到简化代码的作用。则可以使用##语法,如下:#define RegisterFunc(name,type) = {
& && &function I2##name takes integer returns ##type
& && && && &&&return i
& && && && &&&return null
& && &endfunction
}
RegisterFunc(U,unit)
RegisterFunc(T,timer)
RegisterFunc(G,trigger)复制代码编译后如下:function I2U takes integer returns unit
& && &return i
& && &return null
endfunction
function I2T takes integer returns timer
& && &return i
& && &return null
endfunction
function I2G takes integer returns trigger
& && &return i
& && &return null
endfunction复制代码⑥、表示性宏定义
此类宏定义往往是按序扩展性宏定义,以时间、数量、编译模式与否、函数名以及魔兽版本为依托,进行加注解释。
DATE - 返回一个以当前时间格式为“年.月.日”为标注的值
TIME - 返回一个以当前时间格式为“时.分.秒”为标注的值
COUNTER - 返回一个以0为首项,公差为1的等差数列为标注的值
DEBUG - 如果是调试模式,则返回值为1;否则为0
FUNCNAME - 返回当前函数的名字
WAR3VER - 返回当前魔兽版本,需要在Cjass插件中选择1.23还是1.24+。例1:
#define unique_name = func_##COUNTER
void unique_name () {} // void func_0 () {}
void unique_name () {} // void func_1 () {}
void unique_name () {} // void func_2 () {}
#define H2I(h) = GetHandleId(h)
#if WAR3VER == WAR3VER_23
& & #undef H2I
& & integer H2I (handle h) { return return 0 }
⑦、宏用于钩子功能(该功能懒得说了,还不如直接使用Vj的hook功能)
3、条件编译
一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件
下才进行编译,即对一部分内容指定编译条件,这就是“条件编译”。条件编译状态下只能使用
“!=”和“==”操作符,其语法格式如下:
& & 执行语句1
#elseif 条件2
& & 执行语句2
#elseif 条件3
& & 执行语句3
& & 执行语句N-1
#else 条件N
& & 执行语句N
4、函数格式
相信很多学习过C语言的朋友对如下代码不陌生:
void main() {
& & printf(&Hello,world!& );
很幸运的是,Cj中也实现了这个功能,其语法格式和C语言如出一辙:
返回值类型 函数名(参数列表) {
& & 执行语句
& & return 返回值
Vjass作者变更了4个类型(要使用这4种类型,必须包含头文件cj_types.j),并且实现了高亮,
分别是如下几个变量:
& && &&&int& & = integer
& && &&&float = real
& && & bool = boolean
& && &&&void = nothing
因此,之前那个C语言的代码可以用Cj书写,这样能以空间换时间,大大减少了书写时间,形象
直观,也更贴切C语言。当然,关于此处的printf函数,可以不必用宏定义,可以参考和使用我
写的模拟C语言格式输出函数的模板。#define printf = BJDebugMsg
library Program initializer Main {
& &&&
& && &private void Main() {
& && && && &printf(&Hello,world!&);
& && &}
}复制代码好了,一个C语言风格的Hello,world!程序就此写好了。
5、自增自减运算符
在Zinc里,Vexorian已经向我们提供了+=、-=、*=、/=操作符,但是这还不够,Cj的作者ADOLF不仅提供了这些操作符,还提供了++、--运算符。先看一个函数:void test() {
& && &int i = 1, j = 1, a,
& && &a = i ++; // i ++是先执行当前命令,再执行递增
& && &b = ++ // ++ j是先递增,再执行命令
& && &printf(I2S(a)); // a的结果为1
& && &printf(I2S(b)); // b的结果为2
}复制代码再看一个双目运算符和单目运算符混合的例子:void test() {
& && &int a = 7;
& && &int b = ++a; // a的结果为8,b亦即等于8
& && &int c = a + b --; // a的结果为8,b亦即等于7,c为16
}复制代码自增自减可以结合数组巧妙使用:void test() {
& && &int i = 0, index [];
& && &while(i & 7) {
& && && && &index[i ++] = i
& && &}
}复制代码6、换行符
符号为“\”,可以用其截取一行完整的语句,但不影响该语句的运行。类似于/**/。如下例:
void test() {
& & unit u = CreateUnit(Player(0),\
& && && && && && && && &'hpea',& && && && &\
& && && && && && && && &100,& && && && && &\
& && && && && && && && &200,& && && && && &\
& && && && && && && && &270);
}复制代码等价于void test() {
& & unit u = CreateUnit(Player(0),'hpea',100,200,270);
}复制代码7、flush locals功能
这个功能主要是用于自动清空需要释放的句柄变量,而不需要我们手动清除。如下所示:
void test() {
& && &unit u, v, w = GetTriggerUnit();
& && &location l, m = GetSpellTargerLoc();
& && &
}复制代码从上面代码可以看出,变量u、v、l尚未被赋值,因此实际上它会自动将w、m设置为空值。
8、lambda表达式
类似于zinc里的闭包功能,不过要更强悍的多,因为它的返回值没有限定。格式为lambda
返回值类型() {}使用非常简单,如下例:library Program initializer Main {
& && &
& && &private void Main() {
& && && && &timer t =
& && && && &TimerStart(t, 1, true, lambda void() {
& && && && && && &printf(&hello,world!&);
& && && && &});
& && && && &flush locals
& && &}
}复制代码9、#for循环
这种for循环不同于zinc里的for循环,更多的,它像是一种以步长为1,之需要确定起始值和
终结值的循环。需要注意的是:变量名无需自己设定,该循环的创建就意味着该变量的声明。
其语法格式为:
#for 自增变量名 (起始值,终结值)
& && &执行语句
#endforvoid test() {
& && &int index [];
& && &#for i (0, 9)
& && && &&&index[i ++] =
& && &#endfor
}复制代码10、#repeat循环
该循环很简单,其目的是重复执行一段代码,其语法为:
#repeat 循环次数
& & 执行语句
#endrepeatvoid test() {
& && &#repeat 2
& && && &&&BJDebugMsg(&Hello,world!&);
& && &#endrepeat
}复制代码编译后:function test takes nothing returns nothing
& && &call BJDebugMsg(&Hello,world!&)
& && &call BJDebugMsg(&Hello,world!&)
endfunction复制代码11、#while()和do...while()循环
这种循环体在我的Vj教程里已经阐述过,故此处不予赘述。12.枚举变量 — enum
遗漏掉了枚举类型enum。其语法是:
enum {枚举类型名1,枚举类型名2,...枚举类型名N} 或者
enum (枚举名) {枚举类型名1,枚举类型名2,...枚举类型名N}
举例如下(直接复制以下代码到空地图即可测试):
#include &cj_types.j&
#define &Console.WriteLine& = BJDebugMsg
library Program initializer Main {
& && &enum (Data) {Monday,Tuesday,Wednesday,Thursday,
& && && && && && && && && &&&Friday,Saturday,Sunday}
& && &private void Main() {
& && && && &
& && && && & if (data = Monday) {
& && && && && && &Console.WriteLine(&Today is Monday!& );
& && && && & }
& && && && & elseif (data = Friday) {
& && && && && && &Console.WriteLine(&Today is Friday!&);
& && && && & }
& && &}
}& && &复制代码枚举变量还可以用作函数参数:enum (Color) {Red,Green,Blue}
void Main(Color c) {
& && &if (c = Red) {
& && && & Console.WriteLine(&Red!&);
& && &}
& && &elseif (c = Blue) {
& && && & Console.WriteLine(&Blue!&);
& && &}
}复制代码
Powered by投稿:1粉丝:8分享--dynmicweibozoneqqbaidu将视频贴到博客或论坛视频地址复制嵌入代码复制微信扫一扫分享收藏0硬币--稍后看马克一下~用手机看转移阵地~用或其他应用扫描二维码手机下视频请使用扫码若未安装客户端,可直接扫此码下载应用看过该视频的还喜欢正在加载...miniOFF后使用快捷导航没有帐号?
查看: 3540|回复: 28
【暴雪API】一些简单的演示图与YDWE编辑器(持续更新)
主题帖子积分
本帖最后由 凤凰院凶真 于
15:27 编辑
##演示图使用的编辑器(已更新0.2版本)
使用其它编辑器不保证兼容性
无法运行演示地图请先确定魔兽是否为1.27版本
密码:28pc
##创建自定义UI的演示图
(32.79 KB, 下载次数: 527)
15:44 上传
点击文件名下载附件
##键鼠应用 TPS镜头控制 3D弹幕射击的演示图
(196.01 KB, 下载次数: 284)
10:24 上传
点击文件名下载附件
##BOSS血条的演示图
(35.87 KB, 下载次数: 382)
13:02 上传
点击文件名下载附件
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
看了演示,使用的是你们内置的按钮?那么怎么才能像内置JAPI那样画自己的面板呢
主题帖子积分
注册会员, 积分 56, 距离下一级还需 144 积分
注册会员, 积分 56, 距离下一级还需 144 积分
fdf 是个什么格式?用什么软件能打开?
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
local integer text = DzFrameFindByName(&ButtonText&,0)
set frame = DzCreateFrame(&TestButton&,gameUI,0)
call DzFrameSetScript(frame,1,&Press&,false)
&ButtonText&& &&TestButton&&&&Press&&&都是设定好的么???不清楚到底什么联系?
找暴雪自己的fdf看,在UI/FrameDef里&
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
而且`这个 UI 使用 载入的 &模型&``````是要怎么制作
主题帖子积分
注册会员, 积分 56, 距离下一级还需 144 积分
注册会员, 积分 56, 距离下一级还需 144 积分
发现一个不知道算不算是问题的bug
DzFrameSetScript(FrameId,4,FunName,false);
也就是UI鼠标点击事件回调,正常是可以用,但点了小退游戏后就会弹出错误窗口,关闭魔兽
不知道是不是只有我有这问题。。。
主题帖子积分
注册会员, 积分 108, 距离下一级还需 92 积分
注册会员, 积分 108, 距离下一级还需 92 积分
发现一个不知道算不算是问题的bug
DzFrameSetScript(FrameId,4,FunName,false);
也就是UI鼠标点击事件回调 ...
都一样&&···············
主题帖子积分
发现一个不知道算不算是问题的bug
DzFrameSetScript(FrameId,4,FunName,false);
也就是UI鼠标点击事件回调 ...
不是这个回调的问题,是同一个自定义UI被创建多次就会这样
解决方法是用另一个TAG的创建函数,这个函数的缺点是:创建的子控件无法被FindByName函数查找到,意味着你的所有子控件不能在fdf中写好,只能单个创建时设置层级关系,但是就不会有退出时报错的问题了
主题帖子积分
注册会员, 积分 56, 距离下一级还需 144 积分
注册会员, 积分 56, 距离下一级还需 144 积分
都一样&&···············
额,心态突然平衡了,谢谢
主题帖子积分
注册会员, 积分 56, 距离下一级还需 144 积分
注册会员, 积分 56, 距离下一级还需 144 积分
不是这个回调的问题,是同一个自定义UI被创建多次就会这样
解决方法是用另一个TAG的创建函数,这个函数的 ...
我先择接受QWQ
主题帖子积分
新手上路, 积分 8, 距离下一级还需 42 积分
新手上路, 积分 8, 距离下一级还需 42 积分
这个鼠标捕捉是调用操作系统底层代码实现的?切出游戏后会将鼠标一直重置在桌面中心位置。 这个体验太差了,望修复!!!
自己仔细看native函数,可以判断鼠标是否在游戏内&
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
(wj1198) && err,ptr is null
wj1198&&wj656 wj360 是什么错误??
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
Frame &BACKDROP& &1& {
& & Width 0.07,
& & Height 0.03,
& & BackdropBackground &ABC.blp&,
& & BackdropBlendAll,
& & & & Frame &GLUETEXTBUTTON& &2& INHERITS WITHCHILDREN &BlankButtonTemplate& {
& & & && &&&Width 0.07,
& && &&&Height 0.03,
& & & & & & & & SetAllPoints,
为什么! 1 能创建出来! 2 锚点附在 1 上,问题创建2 后注册鼠标点击事件,但是2却没有响应~~大佬这是为什么?
主题帖子积分
注册会员, 积分 184, 距离下一级还需 16 积分
注册会员, 积分 184, 距离下一级还需 16 积分
Frame &BACKDROP& &1& {
& & Width 0.07,
& & Height 0.03,
格式不对,应该是:
Frame &BACKDROP& &1& {
& & Width 0.07,
& & Height 0.03,
& & BackdropBackground &ABC.blp&,
& & BackdropBlendAll,
& & Frame &GLUETEXTBUTTON& &2& INHERITS WITHCHILDREN &BlankButtonTemplate& {
& && &&&Width 0.07,
& && &&&Height 0.03,
& && &&&SetAllPoints,
2是1的子集,必须先创建1后,用函数(DzFrameFindByName)获取2
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
格式不对,应该是:
Frame &BACKDROP& &1& {
& & Width 0.07,
还是不行!`````
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
//FDF 的设置
IncludeFile &UI\FrameDef\Glue\BattleNetTemplates.fdf&,
IncludeFile &UI\FrameDef\Glue\StandardTemplates.fdf&,
Frame &GLUETEXTBUTTON& &TestButton& INHERITS WITHCHILDREN &BattleNetButtonTemplate& {
& & Width 0.07,
& & Height 0.03,
& & ButtonText &ButtonText&,
& & Frame &TEXT& &ButtonText& INHERITS &BattleNetButtonTextTemplate& {
& && &&&Text &点我&,
//创建按钮
Frame &BACKDROP& &1& {
& & Width 0.07,
& & Height 0.03,
& & BackdropBackground &ABC.blp&,
& & BackdropBlendAll,
& & Frame &GLUETEXTBUTTON& &2& INHERITS WITHCHILDREN &BlankButtonTemplate& {
& && &&&SetAllPoints,
//================触发
function Press takes nothing returns nothing
& & //获取被点击的按钮(直接取鼠标指向的frame)
& & local integer frame = DzGetMouseFocus()
& & //获取这个按钮的文本组件
& & local integer text = DzFrameFindByName(&ButtonText&,0)
& & //点击次数累加
& & set ClickTimes = ClickTimes + 1
& & //修改这个组件的文本
& & call DzFrameSetText(text,&点我(&+I2S(ClickTimes)+&)&)
& & call BJDebugMsg( I2S(frame)&&)
endfunction
function InitUI takes nothing returns nothing
& & local integer frame
& & local integer gameUI = DzGetGameUI()
& & local integer mallEntranceId = DzCreateFrame(&1&, gameUI ,0) // 开始创建
& & local integer mallEntranceButtonId = DzFrameFindByName(&2& , 0)
& & call DzFrameSetTexture(mallEntranceId, &ReplaceableTextures\\CommandButtons\\BTNCancel.blp&, 0)//给按钮设置图标
& & call DzFrameSetPoint( mallEntranceId , 4, gameUI, 4, 0.08, -0.03)
& & call DzFrameSetSize(mallEntranceId, 0.04, 0.04)
& & //设置回调事件,当鼠标点击时执行。注意:按钮才可响应事件
& & call DzFrameSetScript(mallEntranceButtonId, 1, &Press&, false)
& & //隐藏界面
& & //call DzFrameHideInterface()
& & //隐藏黑边
& & //call DzFrameEditBlackBorders(0,0)
& & //载入自己的fdf列表文件
& & call DzLoadToc(&UI\\XX_UI_2.toc&)
& & //从fdf模版中创建按钮
& & set frame = DzCreateFrame(&TestButton&,gameUI,0)
& & //显示0表示没创建成功
& & call BJDebugMsg(I2S(frame)+&/&+I2S(mallEntranceId)+&/&+I2S(mallEntranceButtonId) )
& & //将按钮移动至屏幕中央
& & call DzFrameSetPoint(frame,4,gameUI,4,0,0)
& & //给按钮注册点击事件(异步的)
& & call DzFrameSetScript(frame,1,&Press&,false)
endfunction
一个是演示的直接设置成按钮类的 是可以触发事件的!我写的这个 能改变按钮的图标 ,能从&1&中读取子集&2& 但是2却不能注册事件或者说没有响应鼠标事件!!!到底是哪里错了
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
=============FDF
IncludeFile &UI\FrameDef\Glue\BattleNetTemplates.fdf&,
IncludeFile &UI\FrameDef\Glue\StandardTemplates.fdf&,
Frame &GLUETEXTBUTTON& &TestButton& INHERITS WITHCHILDREN &BattleNetButtonTemplate& {
& & Width 0.07,
& & Height 0.03,
& & ButtonText &ButtonText&,
& & Frame &TEXT& &ButtonText& INHERITS &BattleNetButtonTextTemplate& {
& && &&&Text &点我&,
//创建按钮
Frame &BACKDROP& &1& {
& & Width 0.07,
& & Height 0.03,
& & BackdropBackground &ABC.blp&,
& & BackdropBlendAll,
& & Frame &GLUETEXTBUTTON& &2& INHERITS WITHCHILDREN &BlankButtonTemplate& {
& && &&&SetAllPoints,
=============触发
function Press takes nothing returns nothing
& & //获取被点击的按钮(直接取鼠标指向的frame)
& & local integer frame = DzGetMouseFocus()
& & //获取这个按钮的文本组件
& & local integer text = DzFrameFindByName(&ButtonText&,0)
& & //点击次数累加
& & set ClickTimes = ClickTimes + 1
& & //修改这个组件的文本
& & call DzFrameSetText(text,&点我(&+I2S(ClickTimes)+&)&)
& & call BJDebugMsg( I2S(frame)&&)
endfunction
function InitUI takes nothing returns nothing
& & local integer frame
& & local integer gameUI = DzGetGameUI()
& & local integer mallEntranceId = DzCreateFrame(&1&, gameUI ,0) // 开始创建
& & local integer mallEntranceButtonId = DzFrameFindByName(&2& , 0)
& & call DzFrameSetTexture(mallEntranceId, &ReplaceableTextures\\CommandButtons\\BTNCancel.blp&, 0)//给按钮设置图标
& & call DzFrameSetPoint( mallEntranceId , 4, gameUI, 4, 0.08, -0.03)
& & call DzFrameSetSize(mallEntranceId, 0.04, 0.04)
& & //设置回调事件,当鼠标点击时执行。注意:按钮才可响应事件
& & call DzFrameSetScript(mallEntranceButtonId, 1, &Press&, false)
& & //隐藏界面
& & //call DzFrameHideInterface()
& & //隐藏黑边
& & //call DzFrameEditBlackBorders(0,0)
& & //载入自己的fdf列表文件
& & call DzLoadToc(&UI\\XX_UI_2.toc&)
& & //从fdf模版中创建按钮
& & set frame = DzCreateFrame(&TestButton&,gameUI,0)
& & //显示0表示没创建成功
& & call BJDebugMsg(I2S(frame)+&/&+I2S(mallEntranceId)+&/&+I2S(mallEntranceButtonId) )
& & //将按钮移动至屏幕中央
& & call DzFrameSetPoint(frame,4,gameUI,4,0,0)
& & //给按钮注册点击事件(异步的)
& & call DzFrameSetScript(frame,1,&Press&,false)
endfunction
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
IncludeFile &UI\FrameDef\Glue\BattleNetTemplates.fdf&,
IncludeFile &UI\FrameDef\Glue\StandardTemplates.fdf&,
Frame &GLUETEXTBUTTON& &TestButton& INHERITS WITHCHILDREN &BattleNetButtonTemplate& {
& & Width 0.07,
& & Height 0.03,
& & ButtonText &ButtonText&,
& & Frame &TEXT& &ButtonText& INHERITS &BattleNetButtonTextTemplate& {
& && &&&Text &点我&,
//创建按钮
Frame &BACKDROP& &1& {
& & Width 0.07,
& & Height 0.03,
& & BackdropBackground &ABC.blp&,
& & BackdropBlendAll,
& & Frame &GLUETEXTBUTTON& &2& INHERITS WITHCHILDREN &BlankButtonTemplate& {
& && &&&SetAllPoints,
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
function Press takes nothing returns nothing
& & //获取被点击的按钮(直接取鼠标指向的frame)
& & local integer frame = DzGetMouseFocus()
& & //获取这个按钮的文本组件
& & local integer text = DzFrameFindByName(&ButtonText&,0)
& & //点击次数累加
& & set ClickTimes = ClickTimes + 1
& & //修改这个组件的文本
& & call DzFrameSetText(text,&点我(&+I2S(ClickTimes)+&)&)
& & call BJDebugMsg( I2S(frame)&&)
endfunction
function InitUI takes nothing returns nothing
& & local integer frame
& & local integer gameUI = DzGetGameUI()
& & local integer EntranceId = DzCreateFrame(&1&, gameUI ,0) // 开始创建
& & local integer EntranceButtonId = DzFrameFindByName(&2& , 0)
& & call DzFrameSetTexture(EntranceId, &ReplaceableTextures\\CommandButtons\\BTNCancel.blp&, 0)//给按钮设置图标
& & call DzFrameSetPoint( EntranceId , 4, gameUI, 4, 0.08, -0.03)
& & call DzFrameSetSize(EntranceId, 0.04, 0.04)
& & //设置回调事件,当鼠标点击时执行。注意:按钮才可响应事件
& & call DzFrameSetScript(EntranceButtonId, 1, &Press&, false)
& & //隐藏界面
& & //call DzFrameHideInterface()
& & //隐藏黑边
& & //call DzFrameEditBlackBorders(0,0)
& & //载入自己的fdf列表文件
& & call DzLoadToc(&UI\\XX_UI_2.toc&)
& & //从fdf模版中创建按钮
& & set frame = DzCreateFrame(&TestButton&,gameUI,0)
& & //显示0表示没创建成功
& & call BJDebugMsg(I2S(frame)+&/&+I2S(EntranceId)+&/&+I2S(EntranceButtonId) )
& & //将按钮移动至屏幕中央
& & call DzFrameSetPoint(frame,4,gameUI,4,0,0)
& & //给按钮注册点击事件(异步的)
& & call DzFrameSetScript(frame,1,&Press&,false)
endfunction
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
function Press takes nothing returns nothing
& & //获取被点击的按钮(直接取鼠标指向的frame)
& & local integer frame = DzGetMouseFocus()
& & //获取这个按钮的文本组件
& & local integer text = DzFrameFindByName(&ButtonText&,0)
& & //点击次数累加
& & set ClickTimes = ClickTimes + 1
& & //修改这个组件的文本
& & call DzFrameSetText(text,&点我(&+I2S(ClickTimes)+&)&)
& & call BJDebugMsg( I2S(frame)&&)
endfunction
function InitUI takes nothing returns nothing
& & local integer frame
& & local integer gameUI = DzGetGameUI()
& & local integer EntranceId = DzCreateFrame(&1&, gameUI ,0) // 开始创建
& & local integer EntranceButtonId = DzFrameFindByName(&2& , 0)
& & call DzFrameSetTexture(EntranceId, &ReplaceableTextures\\CommandButtons\\BTNCancel.blp&, 0)//给按钮设置图标
& & call DzFrameSetPoint( EntranceId , 4, gameUI, 4, 0.08, -0.03)
& & call DzFrameSetSize(EntranceId, 0.04, 0.04)
& & //设置回调事件,当鼠标点击时执行。注意:按钮才可响应事件
& & call DzFrameSetScript(EntranceButtonId, 1, &Press&, false)
& & //隐藏界面
& & //call DzFrameHideInterface()
& & //隐藏黑边
& & //call DzFrameEditBlackBorders(0,0)
& & //载入自己的fdf列表文件
& & call DzLoadToc(&UI\\XX_UI_2.toc&)
& & //从fdf模版中创建按钮
& & set frame = DzCreateFrame(&TestButton&,gameUI,0)
& & //显示0表示没创建成功
& & call BJDebugMsg(I2S(frame)+&/&+I2S(EntranceId)+&/&+I2S(EntranceButtonId) )
& & //将按钮移动至屏幕中央
& & call DzFrameSetPoint(frame,4,gameUI,4,0,0)
& & //给按钮注册点击事件(异步的)
& & call DzFrameSetScript(frame,1,&Press&,false)
endfunction
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
IncludeFile &UI\FrameDef\Glue\BattleNetTemplates.fdf&,
IncludeFile &UI\FrameDef\Glue\StandardTemplat ...
function Press takes nothing returns nothing
& & //获取被点击的按钮(直接取鼠标指向的frame)
& & local integer frame = DzGetMouseFocus()
& & //获取这个按钮的文本组件
& & local integer text = DzFrameFindByName(&ButtonText&,0)
& & //点击次数累加
& & set ClickTimes = ClickTimes + 1
& & //修改这个组件的文本
& & call DzFrameSetText(text,&点我(&+I2S(ClickTimes)+&)&)
& & call BJDebugMsg( I2S(frame)&&)
endfunction
function InitUI takes nothing returns nothing
& & local integer frame
& & local integer gameUI = DzGetGameUI()
& & local integer EntranceId = DzCreateFrame(&1&, gameUI ,0) // 开始创建
& & local integer EntranceButtonId = DzFrameFindByName(&2& , 0)
& & call DzFrameSetTexture(EntranceId, &ReplaceableTextures\\CommandButtons\\BTNCancel.blp&, 0)//给按钮设置图标
& & call DzFrameSetPoint( EntranceId , 4, gameUI, 4, 0.08, -0.03)
& & call DzFrameSetSize(EntranceId, 0.04, 0.04)
& & //设置回调事件,当鼠标点击时执行。注意:按钮才可响应事件
& & call DzFrameSetScript(EntranceButtonId, 1, &Press&, false)
& & //隐藏界面
& & //call DzFrameHideInterface()
& & //隐藏黑边
& & //call DzFrameEditBlackBorders(0,0)
& & //载入自己的fdf列表文件
& & call DzLoadToc(&UI\\XX_UI_2.toc&)
& & //从fdf模版中创建按钮
& & set frame = DzCreateFrame(&TestButton&,gameUI,0)
& & //显示0表示没创建成功
& & call BJDebugMsg(I2S(frame)+&/&+I2S(EntranceId)+&/&+I2S(EntranceButtonId) )
& & //将按钮移动至屏幕中央
& & call DzFrameSetPoint(frame,4,gameUI,4,0,0)
& & //给按钮注册点击事件(异步的)
& & call DzFrameSetScript(frame,1,&Press&,false)
endfunctionfunction Press takes nothing returns nothing
& & //获取被点击的按钮(直接取鼠标指向的frame)
& & local integer frame = DzGetMouseFocus()
& & //获取这个按钮的文本组件
& & local integer text = DzFrameFindByName(&ButtonText&,0)
& & //点击次数累加
& & set ClickTimes = ClickTimes + 1
& & //修改这个组件的文本
& & call DzFrameSetText(text,&点我(&+I2S(ClickTimes)+&)&)
& & call BJDebugMsg( I2S(frame)&&)
endfunction
function InitUI takes nothing returns nothing
& & local integer frame
& & local integer gameUI = DzGetGameUI()
& & local integer EntranceId = DzCreateFrame(&1&, gameUI ,0) // 开始创建
& & local integer EntranceButtonId = DzFrameFindByName(&2& , 0)
& & call DzFrameSetTexture(EntranceId, &ReplaceableTextures\\CommandButtons\\BTNCancel.blp&, 0)//给按钮设置图标
& & call DzFrameSetPoint( EntranceId , 4, gameUI, 4, 0.08, -0.03)
& & call DzFrameSetSize(EntranceId, 0.04, 0.04)
& & //设置回调事件,当鼠标点击时执行。注意:按钮才可响应事件
& & call DzFrameSetScript(EntranceButtonId, 1, &Press&, false)
& & //隐藏界面
& & //call DzFrameHideInterface()
& & //隐藏黑边
& & //call DzFrameEditBlackBorders(0,0)
& & //载入自己的fdf列表文件
& & call DzLoadToc(&UI\\XX_UI_2.toc&)
& & //从fdf模版中创建按钮
& & set frame = DzCreateFrame(&TestButton&,gameUI,0)
& & //显示0表示没创建成功
& & call BJDebugMsg(I2S(frame)+&/&+I2S(EntranceId)+&/&+I2S(EntranceButtonId) )
& & //将按钮移动至屏幕中央
& & call DzFrameSetPoint(frame,4,gameUI,4,0,0)
& & //给按钮注册点击事件(异步的)
& & call DzFrameSetScript(frame,1,&Press&,false)
endfunction复制代码
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
function Press takes nothing returns nothing
& & //获取被点击的按钮(直接取鼠标指向的frame)
& & local integer frame = DzGetMouseFocus()
& & //获取这个按钮的文本组件
& & local integer text = DzFrameFindByName(&ButtonText&,0)
& & //点击次数累加
& & set ClickTimes = ClickTimes + 1
& & //修改这个组件的文本
& & call DzFrameSetText(text,&点我(&+I2S(ClickTimes)+&)&)
& & call BJDebugMsg( I2S(frame)&&)
endfunction
function InitUI takes nothing returns nothing
& & local integer frame
& & local integer gameUI = DzGetGameUI()
& & local integer EntranceId = DzCreateFrame(&1&, gameUI ,0) // 开始创建
& & local integer EntranceButtonId = DzFrameFindByName(&2& , 0)
& & call DzFrameSetTexture(EntranceId, &ReplaceableTextures\\CommandButtons\\BTNCancel.blp&, 0)//给按钮设置图标
& & call DzFrameSetPoint( EntranceId , 4, gameUI, 4, 0.08, -0.03)
& & call DzFrameSetSize(EntranceId, 0.04, 0.04)
& & //设置回调事件,当鼠标点击时执行。注意:按钮才可响应事件
& & call DzFrameSetScript(EntranceButtonId, 1, &Press&, false)
& & //隐藏界面
& & //call DzFrameHideInterface()
& & //隐藏黑边
& & //call DzFrameEditBlackBorders(0,0)
& & //载入自己的fdf列表文件
& & call DzLoadToc(&UI\\XX_UI_2.toc&)
& & //从fdf模版中创建按钮
& & set frame = DzCreateFrame(&TestButton&,gameUI,0)
& & //显示0表示没创建成功
& & call BJDebugMsg(I2S(frame)+&/&+I2S(EntranceId)+&/&+I2S(EntranceButtonId) )
& & //将按钮移动至屏幕中央
& & call DzFrameSetPoint(frame,4,gameUI,4,0,0)
& & //给按钮注册点击事件(异步的)
& & call DzFrameSetScript(frame,1,&Press&,false)
endfunction复制代码
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
IncludeFile &UI\FrameDef\Glue\BattleNetTemplates.fdf&,
IncludeFile &UI\FrameDef\Glue\StandardTemplat ...
创建1 和 2都可以!但是2 不能相应鼠标事件
可能你用的同步UI事件,这个BUG在0.2中修复了&
主题帖子积分
新手上路, 积分 9, 距离下一级还需 41 积分
新手上路, 积分 9, 距离下一级还需 41 积分
请问,今年作者大会,那个演示Demo在哪里可以找到呢?
主题帖子积分
新手上路, 积分 18, 距离下一级还需 32 积分
新手上路, 积分 18, 距离下一级还需 32 积分
不是这个回调的问题,是同一个自定义UI被创建多次就会这样
解决方法是用另一个TAG的创建函数,这个函数的 ...可以多次创建的 只要
native DzCreateFrame takes string frame, integer parent, integer id returns integer 中的
demo 里的 id 重复了
ps:感觉 是api 没维护 缺少校验
主题帖子积分
注册会员, 积分 109, 距离下一级还需 91 积分
注册会员, 积分 109, 距离下一级还需 91 积分
鼠标点击左右键事件,即使调用true为同步,点击后执行动作时也是异步,比如设置物品坐标,物品异步显示,会导致掉线!!!使用了 同步数据的函数,,点击事件发送数据,,,同步事件触发后,动作设置物品坐标,仍然处于异步....这个到底怎么使用/.?
Powered by

我要回帖

更多关于 咸鱼编辑器最新版 的文章

 

随机推荐