找回密码
 点一下
查看: 2085|回复: 10

语句错了么?导致WE崩溃

[复制链接]
发表于 2009-10-12 00:22:01 | 显示全部楼层 |阅读模式
初学Jass,身为新手难免粗大。。粗心大意
帮我检查下面的单位移动坐标函数哪里出问题了
另外商店里的相位怎么没库存了。。难道又是被垄断了!?

[jass]
function Move01 takes nothing returns nothing
    local unit u = gg_unit_Hmkg_0000
    local real x = GetLocationX(u) + 10 * Cos (GetUnitFacing (u) * bj_DEGTORAD)
    local real y = GetLocationY(u) + 10 * Cos (GetUnitFacing (u) * bj_DEGTORAD)
    call SetUnitX(u,x)
    call SetUnitY(u,y)
    set u = null
endfunction

function Move takes nothing returns nothing
      local timer tm = CreateTimer()
      call TimerStart(tm,0.50,true,function Move01)
      set tm = null
endfunction
[/jass]
[trigger]
对战初始化
    事件
        地图初始化
    条件
    动作
        自定义代码: call Move()
        设置 hero = 圣骑士 0000 <预设>
[/trigger]
 楼主| 发表于 2009-10-12 06:53:54 | 显示全部楼层
真悲剧,太粗心了
[jass]
function Move01 takes nothing returns nothing
    local unit u = gg_unit_Hmkg_0000
    local real x = GetUnitX(u) + 2 * Cos (GetUnitFacing (u) * bj_DEGTORAD)
    local real y = GetUnitY(u) + 2 * Sin (GetUnitFacing (u) * bj_DEGTORAD)
    call SetUnitX(u,x)
    call SetUnitY(u,y)
    set u = null
endfunction

function Move takes nothing returns nothing
      local timer tm = CreateTimer()
      call TimerStart(tm,0.10,true,function Move01)
      set tm = null
endfunction

[/jass]
回复

使用道具 举报

发表于 2009-10-12 08:30:20 | 显示全部楼层
建议
Move01中加入
call DestroyTimer(GetExpiredTimer())
一句用于排泄
自然
是在判断移动停止的时候
回复

使用道具 举报

 楼主| 发表于 2009-10-12 08:40:53 | 显示全部楼层
直接移动X或Y也会泄漏吗?
回复

使用道具 举报

发表于 2009-10-12 09:12:26 | 显示全部楼层
这个不会
泄露的是timer
不过setXY出了地图范围会导致游戏跳出
回复

使用道具 举报

发表于 2009-10-12 09:28:43 | 显示全部楼层
貌似不必要啊,要Destroy也要看好时机,因为TimerStart的参数是true,也就是循环计时器
回复

使用道具 举报

发表于 2009-10-12 09:39:58 | 显示全部楼层
自然
是在判断移动停止的时候

我说了……

具体要不要排泄这个timer不是必要的
但是无论如何都有停的时候吧
停下来就删除timer吧
反正下次运行也要创建个新的
也许是因为最近做的这个系统的缘故吧
为了保证速度和效率
排泄的很严格
回复

使用道具 举报

 楼主| 发表于 2009-10-12 09:45:52 | 显示全部楼层

回 6楼(疯人¢衰人) 的帖子

我的移动系统是:
玩家按U、D、R、L方向键时设置对应的布尔为真
然后这个0.05的循环timer判断玩家当前布尔是否为真
为真的话移动对应的单位到X,Y
为假的话不做动作。。

所以,换句话说就是,这个timer是从开启后一直运行到游戏结束。。
那么应该就不需要删除timer吧?
回复

使用道具 举报

发表于 2009-10-12 10:15:09 | 显示全部楼层
单位不移动就删除timer
实际上你不必0.05秒的循环判断
可以直接在move01里判断方向布尔值是否为真
如果不为真就直接停止循环(pausetimer+Destroytimer)
[jass]function Move01 takes nothing returns nothing
    local unit u = gg_unit_Hmkg_0000
    local real x = GetUnitX(u) + 2 * Cos (GetUnitFacing (u) * bj_DEGTORAD)
    local real y = GetUnitY(u) + 2 * Sin (GetUnitFacing (u) * bj_DEGTORAD)
    call SetUnitX(u,x)
    call SetUnitY(u,y)
    set u = null
    if XXX then
         call PauseTimer(GetExpiredTimer())
         call DestroyTimer(GetExpiredTimer())
    endif
endfunction
function Move takes nothing returns nothing
      local timer tm = CreateTimer()
      call TimerStart(tm,0.10,true,function Move01)
      set tm = null
endfunction[/jass]
XXX为你的按方向键的布尔值
建议你去看看某些键盘控制的图或者演示吧
这东西是个整体
具体怎么才能有效的使用很难简单的说明
不过如果用J的话
我建议你想办法集成化
回复

使用道具 举报

 楼主| 发表于 2009-10-12 10:27:43 | 显示全部楼层
这是我原来用T做的
不过。。太繁琐了。。。

O_b(11~20)是判断玩家1~10是否按了up键
O_b(21~30)是判断玩家1~10是否按了down键
O_b(31~40)是判断玩家1~10是否按了left键
O_b(41~50)是判断玩家1~10是否按了right键
O_b(51~50)是判断玩家1~10是先按了up还是down
O_b(61~50)是判断玩家1~10是先按了left还是right
[trigger]
Operation Move
    事件
        时间 - _tmr[0] 归零
    条件
    动作
        循环动作[循环整数A]从 1 到 10, 运行 (Loop - 动作)
            Loop - 动作
                Set _r[0] = (取((取(O_r[循环整数A <New>], 100.00)中较大值), 1000.00)中较小值)
                -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- --------
                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                    If - 条件
                        (Hero_u[循环整数A <New>] 的类型) 等于 龙骑士
                    Then - 动作
                        Set _i[0] = 12
                    Else - 动作
                -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- --------
                Set _r[1] = (Hero_u[循环整数A <New>] 的面向角度)
                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                    If - 条件
                        O_b[(循环整数A <New> + 60)] 等于 TRUE
                    Then - 动作
                        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                            If - 条件
                                O_b[(循环整数A <New> + 30)] 等于 TRUE
                            Then - 动作
                                Set _r[1] = (_r[1] + 12.00)
                            Else - 动作
                                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                                    If - 条件
                                        O_b[(循环整数A <New> + 40)] 等于 TRUE
                                    Then - 动作
                                        Set _r[1] = (_r[1] - 12.00)
                                    Else - 动作
                                        不做任何动作
                    Else - 动作
                        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                            If - 条件
                                O_b[(循环整数A <New> + 40)] 等于 TRUE
                            Then - 动作
                                Set _r[1] = (_r[1] - 12.00)
                            Else - 动作
                                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                                    If - 条件
                                        O_b[(循环整数A <New> + 30)] 等于 TRUE
                                    Then - 动作
                                        Set _r[1] = (_r[1] + 12.00)
                                    Else - 动作
                                        不做任何动作
                单位 - 设置 Hero_u[循环整数A <New>] 的面向角度为 _r[1] 度
                -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- --------
                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                    If - 条件
                        O_b[(循环整数A <New> + 10)] 等于 FALSE
                        O_b[(循环整数A <New> + 20)] 等于 FALSE
                    Then - 动作
                        不做任何动作
                    Else - 动作
                        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                            If - 条件
                                O_b[(循环整数A <New> + 50)] 等于 TRUE
                            Then - 动作
                                -------- -------- -------- -------- --------  --------
                                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                                    If - 条件
                                        O_b[(循环整数A <New> + 10)] 等于 TRUE
                                    Then - 动作
                                        Set _r[2] = (_r[0] / 20.00)
                                        Set _r[3] = (0.50 + (_r[0] / 800.00))
                                    Else - 动作
                                        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                                            If - 条件
                                                O_b[(循环整数A <New> + 20)] 等于 TRUE
                                            Then - 动作
                                                Set _r[2] = (0.00 - (_r[0] / 40.00))
                                                Set _r[3] = (0.00 - (0.20 + (_r[0] / 1600.00)))
                                            Else - 动作
                                                不做任何动作
                            Else - 动作
                                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                                    If - 条件
                                        O_b[(循环整数A <New> + 20)] 等于 TRUE
                                    Then - 动作
                                        Set _r[2] = (0.00 - (_r[0] / 40.00))
                                        Set _r[3] = (0.00 - (0.20 + (_r[0] / 1600.00)))
                                    Else - 动作
                                        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                                            If - 条件
                                                O_b[(循环整数A <New> + 10)] 等于 TRUE
                                            Then - 动作
                                                Set _r[2] = (_r[0] / 20.00)
                                                Set _r[3] = (0.50 + (_r[0] / 800.00))
                                            Else - 动作
                                                不做任何动作
                                -------- -------- -------- -------- --------  --------
                        -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- --------
                        Set _p[0] = (Hero_u[循环整数A <New>] 的位置)
                        Set _p[1] = (从 _p[0] 开始,距离 _r[2] ,方向为 (Hero_u[循环整数A <New>] 的面向角度) 度的位移处)
                        单位 - 创建 1 个 马甲 - 操作系统 给 (玩家 循环整数A <New>) 在 _p[1] ,面向角度为 默认建筑朝向 度
                        单位 - 隐藏 最后创建的单位 <New>
                        单位 - 设置 最后创建的单位 <New> 无敌的
                        单位 - 为 最后创建的单位 <New> 设置 水元素 类型的生命周期,持续时间为 1.00 秒
                        Set _p[2] = (最后创建的单位 <New> 的位置)
                        Set _r[4] = ((取((_p[1] 的X轴坐标), (_p[2] 的X轴坐标))中较大值) - (取((_p[1] 的X轴坐标), (_p[2] 的X轴坐标))中较小值))
                        Set _r[5] = ((取((_p[1] 的Y轴坐标), (_p[2] 的Y轴坐标))中较大值) - (取((_p[1] 的Y轴坐标), (_p[2] 的Y轴坐标))中较小值))
                        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                            If - 条件
                                _r[4] 小于或等于 1.00
                                _r[5] 小于或等于 1.00
                            Then - 动作
                                单位 - 立即移动 Hero_u[循环整数A <New>] 到 _p[1]
                            Else - 动作
                                不做任何动作
                        动画 - 播放 Hero_u[循环整数A <New>] 的第_i[0] 号动作
                        动画 - 改变 Hero_u[循环整数A <New>] 的动作播放速度为正常速度的 _r[3] 倍
                        点 - 清除 _p[0]
                        点 - 清除 _p[1]
                        点 - 清除 _p[2]

[/trigger]
回复

使用道具 举报

发表于 2009-10-12 11:31:41 | 显示全部楼层
http://bbs.islga.org/read-htm-tid-28857.html
先看看这个系统吧
看明白了会对你有帮助的
另外按键控制系统的东西很多
所以还是多看看演示是怎么做的吧
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 20:11 , Processed in 0.091837 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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