找回密码
 点一下
查看: 6586|回复: 21

Jass讲座(程序设计思想)(工事中)

[复制链接]
发表于 2009-10-25 09:55:41 | 显示全部楼层 |阅读模式
1.初识Jass

好吧,这一讲是给大家讲讲什么是Jass,以及学了Jass到底有什么用。

(如果您完全不会T,无所谓,只要您有英文基础,懂一点编程,就可以看这个帖子了,当然如果是纯粹的新手可以无视这个帖子,祝您好运,阿门。)

那么,首先来看看你们的需求吧。

学jass的话,一般是碰到UI(就是常说的T)瓶颈了,或是感到UI做东西非常麻烦才来学的。

打个比方,在UI里面要画出一个圆形图案,需要申请一大堆的变量,然后点到死的点出那几个数学公式,最后还要担惊受怕点和单位组泄露的问题(总之,需要N长时间)。

(图我就不上了,您有空自己用UI拖去)

如果使用Jass,那么很简洁,如下。
[jass]
---------------------------
//ox,oy就是你指定的圆心,i从0~360度变动,每次递增30度
loop
    exitwhen(i>360)   //当大于360度的时候退出
    set x = ox + cos(i) //计算出需要创建单位的X位置
    set y = oy + sin(i)  //计算出需要创建单位的Y位置
    call CreateUnit(Player(p),uId,x,y,facing) //这里是创建一个单位,完全不用管泄漏问题
    set i = i + 30         //角度+30
endloop[/jass]
--------------------------
您可以先别管能不能看懂,不说别的,就这个格式,很优美不是么~

-------------------------我是分割线----------------------------------------------------------------------

2.为什么一定要用Jass?

刚才也说了,UI和Jass的最大区别在于一个写起来很麻烦而另一个写起来很简单(当然您要有点英文基础)。

那么这里来说明一下,我们为什么一定要用Jass呢?

(其实如果可以我也是想用C,lua,python之类的。。可惜w3只支持这个)

用Jass的核心因素在于:简单 + 可扩展性

把自己放在刚才的环境下试想一下,做一个小功能,就需要耗费10倍的精力用UI拖一个,那么如果我们要做更多的功能呢?这时候简单的优势就体现出来了。

就很简单一个小功能:

将单位移动到某个坐标点的X度方向120距离的点
SetUnitPositionLoc(u,OffsetLoc(p,X,120))

如果在UI中拖呢,当然你可能看不出UI和Jass的效率区别。

但是如果我需要将这个功能对10个点使用呢?怎么办?你复制10个?万一将来哪天要改咋办?

如果在Jass中,你可以很方便地把这个功能包成一个函数,比如叫SetUnitLoc_YourName(u,p),然后以后的东西就用这个玩意,把想要移动的东西和地点传进去就好了。

使用简便,修改也方便很多。
-----------------------------------------------------------------------------------------
另外举个例子:

比如我写了一个全屏幕物品栏,A作者想用。

那么怎么办呢?

好,我提供一个函数叫做 InitFullScreenInv(Player,Unit)的东西,效果是为一个玩家启动全屏幕物品栏。

那么,他在游戏中只要在创建英雄的时候调用一下,就可以用了。。。。

是不是很简单呢?(其实这个东西就跟你自己写UI没啥区别啦,只不过这个UI是通用的,不会因为你没下载什么东西就打不开)

所以,为了世界的和平,为了爱和正义,以及为了系统移植的方便性,你还有什么理由拒绝诈死呢?

评分

参与人数 1威望 +2 收起 理由
疯人¢衰人 + 2 加分的坑……一点点的补上吧,我都是习惯写完才发的……

查看全部评分

 楼主| 发表于 2009-10-25 09:55:55 | 显示全部楼层
3.Jass基本知识

首先推荐大家百度一下JassAll,一本Jass函数手册,然后拿下来自己看看。

然后,这里介绍一下Jass的基础知识,当然如果你懂得Jass基础语法可以跳过这章。

那么,所谓基本知识,就是让大家了解一下Jass是怎么工作的,以及一些基本语法。

大家都知道,Jass是一种计算机语言(不要砸我)。。。所以他的执行方式就是按照计算机的规矩来的,他具有一般计算机语言的通用特性:

- 按说,Jass里面其实只有两种数据类型:Data和Handle。
[jass]
Data: integer ,real ,boolean
Handle:string,unit,item.....等等
注:任何涉及到“泄漏”的东西必然是因为Handle型的变量操作不正确导致的
[/jass]
- Jass是从第一行开始一行一行执行的(面向过程语言)
- Jass里面函数的基本单位是code,结构如下:
[jass]
function 函数名字 takes (类型)参数1,(类型)参数2......returns 结果的类型
    return 结果
endfunction
[/jass]
- Jass里面申请函数内部使用变量的语法是local 类型 变量名 = xx,比较土的是你只能在函数开始的时候定义局部变量。
- Jass里面设置变量的语法比较土,需要用set xxx = 123456这样的语法设置。
- Jass里面调用函数的语法也很土,需要用call xxxxxxx(xxxxx)的语法来调用函数。
- Jass里面只能用后面定义的函数调用前面的。
- Jass的一种语法结构:if XX then OO elseif XO then XXX else XXOO endif
- Jass的另一种语法结构:loop --->OOXX---exitwhen(OO)-->OOXX---endloop-->loop-->.......
回复

使用道具 举报

 楼主| 发表于 2009-10-25 09:56:01 | 显示全部楼层
4.杂碎的逻辑知识

1.点

什么是点?点就是一个很简单的数据结构,里面包含三个数据
P(x,y,z)

2.泄漏
泄漏的原理:任何handle数据在被某个变量指向(set a = TargetData)的时候,这个handle指向的那块真正的内存就会被加一个锁,以防止被释放,在这个变量指向其他(包括null)地方的时候会自动打开这个锁。

而blz比较搓,他的机制仅限这样,如果你在某个function里面申请了一个比如local unit u = GetTriggerUnit()的东西,然后在函数结束的时候没有set u = null的话,这个锁将被保持下去(本来是应该自动释放的,但是blz没有),于是导致这个内存空间永远不能被重新使用,于是就出现了一块没用的内存,就是泄漏了,越堆越多的话就会有问题。
回复

使用道具 举报

 楼主| 发表于 2009-10-25 09:56:08 | 显示全部楼层
5.面向对象的设计方法

1.什么是面向对象
简单的说,面向对象是编程的一种思想。

一个程序,从功能上分析,可以分为数据段和代码段。
【数据段】globa udg_a
【代码段】set udg_a = 1

【运行代码段的内容】

一般的面向过程编程,这两个东西是分开对待的,而Jass本身就是一种面向过程的语言。

那么说了这么多,我们要面向对象做什么呢?

其实面向对象就是把数据段和代码绑定帮到一起,每次运行的时候使用一个虚拟的“对象”作为单位。

【(数据段)(代码段)】---->扔出去自己运行

好处是什么呢?面向对象的好处就是:你也不知道你的代码到底会获得什么结果,这个东西完全不需要你关心。并且多个对象之间的数据是完全不会相互影响的。(多人使用不冲突的技能)

一种最简单的面向对象写法:
[jass]
fuction xxx takes nothing returns nothing
    local integer i = 获得当前触发器的数据段中的“I”的数值
    set i = i + 1
    将I储存回当前触发器的数据段中的“I”的位置
endfunction
[/jass]

看,一个简单的缓存/Hash表应用就出来了。
回复

使用道具 举报

 楼主| 发表于 2009-10-25 09:56:14 | 显示全部楼层
坑!~~
回复

使用道具 举报

 楼主| 发表于 2009-10-25 09:56:28 | 显示全部楼层
坑!~~~
回复

使用道具 举报

发表于 2009-10-25 20:45:40 | 显示全部楼层
坑杀!~~~~
回复

使用道具 举报

发表于 2009-10-27 10:24:04 | 显示全部楼层
Eff桑也终于要履行作为版主的责任了么……(笑)

PS:诈死吗?不是假死吗?!!
回复

使用道具 举报

 楼主| 发表于 2009-10-27 14:26:42 | 显示全部楼层
声明:本人从来没有,将来也不会认真地履行版主的职责,一切行为可以理解为暂时性的肾上腺冲动,本人行为完全随机,不可预计。

以上。
回复

使用道具 举报

发表于 2009-10-27 15:16:16 | 显示全部楼层
正好我不会Jass,那就等着一点点更新好了~
回复

使用道具 举报

发表于 2009-10-28 18:20:19 | 显示全部楼层
不知道是不是伪随机...
回复

使用道具 举报

发表于 2009-11-22 13:09:45 | 显示全部楼层
竟然不声不响更新了,墙壁你
回复

使用道具 举报

 楼主| 发表于 2009-11-22 16:47:24 | 显示全部楼层
最近工作比较忙所以没空写。。
回复

使用道具 举报

发表于 2009-11-22 19:13:44 | 显示全部楼层
加油加油……
我的Jass就等着你了。
回复

使用道具 举报

发表于 2009-11-22 19:18:08 | 显示全部楼层
zinc
回复

使用道具 举报

发表于 2009-11-22 19:20:15 | 显示全部楼层
zinc是什么……今天在hiveworkshop看到一次,不过不了解……
回复

使用道具 举报

 楼主| 发表于 2009-12-1 23:22:58 | 显示全部楼层
略微更新
回复

使用道具 举报

发表于 2009-12-27 23:47:40 | 显示全部楼层
能否最后给出一个实例?
回复

使用道具 举报

 楼主| 发表于 2009-12-31 16:36:09 | 显示全部楼层
什么是最后一个实例?
回复

使用道具 举报

发表于 2011-1-18 10:36:53 | 显示全部楼层
jass编程思想
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-4 03:19 , Processed in 5.341527 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表