魔兽争霸编辑器教程3编辑器触发问题

魔兽争霸3地图编辑器--jass和触发器之间的关系【昆哥】—游戏—视频高清在线观看-优酷
同步各端记录
下载PC客户端,上传视频更轻松!
药品服务许可证(京)-经营-
请使用者仔细阅读优酷、、
Copyright(C)2017 优酷 youku.com 版权所有
不良信息举报电话:
魔兽争霸3地图编辑器--jass和触发器之间的关系【昆哥】
魔兽争霸3地图编辑器--jass和触发器之间的关系【昆哥】—在线播放—《魔兽争霸3地图编辑器--jass和触发器之间的关系【昆哥】》—游戏—优酷网,视频高清在线观看
微信/手机 扫码分享
点击一下 网页分享
<input id="link4" type="text" class="fn-share-input" value="" data-spm-anchor-id="0.0.0.i1" />
复制通用代码
<input type="text" class="fn-share-input" id="link3" value="" />
复制Html代码
复制Flash代码
抱歉!因版权原因无法下载
创意先锋 第9集
用优酷移动APP扫码
或用微信扫码观看
二维码2小时有效
没有客户端?扫码马上安装
IPHONE / 安卓
创意先锋 第9集
使用HTML5播放器
使用FLASH播放器您的位置:
& 魔兽争霸3地图编辑器触发器汉化补丁
魔兽争霸3地图编辑器触发器汉化补丁
软件大小:498.47 KB (510438 字节)
软件类别:编程工具&-&#62&补丁制作
软件授权:免费软件&&&&&&软件语言:简体中文
更新时间:
软件厂商:未知
软件官网:未知
应用平台:WinAll
魔兽争霸3地图编辑器触发器汉化补丁
官方版是由/fileview_576021.html上传到126下载网,供大家免费下载。
魔兽争霸3地图编辑器触发器汉化补丁
高速下载器地址
其他下载地址
12345678910为何我的魔兽争霸3冰封王座编辑器里有一个地图打不开,是我自己编的.
按时间排序
地图打不开 有2种情况1地图保存的时候出错 且非正常关闭WE2WE 支持的UI 不兼容 建议用YDWE 试试
你好,请确认魔兽版本,有些地图是需要高等级版本才能打开的。比如:DOTA6.61以前用1.20就能打开,但过了6.61就需要更新魔兽版本才行。望采纳
丛林巨魔重生
四个种族选一个
和你说的一样
嗯,是你的版本问题,可以请问下,你用的是多少版的么?
魔兽版本太低的去uuu9下个魔兽版本转换器,然后把魔兽转成124e的就行
没有办法,因为地图编辑时必须有农民和主城,但农民可以取消。就像澄海一样
有可能是下载到阉割版魔兽了,去下个正版的吧
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?
请输入私信内容:这个人懒死了。。。emmmmm,算了,懒死得了投稿:12粉丝:88分享--dynmicweibozoneqqbaidu将视频贴到博客或论坛视频地址复制嵌入代码复制微信扫一扫分享收藏0硬币--稍后看马克一下~用手机看转移阵地~用或其他应用扫描二维码手机下视频请使用扫码若未安装客户端,可直接扫此码下载应用看过该视频的还喜欢正在加载...miniOFF| &#12288;
| &#12288;
| &#12288;
| &#12288;
| &#12288;
只需一步,快速开始
查看: 7037|回复: 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}

我要回帖

更多关于 魔兽争霸3触发编辑器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信