找回密码
 点一下
查看: 1059|回复: 17

关于returns boolean 的问题  求高手解答

[复制链接]
发表于 2011-8-9 23:23:50 | 显示全部楼层 |阅读模式
returns boolean  下面不应该是判断语句 为什么这个JASS  是这样  求  高手解答 未命名.jpg
发表于 2011-8-9 23:42:26 | 显示全部楼层
!=是关系运算符号
例如 local boolean C = A != B
如果A等于B,那么C既为false
反之则为true

而false和null的值相等
于是
return (IsUnitType(mi,ni)!=null)
等价于
return (IsUnitType(mi,ni)!=false)
其实可以直接写成
return IsUnitType(mi,ni)
它那样写确实很奇怪~
回复

使用道具 举报

发表于 2011-8-9 23:51:39 | 显示全部楼层
另外
Jass可以写在
[jass][/jass]
中间,比截图方便多了~
回复

使用道具 举报

发表于 2011-8-9 23:58:40 | 显示全部楼层

回 1楼(希瓦) 的帖子

如果要用T  怎么样可以写出来呢?   求 高手再解答下  
回复

使用道具 举报

发表于 2011-8-10 00:44:27 | 显示全部楼层
用T就差不多是这样咯
[trigger](mi 的类型) 等于 ni[/trigger]
话说为什么这么问呢……
回复

使用道具 举报

发表于 2011-8-10 13:03:09 | 显示全部楼层
return IsUnitType(mi,ni)

这是错的

用retrun bug查看IsUnitType的返回值,返回真时并不是1,而是大于1的整数,而在boolexpr里只有1才会被当成TRUE
回复

使用道具 举报

发表于 2011-8-10 13:04:41 | 显示全部楼层
而楼主的那个函数显然就是为了避免这个bug
回复

使用道具 举报

发表于 2011-8-10 13:26:54 | 显示全部楼层
引用第4楼希瓦于2011-08-10 00:44发表的  :
用T就差不多是这样咯
[trigger](mi 的类型) 等于 ni[/trigger]
话说为什么这么问呢……

IsUnitType()和GetUnitType()可不一样哦希瓦。

虽然都写成Type,但是这两个type可大不一样,GetUnitType()获取的是单位类型,而IsUnitType()则是判断单位分类的,是否是英雄,是否是死亡的,是否是建筑,是否是召唤生物。


否则IsUnitType()这函数有何必要存在呢。而且这个判断单位分类的函数之所以是IsUnitType()而不是GetUnitxxxx,也是因为一个单位可以有多种单位分类的缘故,所以无法用Get来直接获取。
回复

使用道具 举报

发表于 2011-8-10 13:41:48 | 显示全部楼层
额,好吧……我错了……
看来我对Jass还是不熟悉呢……
回复

使用道具 举报

发表于 2011-8-10 22:50:11 | 显示全部楼层
引用第5楼actboy168于2011-08-10 13:03发表的  :
return IsUnitType(mi,ni)

这是错的

用retrun bug查看IsUnitType的返回值,返回真时并不是1,而是大于1的整数,而在boolexpr里只有1才会被当成TRUE
虽然我知道这个bug。。。但是测试的时候各种没测出来。。难道我的测试方法不对。。
[jass]function Act takes nothing returns nothing
    call BJDebugMsg("hi")
endfunction

function Cond takes nothing returns boolean
    return IsUnitType( XX, YY )
endfunction

function InitTirg_F takes nothing returns nothing
    local trigger trig = CreateTrigger()
    call TriggerRegisterPlayerChatEvent( trig, Player(0), "a", true )
    call TriggerAddCondition( trig, Condition(function Cond))
    call TriggerAddAction( trig, function Act )
    set trig = null
endfunction[/jass]
return IsUnitType( XX, YY )
这里XX是我在地图上放的农民,YY是比如“地面单位”,如果IsUnitType返回值不为1的话不是应该为false吗。。至少不会是true吧。。
但是这个触发会做那个动作。。
当然,换成return IsUnitType( XX, YY ) == true必然是对的。。
回复

使用道具 举报

发表于 2011-8-10 22:55:56 | 显示全部楼层
我记得很久以前有这个bug。但是目前是否还有就不知道了。我的系统跑不了war3hmmm

不过你用boolexpr来测试看看
回复

使用道具 举报

发表于 2011-8-10 23:45:37 | 显示全部楼层
引用第10楼麦德三世于2011-08-10 22:55发表的  :
我记得很久以前有这个bug。但是目前是否还有就不知道了。我的系统跑不了war3hmmm

不过你用boolexpr来测试看看
额。。布尔表达式是这么用的吧。。第一次用不是很确定。。
[jass]globals
    group g=CreateGroup()
    boolexpr B
endglobals

function Boolexpr takes nothing returns boolean
    return IsUnitType( GetFilterUnit(), UNIT_TYPE_GROUND )
endfunction

function Act2 takes nothing returns nothing
    local unit u = GetEnumUnit()
        call KillUnit( u )
    set u = null
endfunction

function Act takes nothing returns nothing
    set B = Condition(function Boolexpr)
        call GroupEnumUnitsInRange( g, 0, 0, 10000, B )
        call ForGroup( g, function Act2 )
endfunction

function InitTrig_F takes nothing returns nothing
    local trigger trig = CreateTrigger()
        call TriggerRegisterPlayerChatEvent( trig, Player(0), "a", true )
        call TriggerAddAction( trig, function Act )
    set trig = null
endfunction[/jass]
然后。。农民被杀死。。
也就是return IsUnitType( GetFilterUnit(), UNIT_TYPE_GROUND )这玩意儿的返回值是true。。

之后又换了种写法。。虽然我觉得没区别
[jass]function Actions takes nothing returns nothing
    if IsUnitType( gg_unit_hgyr_0002, UNIT_TYPE_FLYING ) then
        call KillUnit( gg_unit_hgyr_0002 )
    endif
endfunction

//===========================================================================
function InitTrig_G takes nothing returns nothing
    local trigger trig = CreateTrigger()
        call TriggerRegisterPlayerChatEvent( trig, Player(0), "s", true )
        call TriggerAddAction( trig, function Actions )
    set trig = null
endfunction[/jass]
同样的。。直升机被杀死
回复

使用道具 举报

发表于 2011-8-10 23:47:33 | 显示全部楼层
没RB后不知道还有没有办法查看bool的对应值。。
回复

使用道具 举报

发表于 2011-8-11 00:03:03 | 显示全部楼层
[jass]function Trig_ayowala_Conditions takes nothing returns integer
    call IsUnitType(udg_u, UNIT_TYPE_PEON)
    return 123
endfunction

function Trig_ayowala_Filter takes nothing returns integer
    call IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)
    return 456
endfunction

function Trig_ayowala_Actions takes nothing returns nothing
    local group g = CreateGroup()
    call GroupEnumUnitsOfPlayer(g, Player(0), Condition( function Trig_ayowala_Filter ))
    call BJDebugMsg(I2S(CountUnitsInGroup(g)))
    call DestroyGroup(g)
    set g = null
endfunction

//===========================================================================
function InitTrig_ayowala takes nothing returns nothing
    set gg_trg_ayowala = CreateTrigger(  )
    call TriggerRegisterPlayerChatEvent( gg_trg_ayowala, Player(0), "a", true )
    call TriggerAddCondition( gg_trg_ayowala, Condition( function Trig_ayowala_Conditions ) )
    call TriggerAddAction( gg_trg_ayowala, function Trig_ayowala_Actions )
endfunction[/jass]

刚才头目让我测的现在想起来了于是发下,也不知道测的方法对不对
一开始时和ls差不多直接用IsUnitType测的,后来无聊了就改成整数
地图上有两个单位,一个农民一个城镇中心,结果是输入a触发执行了,输出2,也就是两次boolexpr判定都通过了
另外测过return 0的话通不过,return负数也是通过的
回复

使用道具 举报

发表于 2011-8-11 08:32:45 | 显示全部楼层
引用第13楼zhuzeitou于2011-08-11 00:03发表的  :
一开始时和ls差不多直接用IsUnitType测的,后来无聊了就改成整数
地图上有两个单位,一个农民一个城镇中心,结果是输入a触发执行了,输出2,也就是两次boolexpr判定都通过了
另外测过return 0的话通不过,return负数也是通过的
.......
那么这个结果就是还没确定咯…………

我是指:
1. 不是0即为true(这个应该不可能吧。。)
2. 不是0就能执行动作
3. IsUnitType()返回值确定为1
哪一个才是?


其实我是这么想的:
最原始的程序应该是数字堆起来的,判断true或false是那之后加上去的,但是总不能产生这两个单词然后一个个字母去核对吧,;
于是让true==1,false==0,再用数字判断
既然IsUnitType()==true这个能通过,那么要使这个布尔为true的话,IsUnitType应该只能产生1才对啊。。不然等式两边就成了x==1 (x != 1)
以上仅我个人猜测……
回复

使用道具 举报

发表于 2011-8-11 09:11:19 | 显示全部楼层
不是0即为true为什么不太可能呢?至少在C family里就是这样的,条件判断就是0和非0
回复

使用道具 举报

发表于 2011-8-11 20:42:15 | 显示全部楼层
话说很多编程语言都貌似设定成0即false,非0即true的吧?至少C++貌似是的说~
回复

使用道具 举报

发表于 2011-8-11 21:30:50 | 显示全部楼层
那就是说现在没有这个Bug了吧?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 07:58 , Processed in 0.094406 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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