请选择 进入手机版 | 继续访问电脑版

 找回密码
 点一下
查看: 5141|回复: 24

【私人用教程】

[复制链接]
发表于 2011-6-30 16:21:57 | 显示全部楼层 |阅读模式
TRIGGER看起来简单,实际很复杂,很臃肿,很麻烦,很糟糕。(三个字总结:弱爆了!)
[trigger]对战初始化
    事件
        地图初始化
    条件
    动作
        对战游戏 - 使用对战昼夜设置
        对战游戏 - 使用对战英雄设置
        对战游戏 - 给首发英雄一个回城卷轴
        对战游戏 - 设置初始资源
        对战游戏 - 删除已使用开始点附近的中立生物
        对战游戏 - 创建对战初始单位
        对战游戏 - 对电脑玩家运行对战AI脚本
        对战游戏 - 强制使用对战胜利/失败条件
[/trigger]
最终有War3执行的时候,还是要转换成Jass。
[jass]function Trig________________u_Actions takes nothing returns nothing
    call MeleeStartingVisibility(  )
    call MeleeStartingHeroLimit(  )
    call MeleeGrantHeroItems(  )
    call MeleeStartingResources(  )
    call MeleeClearExcessUnits(  )
    call MeleeStartingUnits(  )
    call MeleeStartingAI(  )
    call MeleeInitVictoryDefeat(  )
endfunction

//===========================================================================
function InitTrig________________u takes nothing returns nothing
    set gg_trg________________u = CreateTrigger(  )
    call TriggerAddAction( gg_trg________________u, function Trig________________u_Actions )
endfunction[/jass]
注意!在Jass内,地图初始化这个事件是不存在的,那么这个触发器该这么运行?
答案:被另一个函数调用。
[jass]function main takes nothing returns nothing
    call SetCameraBounds( -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM) )
    call SetDayNightModels( "Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl" )
    call NewSoundEnvironment( "Default" )
    call SetAmbientDaySound( "LordaeronSummerDay" )
    call SetAmbientNightSound( "LordaeronSummerNight" )
    call SetMapMusic( "Music", true, 0 )
    call InitBlizzard(  )
    call InitGlobals(  )
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    call InitCustomTriggers(  )//←就是这个函数调用的
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    call RunInitializationTriggers(  )
endfunction[/jass]
[jass]function InitCustomTriggers takes nothing returns nothing
    call InitTrig________________u(  )
endfunction[/jass]
我勒个去,绕赤道一圈才运行这个触发器,效率太低下了。所以我们要对这个进行小小的改进下。
(过去的触发器弱爆了!看Jass的)
[jass]function main takes nothing returns nothing
    call SetCameraBounds( -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM) )
    call SetDayNightModels( "Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl" )
    call NewSoundEnvironment( "Default" )
    call SetAmbientDaySound( "LordaeronSummerDay" )
    call SetAmbientNightSound( "LordaeronSummerNight" )
    call SetMapMusic( "Music", true, 0 )
//这里是刚才的触发器,我们直接加入到游戏初始化中。
    call InitBlizzard(  )
    call MeleeStartingVisibility(  )
    call MeleeStartingHeroLimit(  )
    call MeleeGrantHeroItems(  )
    call MeleeStartingResources(  )
    call MeleeClearExcessUnits(  )
    call MeleeStartingUnits(  )
    call MeleeStartingAI(  )
    call MeleeInitVictoryDefeat(  )
//Over
    call InitTrig________________u()
    call RunInitializationTriggers(  )
endfunction[/jass]









Jass内虽然代码可以精简很多,但是顺序千万别搞错了,错误的顺序War3是不认识的。
[jass]
//正确使用方式
function Actions_2 takes nothing returns nothing
endfunction

function Actions takes nothing returns nothing
call Actions_2()
endfunction

function main takes nothing returns nothing
call Actions()
endfunction[/jass]
[jass]
//错误的使用方式
function main takes nothing returns nothing
call Actions()
endfunction

function Actions takes nothing returns nothing
call Actions_2()
endfunction

function Actions_2 takes nothing returns nothing
endfunction[/jass]

Jass的写法是从上往下开始写的,所以当多个代码之间相互调用时,是从下往上调用的。
如果你的代码是从上往下调用……恭喜你,War3不认识。

解决方法很简单。
新建两个触发器,新建触发器1改名为Jass,新建第二个触发器改名为Init。
Jass内位置为
[jass]
function Trig_Jass_Actions takes nothing returns nothing
endfunction
function InitTrig_Jass takes nothing returns nothing
    set gg_trg_Jass = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Jass, function Trig_Jass_Actions )
endfunction
function Trig_Init_Actions takes nothing returns nothing
endfunction
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction[/jass]
如果你无法确认位置,用Jassshoppro打开地图,可以看到。

其他的……有问题了再说。

JassShopPro.rar

1.43 MB, 下载次数: 68

评分

参与人数 1威望 +35 收起 理由
希瓦 + 35 不错的教程

查看全部评分

发表于 2011-6-30 20:17:54 | 显示全部楼层
获取玩家开始位置(选取玩家)的JASS代码是什么呢?
回复

使用道具 举报

 楼主| 发表于 2011-6-30 20:18:59 | 显示全部楼层
试试看是不是这个。
[jass]
native GetPlayerStartLocation takes player whichPlayer returns integer
[/jass]

只用GetPlayerStartLocation,其他的是关于这个函数的参考。
takes是调用参数,returns是返回参数。
回复

使用道具 举报

发表于 2011-6-30 20:20:04 | 显示全部楼层
是这个,那选取玩家呢?
回复

使用道具 举报

 楼主| 发表于 2011-6-30 20:20:14 | 显示全部楼层
玩家组的?
回复

使用道具 举报

发表于 2011-6-30 20:21:33 | 显示全部楼层
玩家
回复

使用道具 举报

 楼主| 发表于 2011-6-30 20:23:49 | 显示全部楼层
[jass]constant native GetEnumPlayer takes nothing returns player[/jass]
这些代码你可以用触发器,随便找个有你需要的函数的动作,然后转换成Jass代码,看。

熟悉之后就可以在Jassshoppro里自己写了。
我现在只熟悉各种Create写法,比如TriggerCreate()什么的。
回复

使用道具 举报

发表于 2011-6-30 20:24:48 | 显示全部楼层
对哦~~知道了~
回复

使用道具 举报

 楼主| 发表于 2011-6-30 20:46:30 | 显示全部楼层
我玩游戏去了,有事你先留个言,我玩完了再来。
回复

使用道具 举报

发表于 2011-7-1 01:03:56 | 显示全部楼层
function H2I takes handle h returns integer
      return h
      return 0
endfunction
function I2U takes integer i returns unit
      return i
      return null
endfunction
function I2P takes integer i returns player
      return i
      return null
endfunction
function I2Timer takes integer i returns timer
      return i
      return null
endfunction
function I2Trigger takes integer i returns trigger
      return i
      return null
endfunction

什么意思
回复

使用道具 举报

发表于 2011-7-1 01:19:39 | 显示全部楼层
JASS怎么添加条件
回复

使用道具 举报

 楼主| 发表于 2011-7-1 06:58:21 | 显示全部楼层
[jass]function H2I takes handle h returns integer
      return h
      return 0
endfunction
function I2U takes integer i returns unit
      return i
      return null
endfunction
function I2P takes integer i returns player
      return i
      return null
endfunction
function I2Timer takes integer i returns timer
      return i
      return null
endfunction
function I2Trigger takes integer i returns trigger
      return i
      return null
endfunction[/jass]
详细的可以搜索“return bug”
这几个是Return Bug函数,通过返回值Bug,可以把takes里的参数强制转换为returns里的变量类型。
但是基本上只能在整数integer和原来的变量类型转换。(单位变量转换为整数H2I就是该单位在内存中的指针地址,I2U就是把这个整数地址转换为单位变量,但是你无法将某个单位的整数地址转换为物品,因为这个地址原先保存的就不是个物品)
1.20下只有return bug配合 gamecache(游戏缓存)才可以存储数据,1.24后都用Hashtable(哈希表)了。


在Trigger里,添加条件是用[jass]native TriggerAddCondition takes trigger whichTrigger,boolexpr condition returns triggercondition[/jass]
不过在Jass里,我更喜欢用。
[jass]if 1+1==2 then
call BJDeugMsg(“2”)
endif[/jass]
jass语法结构


0. 本章概述
    本章介绍jass语言的基本语句,包括判断、循环、判断和循环的嵌套、数组

-----------------------------------------

1. jass的判断语句
    与大多数的语言一样,jass使用了if作为判断语句。jass的if与passcal的判断语法相似(这里不得不b4 basic一下,赋值与判断相等居然都使用“=”,否则的话这里把basic也加进去了)。

语法:
a)[jass]
  if 判断式 then
    ...
&#160;&#160;<else
&#160;&#160;&#160;&#160;...>
&#160;&#160;endif
[/jass]
&#160;&#160;&#160;&#160;当 判断式 的值为 true 的时候,执行语句
&#160;&#160;&#160;&#160;若出现else,则为当 判断式 的值为 true 则执行到 else 之前的语句,否则的话,执行 else 到 endif 之间的语句
[jass]
&#160;&#160;if 判断式 then
&#160;&#160;&#160;&#160;...
&#160;&#160;elseif 判断式 then
&#160;&#160;&#160;&#160;...
&#160;&#160;elseif 判断式 then
&#160;&#160;&#160;&#160;...
&#160;&#160;<else
&#160;&#160;&#160;&#160;...>
&#160;&#160;endif [/jass]
实现多重判断,不做更多的解释了。
回复

使用道具 举报

发表于 2011-7-1 14:31:39 | 显示全部楼层
我要做一个地图,基地生产一种单位,
你在基地点升级单位,该单位就会转变成其他类型,
这触发应该怎么弄?
回复

使用道具 举报

 楼主| 发表于 2011-7-1 18:25:14 | 显示全部楼层
首先你要有一个刷兵触发。
然后在刷兵触发里对刷的兵类型开始加工。
基本上就是
[jass]native CreateUnit takes player id,integer unitid,real x,real y,real face returns unit[/jass]

[jass]integer unitid[/jass]这,用变量,不用固定的值。
[jass]globals
//首先新建一个整数变量 - 数组(单位类型变量就是整数。)
integer array Unit_Id
//integer是整数,array是数组,UnitId是变量名。
endglobals

//初始化单位类型,由于是刷的兵类型是变化的,所以用变量数组来记录多个单位类型。
function Init_Unit takes nothing returns nothing
set Unit_Id[0]='hfoo'//编号0的单位是 - 步兵
set Unit_Id[1]='h000'//编号0的单位是 - h000,我也不知道这是什么
set Unit_Id[2]='h001'//编号0的单位是 - h001,over。
endfunction

//这个是刷兵触发器,单位类型里我们填上刚才的变量,并且用相关的手段控制变量序号,就没问题了。
function Create_Unit takes nothing returns nothing
call CreateUnit(Player(0),Unit_Id[GetPlayerTechCount(Player(0),'R000',TRUE)],0,0,270)
endfunction

constant native GetPlayerTechCount takes player whichPlayer,integer techid,boolean specificonly returns integer
whichPlayer=玩家
techid=科技ID
specificonly=我也不知道是什么 [/jass]
回复

使用道具 举报

发表于 2011-7-1 19:42:20 | 显示全部楼层
晕,还是弄不好~
回复

使用道具 举报

 楼主| 发表于 2011-7-1 21:09:28 | 显示全部楼层
你传个地图……
不想上企鹅了……
回复

使用道具 举报

发表于 2011-7-1 23:06:22 | 显示全部楼层
怎么样~
回复

使用道具 举报

发表于 2011-7-2 21:14:42 | 显示全部楼层
裤子也写教程了。掌声啪啪。
另外,裤子直接教它HT好了,不要教ReturnBug啦!
回复

使用道具 举报

发表于 2011-7-3 00:34:51 | 显示全部楼层
HT是什么?
楼主~上Q啊~
回复

使用道具 举报

 楼主| 发表于 2011-7-3 02:02:03 | 显示全部楼层
HT和RBG本质上差不多的东西。


上你妹,我必须滚床去了。
明天白天再说。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 09:05 , Processed in 0.256251 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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