求魔兽地图编辑器战役编辑器如何编辑简单的战役详细教程!

魔兽工具下载
这是一个半成品的全屏装备系统,带仓库和属性界面
坐标基本已全部定位,可以控制最大面板数
这是我的一次排除地图故障的经历。其实严格来说这不算一个故障,但是它的确给地图带来了很大的问题我下面是把思路理清以后再写出来的,
新手教学进阶
模型及教程下载
作者留言交流U9论坛欢迎您,有任何疑问均可以发帖咨询!
看一看U9会员都在讨论什么~
欢迎关注游久网电竞专区。
查看: 31937|回复: 12
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
(一) 本版区域划分
WEER综合区: 有关WE的任何心得,疑问都可以在此区发,建议发在此区,发帖条例见版规
WE教程区: 个人编写的精品连载教程,本帖目录可以直达本区,禁水,版主有权删除误导教程
地图汉化讨论区:有关汉化地图的心得,招募汉化人手等
未加密地图区:发表未加密地图专区,原创并且质量高的地图会重奖并且加精华。未经作者同意视情节处理,详情见版规
成品技能区:发表自己原创或者转载的成品技能,根据质量给予奖励和精华
创意风暴: YY英雄,设计地图情节和技能效果可以发在此区。本区是不会WE但是有创意的玩家的聚集地,也是作者创作瓶颈时可以挖掘灵感的宝库。
地形场景设计:发表原创或者转载地形,根据质量给予奖励和精华
WE程序区:分享原创,转载的对作图有用的程序,根据质量给予奖励和精华
Jass区:有关Jass资料的库存和备份,也可以作为算法资料库,内容可以是代码也可以是附件
(二) 本区版规(本区任何版块发帖视为已读)
1.禁止颠覆国家,违反法律和道德的言论,视情节版主有权禁言处理
2.禁止发表针对人身攻击的言论,版主视情节可以2V扣除10-20,恶劣情节版主有权禁言处理
3.禁止广告,一律删除处理,版主视情节可以2V扣除10-20,恶劣情节版主有权禁言处理
4.禁止进行进行与WE无关的纷争。版主视情节可以2V扣除10-20
5.禁止讨论改图话题,版主视情节可以2V扣除10-20
6.禁止恶意挖坟,期限是1月外帖子,版主视情节可以提醒,恶劣情节2V扣除5-10,如果认为某个教程很有价值或者有疑问,可以联系我或者其他版主加入本置顶帖引索中或者开帖提问
7.禁止无意义盖楼,包括不限于纯表,无意义字符排列。版主视情节可以提醒,恶劣情节2V扣除5-10
8.本区默认汉语为讨论语言,除非转载外国资料,不建议使用外语进行讨论。版主视情节可以提醒,恶劣情节2V扣除1-5
9.禁止在回复中连续播放音乐扰人。版主视情节可以提醒,恶劣情节2V扣除5-10
10.新人拜师请去置顶的回复,重新发帖会被删除
11.此项不做硬性规定,但是希望新手提问的时候能看完本置顶帖中的教程。如果仍然有疑问再去发帖。一味的去寻求别人帮助很难做到水平真正的提高。
12.在这里提出问题并不能保证获得你想要的答案,但一定会被认真的阅读。
(三)福利制度
1. 有价值的帖子版主会进行加分5-20不等,特别出色并且整齐的可以申请精华,精华对于U9首发原创大力支持,转载要求较高,加精制度请见
2. 每月总版主认可的WE区活跃分子发工资,官方QQ群号和详细内容,见
3. 勋章奖励,详情以后见公告
原创教程类会给紫色高亮,转载类会给绿色高亮,精华类会给加粗操作,YDWE更新为了醒目也采取加粗操作(棕色),2V奖励版主根据质量决定
WE区内部资料极其丰富,本帖用于修订和编写引索,链接都是直达帖子楼层,让找资料更加方便。
此目录不断更新,有特别推荐的教程或者演示可以联系我或者其他版主添加内容。
这个东西对学习太有用了
我和我的小伙伴都惊呆了!
总评分:&节操 + 2&
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
本帖最后由 kevin100 于
00:23 编辑
【通魔】言灵 初学者WE的系列教程
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
本帖最后由 kevin100 于
22:35 编辑
【通魔】徘徊精灵 精华教程汇总
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
本帖最后由 kevin100 于
19:16 编辑
A酱 大量演示和教程
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
本帖最后由 kevin100 于
22:32 编辑
【通魔】Red_Wolf 对WE的深入精华研究
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
本帖最后由 kevin100 于
17:54 编辑
【通魔】风霜 进阶演示与系统
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
点击图片进入灾祸世界
桥君灌水组:[荣誉组长]桥君
节操182 绿叶0 注册时间在线时间2026 小时阅读权限60精华6主题听众数最后登录KPI值0
Lv.16 热门人物, 积分 34591, 距离下一级还需 409 积分
UID3510420帖子U9币220424 魅力21089 声誉9 U菜花3201
点击图片进入灾祸世界
[辛勤勋章]
版主以上职务在论坛贡献突出者特别奖励
[社区建设]
该会员为社区的建设立下了不可磨灭的功劳
[乐于助人]
在新手区积极帮助新人解决问题
[优秀WEER]
他在WE区经常发表优秀演示以及热心帮助新手
[通魔元老]
Channel Workshop通魔作坊元老级人物
[通魔程序师]
这位程序师编写的辅助程序和Jass代码让地图制作如虎添翼。
[元老勋章]
注册满1年,发帖量1W的会员可自行申请领取。
Powered by收藏的论坛
魔兽地图编辑器新手教学 魔兽战役编辑教程(1)
  首先作两点重要的说明:  1、在制作战役时,如果要保存,请直接在战役编辑器上保存,一定不要在单张地图上保存,否则会导致该地图打不开。如果已经遇到了这种情况,不必惊慌,可以在该地图上做少许修改(如添加一个空触发器再删除),然后在战役编辑器上保存一遍,即可恢复该地图。  2、如果要测试战役,不要在单张地图上点&测试地图&,要保存战役后进入游戏进行测试。这是因为,跟切换地图和章节相关的很多动作,以及战役编辑器中的自定义数据,都只能在运行战役时生效。   看一下战役编辑器的基本功能。打开战役编辑器,可以看到4个模块:普通、载入画面、自定义数据、导入文件。  普通:  在这里可以设置战役的说明文字,以及导入地图。导入地图并保存战役后,地图就整合在战役文件里了,可以把原始地图文件删掉。要编辑导入的地图,在右面的地图列表里右击,选择&编辑地图&。  导入的地图请一律用英文名,并且为了后面切换地图方便,请保持所有地图的后缀名一致,要么都是&.w3m&,要么都是&.w3x&。导入的地图无论再怎么修改,后缀名都不会改变了。   载入画面:  在这里可以设置战役背景的图片(比如暗夜战役的弓箭手mm)、指针形状(因种族而异),还有战役屏幕按钮。  战役屏幕按钮,也就是战役背景中的章节选项。新建一个按钮,可以设置章节名称和它通往的地图。还有一个&初始可见&选项,顾名思义,勾选了该项的按钮一开始就能看到,没选的按钮就是隐藏的,可以通过触发来显示。另外,每个按钮前面都有一个序号(ID),用触发显示按钮时就是以这个序号为准的。   自定义数据:  和物体编辑器功能相同。区别在于,在这里定义的数据能被战役里的所有地图共用,并且会在每张地图的物体编辑器里以蓝色字体显示出来。如果这里和物体编辑器的数据有冲突,则以物体编辑器为准。建议大家的自定义物体数据都在这里改。另外这里的数据在测试单张地图时是无效的,只有运行战役才会生效。  导入文件:  顾名思义。这里的导入文件同样可以被所有地图共用。   接下来就是大家最关心的切换章节和切换地图了。我们先做点准备工作。  创建三张地图(为方便测试,用尺寸小点的),分别命名为&C1_1.w3m&、&C1_2.w3m&、&C2_1.w3m&。其中第一个数字表示章节,第二个数字表示同一章的地图序号。做点最基本的处理:放置开始点;删除对战初始化触发器;在情节&&队伍中勾选&自定义队伍设置&和&固定玩家设置&,这样可以将游戏界面固定为某一种族的;随便修改一下地图说明和地形,将两张地图区别开。  把三张地图导入新建战役。在&载入画面&模块为&C1_1.w3m&和&C2_1.w3m&各添加一个按钮,分别命名为&第一章 C1_1&和&第二章 C2_1&,其中第一章设为初始可见。保存战役为&教程战役.w3n&,删除两张地图的原始文件。  在&自定义数据&模块中自定义一个英雄,作为战役的主角。比如一个称谓为&大师与天才&的法师。   切换地图的核心是游戏缓存。先简单介绍一下原理:  在一张地图上创建一个游戏缓存,可以将一些数据(包括单位、整数、实数、字符串)储存起来,将其保存到本地。然后通过&保存并切换关卡&、&保存并读取进度&等动作,进入同一战役的另一张地图。在新的地图上,创建一个同名的游戏缓存,从硬盘读取缓存数据,便可以将上一张地图的数据复制过来,也就是继承上一张地图的进度。  关于游戏缓存,有一些诡异的问题,比如无法彻底删除、同一硬盘上有数量限制等。总之就是创建的游戏缓存越少越好。所以我们只在每张地图初始化时创建一个游戏缓存,一律用同样的名称。  现在开始制作切换章节的触发,即从第一章&C1_1.w3m&进入第二章&C2_1.w3m&。  在&C1_1.w3m&上设置一块矩形区域&to C2_1&,作为通往第二章的入口。当玩家1的单位进入该矩形区域时,即进入第二章。   在地图&C1_1.w3m&上,添加一个游戏缓存变量&GC&,和一个单位变量&Char&,创建一个初始化触发器为其赋值:   游戏缓存的名字可以随便取,不过要保持每张图一致。我用的&Demo&是演示的意思。  然后是切换章节触发:   第一张地图到此为止,再来编辑地图&C2_1.w3m&。设置矩形区域&from C1_1&,从第一章读取的单位就放在区域中心。   同样添加游戏缓存变量&GC&和单位变量&Char&,然后用初始化触发器读取上一章的主角数据:   大功告成,现在保存战役,进入游戏测试下,应该可以从第一章进入第二章了。  注意缓存的类别名C2,用的是下一章节的序号。这是为了防止玩家随意进入各个章节,导致缓存数据混乱。比如说,假如所有地图都用相同的类别名&A&,某玩家进入第三章,过关后该章的数据存入了类别&A&,然后他不进第四章,而是又回头玩第二章,那么他在第二章读到的就是第三章的数据。  另外,以上只是实现关卡切换的最基本动作,实际应用时还要添加很多动作来应对各种意外情况,记下来另一篇文章会慢慢讲到。  续集教程:  
近期游戏热闻|  
|  
|  
|  
|  
只需一步,快速开始
查看: 4263|回复: 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}

我要回帖

更多关于 魔兽地图编辑器教程 的文章

更多推荐

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

点击添加站长微信