steam 上架 视频 Surviving IndieIG商店 热情传说 12.49刀 (可能附赠仙乐传说)[12.20]Groupees新包 Wats On Groupees: Play Indies 国产MMO游戏黑暗与光明现已上架steamKingdom Rush Frontiers更新1.4.4版本,修正了1.4版本Pre-Dynastic Egypt「史前埃及」已发布官方中文BundleStars 冬促开始 限时10%折扣码Controller Companion 教学视频[别人]-开箱-Square Enix圣诞终极包2017[12.19]IndieGala 新包 Monday Motivation #12 Bundle
周边热门话题讨论
进阶的技术***流
适用于正版游戏的汉化
游戏成就和达成攻略
发布原创游戏评测
免费领取游戏的机会
购物经验和优惠信息
物美价廉的游戏集合
游戏、卡片、道具、市场
送出余裕的游戏或道具
交流青睐之光与发行话题
备份、美化、媒体等资源
异常故障和账户帮助
跨区、支付、慈善包等问题
积分、账号和制度的疑问
寻求资源/汉化相关问题
针对某一游戏的特定问题
领取福利、魔法上网等问题
立下高额奖励的疑难杂症
一般游戏交流区
Global Offensive
Grand Theft Auto
Valve 旗下游戏讨论
EA 旗下游戏讨论
Ubisoft 旗下游戏讨论
标新立异的小众作品
天邈汉化组
天邈汉化组
蒹葭汉化组
蒹葭汉化组
起源汉化组
起源汉化组
艺电旗下游戏平台
育碧旗下游戏平台
波兰的游戏发行平台
中电博亚旗下代理平台
其他销售网站旗下平台
微软游戏主机平台
索尼游戏主机平台
今日:695|昨日:3225|帖子:3307665|会员:450091 |欢迎新会员: |:1745 人,最高记录是 11000 于 &&
SteamCN 蒸汽动力 & Chinese Steam User Fan Site.
来浏览本站
09:51, PE: 0.274233s , QE: 6, Gzip On, Redis On.查看: 12937|回复: 4
JASS改图教程(很简单,牛人半小时就学会了。)
在线时间58 小时
T币帖子金砖
水面的小草(4级), 积分 14, 距离下一级还需 286 积分
水面的小草(4级), 积分 14, 距离下一级还需 286 积分
自己看吧 我看了2小时都没学会
声明:有一定T基础的人完全可以在10分钟之内基本掌握该jass教程,夯实基础后要继续深入
学习和研究请去高级讨论区查阅有关资料。摒弃传统教学的特点,直击重点、深入浅出,
即使是毫无程序基础的人也能在很短的时间内迅速掌握。本教程不打算与其他语言挂钩,
不论原因为何,基于让人们迅速掌握和理解该语言的初衷,因此采用最有效最通俗的手
法去阐述该语言。关于jass是什么以及为什么要学习等内容,就不再赘述。
──────────────────────────────────
──────────────────────────────────
一、初识jass
1、概览(5秒)
关于jass,只要知道2个内容即可:变量和函数。
╔═══╦═════════════════════╗
║ 变量 ║存储数据,重点熟悉和掌握全局和局域变量 ║
╠═══╬═════════════════════╣
║ 函数 ║执行功能,了解函数的结构、生成和运行等 ║
╚═══╩═════════════════════╝
2、详解(2分20秒)
(1)、变量和函数声明格式如下:
───────────────────────────
a、全局变量的声明:
变量类型 变量名 ( = 初始值 ) //括号表示不赋值亦可,下同
变量类型 array 数组名 //数组不可直接赋值,需在函数内逐个赋值
endglobals
b、函数和局域变量的声明:
function 函数名 takes 参数列表 returns 返回值类型
local 变量类型 变量名 ( = 初始值 )
......
执行语句
......
return 返回值
endfunction
───────────────────────────
(2)、全局与局域变量的区别:
全局任何函数皆可用,局域只作用于所声明的函数。不同函数的局域变量命名可相同,最好不要与全局和
参数名相同。全局占用内存大,执行速率快,全局则反之。触发中,属性变量诸如触发单位、循环整数A、
最后创建的单位、新建的单位组等均是全局变量。同样,变量编辑器(ctrl+B)中的变量亦是全局变量。
(3)、函数起步,掌握以下重点即可:
①、函数名唯一;
②、函数可以无参数和返回值,是为空函数;
③、参数列表为参数类型1 参数名1,参数类型2 参数名2,...,参数类型N 参数名N。逗号分隔即可;
④、返回值必唯一;
⑤、局域变量声明必在所有执行语句之前;
⑥、return必须写在函数末端,即endfunction上一行;
⑦、无返回值函数则无需写return;
⑧、注意returns和return及其后携带数据的区别,前者后接变量类型,后者接具体的数据;
⑨、数组不能做参数和返回值。
───────────────────────────
integer int = 3 //声明一个整数型全局变量int并赋值为3
real col //声明一个实数型全局变量col未赋值
string array str //声明一个字符串数组str
boolean array b = false //错误!数组不能直接赋值!
endglobals
local integer index = 19 //错误!局域变量声明怎能脱离函数?
function A takes nothing returns nothing
local integer a = 1 //声明一个整数型局域变量a并赋值为1,下同
local integer b = 2
local integer c = a + b
call BJDebugMsg(I2S(c)) //显示c的值,该句(带call)即为执行语句
endfunction
function B takes real r, integer e returns nothing
//接受一个实数型参数r和一个整数型参数e
call BJDebugMsg(R2S(r)+I2S(e)) //显示r的值
endfunction
function C takes nothing returns real
//返回一个实数型变量
return 2 * 3 * 15 //正确,必须拥有返回值
endfunction
function D takes nothing returns real, integer
//该函数错误!一个函数只能返回一个数据类型!
return ...
endfunction
function E takes real r returns real
//该函数错误!有返回值类型,但函数结尾却无具体返回值!
endfunction
function F takes real r returns real
//正确,有返回值类型也有具体返回值
return r * 33
endfunction
function G takes nothing returns nothing
call BJDebugMsg(I2S(h))
//错误!局部变量声明必须在所有执行语句之前!
local integer h = 5
endfunction
function H takes integer array num returns nothing
//错误!数组不能作为函数的参数!
endfunction
───────────────────────────
二、jass进阶(1分30秒)
(1)、函数定义
很多初学jass的朋友一直没有搞清楚该问题,很简单,函数就是能独立完成一件工作的机构。
如下例函数showtext,他能完成什么工作呢?或者说他有什么样的职能?注意,凡是在函数
之间的部分(function~endfunction)就是这个函数的职能或作用。那么,该函数的职能就是
打印一行信息“我在学jass”。
───────────────────────────
function showtext takes nothing returns nothing
call BJDebugMsg(&我正在学jass&) //显示“我正在学jass”
endfunction
───────────────────────────
(2)、生成和运行
函数是如何运行(调用)的?很简单,call 函数名(参数列表)即可,这里的参数列表的要求前面已经
说过。需要注意的是,call后面接的是一定函数,此类函数叫被调用函数。被调用函数一定要在调用
函数的前面,且传递状态下的参数列表要和被调用函数的参数列表的类型、次序和数量相一致。
───────────────────────────
function A takes integer i returns nothing
call BJDebugMsg(I2S(i)) //显示31
endfunction
function B takes nothing returns nothing
call A(31) //正确,被调用函数A在函数B的前面。函数B将整数31传递给函数A
call C(0.02) //错误!被调用函数C在函数B的后面!
endfunction
function C takes real rreturns nothing
call BJDebugMsg(R2S(r))
endfunction
───────────────────────────
可不可以让一个函数调用其后面的函数呢,可以的。使用ExecuteFunc(&函数名&)的检索功能,但要注意2点:
①、函数检索距离不宜过大,即2个函数之间的字节码有一定限制;
②、检索状态下,被调用的函数不能拥有参数,但可以有返回值;
③、在遵循②前提下,被检索的函数在检索函数的前后均可。
───────────────────────────
function A takes nothing returns nothing
endfunction
function B takes nothing returns nothing
call ExecuteFunc(&A&) //正确,被检索函数无参数,下同
call ExecuteFunc(&C&)
call ExecuteFunc(&D&) //错误!被检索函数D携带参数!
endfunction
function C takes nothingreturns integer
return 256
endfunction
function D takes integer i returns nothing
call BJDebugMsg(I2S(i))
endfunction
───────────────────────────
三、语法(1分30秒)
──────────────────
exitwhen 条件 //满足条件退出循环
执行语句
──────────────────
(2)、条件控制
──────────────────────
a、单层控制:
if 条件 then //如果满足条件1则做...
b、双层控制:
if 条件1 then //如果满足条件1则做...
else 否则做...
执行语句
c、多层控制:
if 条件1 then //如果满足条件1则做...
elseif 条件2 then //如果满足条件2则做...
执行语句
elseif 条件3 then //如果满足条件3则做...
执行语句
elseif 条件4 then //如果满足条件4则做...
执行语句
...... //如果满足条件N则做...
──────────────────────
(3)、逻辑关系符:
仅3个,and(且)、or(或)、not(非)。
(4)、比较和操作符:
仅9个,[](数组)、[]=(数组赋值)、=(赋值)、
==(等于)、!=(不等于)、&(大于)、&(小于)、
&=(大于或等于)、&=(小于或等于)
(5)、实例。若混合使用,注意嵌套先结束里层再结束外层:
───────────────────────────
function A takes integer i, integer jreturns nothing
if (i==3 and j==5 ) then //如果满足i=3且j=5则做显示他们的和
call BJDebugMsg(I2S(i+j))
else
call BJDebugMsg(&条件不符!&)//否则,不做显示“条件不符”的警告!
endif
endfunction
function B takes nothing returns nothing
local integer i = 1
local integer array index
loop
exitwhen i & 7 //当i&7时退出循环
set index = 25 * i
set i = i + 1
endloop
endfunction
function C takes nothingreturns integer
local integer i = 1
local integer array index
loop
exitwhen i & 7
set index = 25 * i
if (i==2 or i==6 ) then
call BJDebugMsg(I2S(i))
endif //endif嵌套于循环内,因此应该先结束里层
set i = i + 1
endloop //再结束外层
endfunction
───────────────────────────
四、函数间的数据传递(4分)
(1)、利用全局数组传递
这涉及内容较多,暂不说明。
(2)、1.20的Gamechche(游戏缓存)+Return Bug(类型强制转换)
我们知道,要实现一个技能多人运行,可以用全局数组。当然可以利用局域变量,因为局域变量
是互不干扰的、稳定的,且并行运行的。当然,我们可以通过传递参数传递局域变量的值,然而,
对一些不允许携带参数的函数,局域变量的数据无法在函数间传递,怎么办?这个时候需要利用
到缓存。像这样不允许参数的函数有哪些呢?归纳一下:如下几种
1、jass计时器调用的函数;
2、队列事件(单位组、玩家组、可破坏物组等)的过滤(条件)函数;
3、触发的条件函数。
缓存很好理解,就是一个仓库,这个仓库可以想象成很大的房子,里面有很多柜子,而每一个柜子
里面又有很多抽屉,然而,每一个抽屉只能装指定的5种类型的东西,且每一种东西只能装载一个。
这就是柜体原理,用不着多么抽象专业的术语,我想上面这个阐述已经让你理解了什么是缓存。
那么,在实际的缓存中,房子可以看做一个缓存,当然,既然是很大的房子,一个地图一个缓存足矣。
柜子可以看做缓存的目录,抽屉可以看做缓存的标签,由于缓存的目录和标签是采用字符串的形式,因
此,我们不妨存储一个打火机1到房子X的A号柜子K号抽屉里:房子X → A号柜子 → K号抽屉 → 打
火机1同样的,我们必须在存储后指定的路径下才能找到这个打火机1,基于抽屉存放东西的唯一性,“房
子X → A号柜子 → K号抽屉”即指代所存放的打火机1。由于抽屉一次一种东西只能放一样,如果再放
一个打火机2进去的话,就会覆盖掉之前的打火机1,此时,“房子X → A号柜子 → K号抽屉”指向打
火机2。当然,如果在其他抽屉比如L号抽屉方上打火机2,丝毫不影响打火机1的存放,因为是2个毫不相干
的路径嘛。
所以,对于缓存,一个道理,一个标签只能存5种类型的数据:整数、实数、布尔值、字符串和单位。每种数据
只能存一个,否则后进来的数据会覆盖之前的属于这个种类的数据。下面,看看缓存是如何实现的。注意,缓存
必须在使用前初始化,方法为set 缓存变量名 = InitGameCache(&缓存名&),缓存名随便取吧。
取:call Store数据种类(缓存, 目录名, 标签名, 该类数据的某个值)
存:GetStored数据种类(缓存, 目录名, 标签名)
清空标签:call FlushStored数据种类(缓存, 目录名, 标签名)
清空目录:call FlushStoredMission(缓存, 目录名)
清空整个缓存:call FlushGameCache(缓存)
检测缓存数据是否存在:HaveStored数据种类(缓存, 目录名, 标签名)
假定缓存名为udg_GC(udg_是什么?有T基础都多少知道):
call StoreInteger(udg_GC, &A&, &b&, 15) //将整数15存到了缓存GC的A目录下的b标签下
call StoreReal(udg_GC, &A&, &b&, 0.2) //将实数0.2存到了缓存GC的A目录下的b标签下
call StoreIBoolran(udg_GC, &A&, &b&, false) //将布尔值false存到了缓存GC的A目录下的b标签下
call StoreString(udg_GC, &A&, &b&, &TigerCN&) //将字符串TigerCN存到了缓存GC的A目录下的b标签下
由于同一个路径下每种数据可以存一个,所以不会冲突,但若是此时在这个数据下再存一个整数37,即
call StoreInteger(udg_GC, &A&, &b&, 37)
那么GetStoredInteger(udg_GC, &A&, &b&)所指向的就是后存进来的37了,但这不影响该路径下其他类型的数据。
除非它们也想这样改变。当然,为了保证整数15不被覆盖,我们可以将37存到标签c下,即:
call StoreInteger(udg_GC, &A&, &c&, 37)
利用循环+缓存,我们可以存取局域数组变量。
这时,有的同学会问:只能存取5种?太少了吧!我要存取一个特效怎么办?不用担心,return bug出场了!我们可
以用他将其他种种句柄类的数据转换成整数,然后利用StoreInteger来存储。return bug原理很简单,利用编译器
自下而上的检测,当碰到第一个return时,被虚假的结果所蒙蔽就自动跳过检测。其形式如下:
───────────────────────────
function H2I takes handle hreturns integer
return h //真实返回的值是h,即句柄所指向的内存地址
return 0 //编译器先检测这里,返回值是0,正确,跳过检测
endfunction
function I2E takes integer ireturns effect
return i //从句柄所指向的内存地址中读取出句柄
return null //编译器先检测这里,返回值是null,正确,跳过检测
endfunction
───────────────────────────
所以我们要存句柄类的变量诸如单位、特效、点、单位组、物品等均可以利用此形式,自己按照这个格式套就是了。
这样我们就来存储一个触发单位:
───────────────────────────
function H2I takes handle hreturns integer
return h
return 0
endfunction
function I2U takes integer ireturns unit
return i
return null
endfunction
function run takes nothing returns nothing
local unit u = I2U(GetStoredInteger(udg_GC, &Unit&, &Caster&))
//从缓存对应的路径下读取出存储的单位的地址,通过I2U转换成单位,再赋值给变量u
call RemoveUnit(udg_GC, &Unit&, &Caster&, H2I(u))
//删除单位u
call FlushStoredMisiion(udg_GC, &Unit&)
//清空Unit目录。注意,删除整个缓存会删除其他使用缓存的数据
set u = null
endfunction
function test takes nothing returns integer
local unit u = GetTriggerUnit() //声明一个单位型局域变量u并赋值为触发单位
local timer t = CreateTimer() //声明一个局域计时器t并赋值为新建的计时器
call StoreInteger(udg_GC, &Unit&, &Caster&, H2I(u))
//将u转换成整数并存储到Unit目录的Caster标签下
call TimerStart(t, 5, false, function run)
//开启计时器t,一次性,持续5秒,作用与函数run
set t = null
//清空句柄变量
endfunction
───────────────────────────
(3)、1.24的Hashtablee(哈希表)
很简单,只不过是把缓存的目录和标签字符串记录的形式改成了整数,也修正了RB,同时可直接存储一些
句柄类的数据。
取:call Save数据种类(哈希表, 目录名, 标签名, 该类数据的某个值)
存:Load数据种类(哈希表, 目录名, 标签名)
清空目录:call FlushChildHashtable(哈希表, 目录名)
清空整个缓存:call FlushParentHashtable(哈希表)
检测缓存数据是否存在:HaveSaved数据种类(哈希表, 目录名, 标签名)
五、触发器和函数(35秒)
一般触发器无非是由三个函数组成:事件函数(初始化函数)、条件函数、动作函数,所以无需多疑,jass要完
成一个技能或系统也需要经历这3个步骤,当然,往往可以扩展出很多自定义的函数。总体思路不变。打雷了,
就写到这吧!10分钟让你基本掌握jass。更多内容请到高级讨论区去挖掘!如果有人问我最后创建的单位、杀死
单位、创建特效用jass怎么写,我只能说,最直接最偷懒的方法就是用T写再转换成J。
在线时间202 小时
T币1117 元
T币帖子金砖
地上的月影(6级), 积分 34, 距离下一级还需 966 积分
地上的月影(6级), 积分 34, 距离下一级还需 966 积分
看不懂 我弱智 - -。
screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open('.cn/ColgHome/attachment//.jpg');}" onmousewheel="return imgzoom(this);" alt="" />
在线时间4002 小时
T币174129 元
T币帖子金砖
- invisible -
这真心看不懂
screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open('/11.gif');}" onmousewheel="return imgzoom(this);" alt="" /> |
在线时间304 小时
T币25688 元
T币帖子金砖
Tz丶ˉ √
奔跑的春风(7级), 积分 1125, 距离下一级还需 375 积分
奔跑的春风(7级), 积分 1125, 距离下一级还需 375 积分
楼主吹吧,网上随便复制
还简单—& &—
在线时间0 小时
T币帖子金砖
无名的过客(1级), 积分 0, 距离下一级还需 1 积分
无名的过客(1级), 积分 0, 距离下一级还需 1 积分
我基本上除了英文代码不熟悉之外,其他的都看懂了。函数 存储转换 英文单词。多用了20分钟一直在练习单词复习函数安卓排行榜
苹果排行榜
电脑软件排行榜
电脑软件问题咨询
手机软件问题咨询
热门关键词