魔兽争霸3地图解密器编辑器

|  
|  
|  
|  
|  
只需一步,快速开始
查看: 5620|回复: 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个工作日删除。
游戏都会专业专注于小游戏,为你提供更多更好的在线试玩。
Copyright (C) , All Rights Reserved.魔兽地图编辑器(YDWE)
1.29.1 正式版
下载帮助本站软件均来自互联网, 如有侵犯您的版权, 请与我们联系。
* 为了达到最快的下载速度,推荐使用下载本站软件。
* 请一定升级到最新版才能正常解压本站提供的软件!
* 相关网站事务请留言:
或通知我们!或加我们微信公众号:xz7_cngr
Copyright &
. All Rights Reserved打造安全无毒、好玩的单机游戏下载基地
当前位置:
→ 魔兽争霸3地图编辑器 1.24
魔兽争霸3地图编辑器 1.24
软件大小:3.5 MB
软件语言:英文
软件类型:游戏工具
授权方式:免费软件
更新时间:
下载次数:120
软件标签:
运行环境:WinXP, Win7, WinAll
同类人气软件
魔兽争霸地图编辑器是玩家针对由美国暴雪委托奥美电子在中国发售的一款非常经典的即时战略游戏《魔兽争霸3冰封王座(Warcraft III:The Frozen Throne)》(玩家简称War3或魔兽3)制作的辅助补丁。该魔兽争霸地图编辑器是专为魔兽争霸游戏玩家所准备的必备辅助补丁,玩家可以利用该编辑器修改地图地形,可以查看里面的中文教程,通俗易懂,骨灰级魔兽玩家可以来一发。【使用说明】下载完魔兽地图编辑器,解压缩到魔兽根目录下覆盖原文件即可!无法在war3根目录以外打开
魔兽争霸地图编辑器 1.24
类型: 即时战略
大小: 1.1 GB
语言: 中文
热门游戏工具
6.2 MB/英文/5.9
1.5 MB/英文/7.0
6.0 MB/中文/3.3
12.4 MB/中文/6.0
98.0 KB/中文/7.7
8.5 MB/中文/5.4
489.0 KB/中文/5.0
补丁排名榜
单机游戏排行榜
1 7.8类型: PSP游戏语言: 中文大小: 82.8 MB
2 7.5类型: 赛车游戏语言: 中文大小: 439.6 MB
3 7.4类型: 射击游戏语言: 中文大小: 2.7 GB
4 7.2类型: 模拟经营语言: 中文大小: 34.3 MB
5 7.6类型: 角色扮演语言: 中文大小: 2.0 MB
6 5.5类型: 动作冒险语言: 中文大小: 7.6 MB
7 7.8类型: 角色扮演语言: 中文大小: 297.8 MB
8 7.8类型: 角色扮演语言: 中文大小: 240.3 MB
9 7.0类型: 模拟经营语言: 英文大小: 12.1 MB
10 7.2类型: 射击游戏语言: 中文大小: 414.2 MB
1 7.8类型: PSP游戏语言: 中文大小: 82.8 MB
2 5.5类型: 动作冒险语言: 中文大小: 7.6 MB
3 7.5类型: 赛车游戏语言: 中文大小: 439.6 MB
4 7.2类型: 模拟经营语言: 中文大小: 34.3 MB
5 7.4类型: 射击游戏语言: 中文大小: 2.7 GB
6 7.0类型: 模拟经营语言: 英文大小: 12.1 MB
7 7.6类型: 角色扮演语言: 中文大小: 2.0 MB
8 6.7类型: 休闲益智语言: 中文大小: 233.0 MB
9 8.0类型: 动作街机语言: 英文大小: 31.3 MB
10 7.8类型: 角色扮演语言: 中文大小: 297.8 MB
1 7.8类型: PSP游戏语言: 中文大小: 82.8 MB
2 7.4类型: 射击游戏语言: 中文大小: 2.7 GB
3 7.2类型: 模拟经营语言: 中文大小: 34.3 MB
4 7.2类型: 休闲益智语言: 中文大小: 83.5 MB
5 6.7类型: 休闲益智语言: 中文大小: 233.0 MB
6 7.5类型: 赛车游戏语言: 中文大小: 439.6 MB
7 8.0类型: 即时战略语言: 中文大小: 1.1 GB
8 6.7类型: 动作冒险语言: 中文大小: 1.2 GB
9 7.5类型: 动作冒险语言: 中文大小: 1.4 GB
10 7.8类型: 其他游戏语言: 日文大小: 1.7 GB
◎ 因为单机游戏文件比较大,当游网强烈推荐使用迅雷或QQ旋风下载,下载前建议查看配置要求、游戏说明和网友评论。
◎ 如果游戏无法正常运行,运行的时候出现缺少dll、内存不能读、配置不正确等,请查看,或者直接下载游戏常用运行库安装包。
◎ 提供魔兽争霸3地图编辑器 1.24,保证安全无毒,可能部分杀毒软件存在误报,请大家放心下载,如果怕有危害电脑的,请误下载。
超多下载基地 当游网()
越当越快乐
版权所有 浙ICP备号

我要回帖

更多关于 魔兽争霸4游戏下载 的文章

 

随机推荐