Сейчас 06:25:15 Пятница, 3 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] this - непонятно
[Вопрос] this - непонятно
tRu^SДата: Понедельник, 20 Августа 2012, 13:25:11 | Сообщение # 1
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:

Что-то не запускает, не понял до конца, но всё-же, почему?




Сообщение отредактировал tRu^S - Понедельник, 20 Августа 2012, 13:25:33
 

SirNikolasДата: Понедельник, 20 Августа 2012, 13:40:46 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Во-первых, у тебя не задана переменная FireBallData в обработчике таймера. Нужно либо передавать значение через хэш, либо использовать поиск по структурам. Во-вторых, ты уничтожаешь единый глобальный таймер, чего делать не следует ни в коем случае. Хотя, возможно, имелось в виду, чтобы он был членом структуры, а не глобальным.

 

tRu^SДата: Понедельник, 20 Августа 2012, 14:37:21 | Сообщение # 3
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
1.
Code
globals
             private constant timer TIMER = CreateTimer()
             private FireBallData FB
         endglobals

Code
[/code]private function FireBallAction takes nothing returns nothing
         local FireBallData fb
         local real xc
         local real yc
         local real xt
         local real yt
         local real x
         local real y
         set fb=FB

Code
    private function cond takes nothing returns boolean
             local FireBallData fb
             local unit caster
             local unit target
             local real angle
             local real maxdis
             local real speed
             local real dis
             local real xc
             local real xt
             local real yc
             local real yt
             local real x
             local real y
             local integer level
             local unit dummy
             if GetSpellAbilityId() == SpellId then
                 set caster = GetTriggerUnit()
                 set target = GetSpellTargetUnit()
                 set level = GetUnitAbilityLevel(caster, SpellId)
                 set angle = Atan2(yc-yt,xc-xt)*bj_DEGTORAD
                 set maxdis = SquareRoot((xc-xt) * (xc-xt) + (yc-yt) * (yc-yt))      
                 set dis = 900.
                 set speed = 25.
                 set xc = GetUnitX(caster)
                 set yc = GetUnitY(caster)
                 set xt = GetUnitX(target)
                 set yt = GetUnitY(target)
                 set fb = FireBallData.create()
                 set fb.angle = angle
                 set fb.maxdis = maxdis
                 set fb.speed = speed
                 set fb.dis = dis
                 set x = xc + speed * Cos(angle)
                 set y = yc + speed * Sin(angle)
                 set dummy = CreateUnit(GetOwningPlayer(caster), DummyId, x, y, angle)
                 set fb.dummy = dummy
                 set fb.caster = caster
                 set fb.target = target
                 set fb.level = level
                 set FB=fb
                 call TimerStart(TIMER, Interval, TRUE, function FireBallAction)
             endif
             set caster = null
             set target = null
             return FALSE
         endfunction  

2. Убрал дестрой, оставил паузу.
Таймер всё-равно не тикает.

Добавлено (20 Августа 2012, 14:37:21)
---------------------------------------------
Объясните почему не запускается таймер, а то что-то не очень понятно, и я хотел попробовать без хэша.




Сообщение отредактировал tRu^S - Понедельник, 20 Августа 2012, 14:45:24
 

lawsonДата: Понедельник, 20 Августа 2012, 17:11:16 | Сообщение # 4
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Нахрен тебе структуры? В таком случае они абсолютно не нужны, используй нормальный хеш!

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

tRu^SДата: Понедельник, 20 Августа 2012, 17:12:51 | Сообщение # 5
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
lawson,
Quote (tRu^S)
я хотел попробовать без хэша.

хочу так. Так почему таймер не тикает?


 

lawsonДата: Понедельник, 20 Августа 2012, 17:22:07 | Сообщение # 6
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Зачем отдельно выносить таймер в отдельную глобалку?
Можешь сразу писать CreateTimer() в функции таймера

Добавлено (20 Августа 2012, 17:19:40)
---------------------------------------------
ты проверял дебагом таймер вообще запускается?

Добавлено (20 Августа 2012, 17:22:07)
---------------------------------------------
если не создаешь структуру зачем ее дестроить тогда?


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Понедельник, 20 Августа 2012, 17:24:28
 

tRu^SДата: Понедельник, 20 Августа 2012, 17:31:55 | Сообщение # 7
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
Quote (tRu^S)
2. Убрал дестрой, оставил паузу.

да растовлял.
а таймер не надо GetExpiredTimer()?


 

lawsonДата: Понедельник, 20 Августа 2012, 17:35:34 | Сообщение # 8
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
tRu^S, В таком случае надо.

Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

tRu^SДата: Понедельник, 20 Августа 2012, 18:09:44 | Сообщение # 9
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
Code
scope FireBall initializer init

globals
     private constant integer SpellId = 'A000'
     private constant integer DummyId = 'h000'
     private constant attacktype attackType = ATTACK_TYPE_NORMAL
     private constant damagetype damageType = DAMAGE_TYPE_FIRE
     private constant weapontype weaponType = WEAPON_TYPE_WHOKNOWS
     private constant real Interval = 0.04
endglobals

     private constant function damage takes integer level returns real
         return 25. * level
     endfunction

     private struct FireBallData
         unit caster
         unit dummy
         unit target
         real angle
         real maxdis
         real dis
         real time
         real speed
         integer level
     endstruct
      
     globals
         private FireBallData FB
     endglobals

     private function FireBallAction takes nothing returns nothing
     local timer t=GetExpiredTimer()
     BJDebugMsg("S-4")
     local FireBallData fb
     BJDebugMsg(msg)
     local real xc
     local real yc
     local real xt
     local real yt
     local real x
     local real y
     set fb=FB
     if fb.maxdis < fb.dis then
     BJDebugMsg("S-5")
             set xc = GetUnitX(fb.caster)
             set yc = GetUnitY(fb.caster)
             set xt = GetUnitX(fb.target)
             set yt = GetUnitY(fb.target)
             set x = xc + fb.speed * Cos(fb.angle)
             set y = yc + fb.speed * Sin(fb.angle)
             call SetUnitPosition(fb.dummy,x,y)
     else
             call RemoveUnit(fb.dummy)
             call UnitDamageTarget(fb.caster,fb.target,damage(fb.level),true,false,attackType,damageType,weaponType)
             call PauseTimer(t)
             call DestroyTimer(t)
             call fb.destroy()
     endif
     set fb.caster = null
     set fb.dummy = null
     set fb.target = null
     endfunction
      
     private function cond takes nothing returns boolean
     BJDebugMsg("S-1")
         local FireBallData fb
         local timer t
         local unit caster
         local unit target
         local real angle
         local real maxdis
         local real speed
         local real dis
         local real xc
         local real xt
         local real yc
         local real yt
         local real x
         local real y
         local integer level
         local unit dummy
         if GetSpellAbilityId() == SpellId then
         BJDebugMsg("S-2")
             set t=CreateTimer()
             set caster = GetTriggerUnit()
             set target = GetSpellTargetUnit()
             set level = GetUnitAbilityLevel(caster, SpellId)
             set angle = Atan2(yc-yt,xc-xt)*bj_DEGTORAD
             set maxdis = SquareRoot((xc-xt) * (xc-xt) + (yc-yt) * (yc-yt))  
             set dis = 900.
             set speed = 25.
             set xc = GetUnitX(caster)
             set yc = GetUnitY(caster)
             set xt = GetUnitX(target)
             set yt = GetUnitY(target)
             set fb = FireBallData.create()
             set fb.angle = angle
             set fb.maxdis = maxdis
             set fb.speed = speed
             set fb.dis = dis
             set x = xc + speed * Cos(angle)
             set y = yc + speed * Sin(angle)
             set dummy = CreateUnit(GetOwningPlayer(caster), DummyId, x, y, angle)
             set fb.dummy = dummy
             set fb.caster = caster
             set fb.target = target
             set fb.level = level
             call TimerStart(t, Interval, TRUE, function FireBallAction)
             set FB=fb
         endif
         BJDebugMsg("S-3")
         set caster = null
         set target = null
         return FALSE
     endfunction     
      
         private function init takes nothing returns nothing
         local trigger t = CreateTrigger()
         local integer index = 0
         loop
             call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
             set index = index + 1
             exitwhen index == bj_MAX_PLAYER_SLOTS
         endloop
         call TriggerAddCondition(t, Condition(function cond))
         set t = null
     endfunction

endscope

расставил, после S-2 нечего не работает.


 

lawsonДата: Понедельник, 20 Августа 2012, 18:18:07 | Сообщение # 10
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (tRu^S)
расставил, после S-2 нечего не работает.

Тогда ясно, проблема в равкоде спелла.

Добавлено (20 Августа 2012, 18:15:37)
---------------------------------------------
tRu^S, Если ты создаешь локлку с таймером, то ты должен будешь потом ее обнулить.

Добавлено (20 Августа 2012, 18:18:07)
---------------------------------------------

Quote (tRu^S)
 local timer t=GetExpiredTimer()
     BJDebugMsg("S-4")
     local FireBallData fb
     BJDebugMsg(msg)
     local real xc
     local real yc

А здесь у тебя ошибки нет?
Помоему переменные всегда должны быть выше всех функций.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

tRu^SДата: Понедельник, 20 Августа 2012, 18:25:49 | Сообщение # 11
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
Quote (lawson)
проблема в равкоде спелла.

S-2 неписалобы.
Quote (lawson)
А здесь у тебя ошибки нет? Помоему переменные всегда должны быть выше всех функций.

нет всё норм. Я тут посмотрел на хайве пару спелов без this. Там так
Code
    private struct DATA
     unit target
     real duration
endstruct

globals
     private constant timer TIMER = CreateTimer()
     private DATA array ARRAY
     private integer TOTAL = 0
endglobals

private function action takes nothing returns nothing
     local DATA D
     local boolean DESTROY_DATA
     local integer i = 0
     loop
     exitwhen i >= TOTAL
         set D = ARRAY[i]
         set D.duration = D.duration - FPS
         set DESTROY_DATA = D.duration <= 0
         if DESTROY_DATA then
             call IssueImmediateOrder(D.target, "stop")
             call UnitRemoveAbility(D.target, ABILITY_INVISIBLE_ID)
             call UnitRemoveAbility(D.target, BUFF_ID)
             set ARRAY[i] = ARRAY[TOTAL - 1]
             set TOTAL = TOTAL - 1
             call D.destroy()
         endif
         set i = i + 1
     endloop
     if TOTAL == 0 then
         call PauseTimer(TIMER)
     endif
endfunction

private function run takes nothing returns boolean
     local DATA D
     local unit caster
     local unit dummy
     local integer level
     if GetSpellAbilityId() == ABILITY_ID then
         set D = DATA.create()
         set caster = GetTriggerUnit()
         set level = GetUnitAbilityLevel(caster, ABILITY_ID)
         call UnitAddAbility(caster, ABILITY_INVISIBLE_ID)
         set D.target = caster
         set D.duration = DURATION(level)
         set dummy = CreateUnit(GetOwningPlayer(caster), DUMMY_ID, GetUnitX(caster), GetUnitY(caster), 0)
         call UnitAddAbility(dummy, REDUCE_ABILITY_ID)
         call SetUnitAbilityLevel(dummy, REDUCE_ABILITY_ID, level)
         call IssueTargetOrder(dummy, REDUCE_ABILITY_ORDER, caster)
         call UnitApplyTimedLife(dummy, 'BTLF', 0.5)
         if TOTAL == 0 then
             call TimerStart(TIMER, FPS, true, function action)
         endif
         set TOTAL = TOTAL + 1
         set ARRAY[TOTAL - 1] = D
         set caster = null
         set dummy = null
     endif
     return false
endfunction

тоесть через array, но чота я разницы особой невижу между датами.


 

lawsonДата: Понедельник, 20 Августа 2012, 18:34:56 | Сообщение # 12
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Кароче ты такую муть пишешь, проще используй хеш, или почитай до конца статьи про области и структуры.

Добавлено (20 Августа 2012, 18:34:56)
---------------------------------------------
Quote (tRu^S)
  set D = DATA.create()

Quote (tRu^S)
call D.destroy()

а где ты создаешь структуру в своем коде?
В общем лучше не используй массивные структуры.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Понедельник, 20 Августа 2012, 18:45:03
 

SirNikolasДата: Понедельник, 20 Августа 2012, 18:42:07 | Сообщение # 13
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (tRu^S)
private DATA array ARRAY
Зачем???


 

tRu^SДата: Вторник, 21 Августа 2012, 09:21:23 | Сообщение # 14
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
Не моё я нашел на хайве.

Добавлено (21 Августа 2012, 09:21:23)
---------------------------------------------

Всё работает, но теперь я не обнуляю castera,target,таймер и т.д, потому-что они в ифе, а если обнулять в ифе то код не работает. Это утечно? А если делать по 1-ому то код тоже не работает aka когда всё за ифом, а в нём установка локалок.




Сообщение отредактировал tRu^S - Вторник, 21 Августа 2012, 09:22:33
 

[SeKtOR]Дата: Вторник, 21 Августа 2012, 10:05:49 | Сообщение # 15
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Вообще не особо утечно, но лучше обнулять локальные переменные по максимуму(занимают тоже память)



Сообщение отредактировал [SeKtOR] - Вторник, 21 Августа 2012, 10:07:22
 

SirNikolasДата: Вторник, 21 Августа 2012, 10:15:43 | Сообщение # 16
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
tRu^S, я что-то не понял, что должен делать спелл. Запускать огненный шар, который пролетает половину расстояния до юнита?

 

tRu^SДата: Вторник, 21 Августа 2012, 10:39:20 | Сообщение # 17
8 уровень
Группа: Проверенные
Сообщений: 614
Награды: 0
Репутация: 138
Блокировки:
SirNikolas, почему половину? до цели и умер. Всё работает, я только хочу узнать одно он утечен?



Сообщение отредактировал tRu^S - Вторник, 21 Августа 2012, 10:42:34
 

SirNikolasДата: Вторник, 21 Августа 2012, 11:31:17 | Сообщение # 18
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Code
scope Fireball initializer Init
    globals
        private constant boolean USE_HASH = true
        private constant integer ABILITY = 'A000'
        private constant integer DUMMY = 'h000'
        private constant real PERIOD = .05
        private constant real EXPOSION_RANGE = 50.
        private constant attacktype ATTACK_TYPE = ATTACK_TYPE_NORMAL  
        private constant damagetype DAMAGE_TYPE = DAMAGE_TYPE_FIRE  
        private constant weapontype WEAPON_TYPE = WEAPON_TYPE_WHOKNOWS  
    endglobals

    private constant function Damage takes integer level returns real
        return 25. * level
    endfunction

    private constant function Speed takes integer level returns real
        return 600.
    endfunction

    static /*
    */ if USE_HASH then
        globals
            private constant hashtable Hash = InitHashtable()
        endglobals
    endif

    private struct Data
        timer t
        unit target
        unit dummy
        integer level
    endstruct

    private function Conditions takes nothing returns boolean
        return GetSpellAbilityId() == ABILITY
    endfunction

    private function Timer takes nothing returns nothing
        local real a
        static /*
        */ if USE_HASH then
            local Data d = LoadInteger(Hash, GetHandleId(GetExpiredTimer()), 0)
            local real x = GetWidgetX(d.dummy)
            local real y = GetWidgetY(d.dummy)
        else
            local handle h = GetExpiredTimer()
            local Data d = 1
            local real x
            local real y
            loop
                exitwhen h == d.t
                set d = d + 1
            endloop
            set x = GetWidgetX(d.dummy)
            set y = GetWidgetY(d.dummy)
        endif
        if IsUnitInRange(d.dummy, d.target, EXPLOSION_RANGE) then
            call UnitDamageTarget(d.dummy, d.target, Damage(d.level), true, false, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE)
            call KillUnit(d.dummy)
            call PauseTimer(d.t)
            call DestroyTimer(d.t)
            static /*
            */ if USE_HASH then
                call FlushChildHashtable(Hash, GetHandleId(d.t), 0)
            endif
            call d.destroy()
        else
            set a = Atan2(GetWidgetY(d.target) - y, GetWidgetX(d.target) - x)
            call SetUnitX(d.dummy, x + Cos(a) * Speed(d.level) * PERIOD)
            call SetUnitY(d.dummy, y + Sin(a) * Speed(d.level) * PERIOD)
            call SetUnitFacing(d.dummy, a * 57.296)
        endif
        static /*
        */ if not USE_HASH then
            set h = null
        endif
    endfunction

    private function Actions takes nothing returns nothing
        local unit u = GetTriggerUnit()
        local real x = GetWidgetX(u)
        local real y = GetWidgetY(u)
        local Data d = Data.create()
        set d.t = CreateTimer()
        set d.target = GetSpellTargetUnit()
        set d.dummy = CreateUnit(GetOwningPlayer(u), DUMMY, x, y, Atan2(GetWidgetY(d.target) - y, GetWidgetX(d.target) - x))
        set d.level = GetUnitAbilityLevel(u, ABILITY)
        static /*
        */ if USE_HASH then
            call SaveInteger(Hash, GetHandleId(d.t), 0, d)
        endif
        call TimerStart(d.t, PERIOD, true, function Timer)
        set u = null
    endfunction

    private function Init takes nothing returns nothing
        local trigger trig = CreateTrigger()
        local integer i = 0
        loop
            call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
            exitwhen i == 11
            set i = i + 1
        endloop
        call TriggerAddCondition(trig, Condition(function Conditions))
        call TriggerAddAction(trig, function Actions)
        set trig = null
    endfunction
endscope

Добавлено (21 Августа 2012, 11:31:17)
---------------------------------------------
Вот. С хэшем и без.


 

Ty3uKДата: Вторник, 21 Августа 2012, 20:13:59 | Сообщение # 19
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
автору нужно юзать дефайны
а то имхо глобалки с данными для спелла это конченое гониво

Добавлено (21 Августа 2012, 20:13:59)
---------------------------------------------
а, вы же тут на чистом вексо-жассе пишете


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DreiiДата: Вторник, 21 Августа 2012, 23:59:03 | Сообщение # 20
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Хватит
Quote (|SeKtOR|)
лучше обнулять локальные переменные по максимуму(занимают тоже память)

Code

real r=100.
r=+100*2500
//action
r=0.
int i=100500
i++
//action
i=0
bool b=true
//
b=false
//
player p=Player(GetRandomInt(1,11))
//
p=Player(0)



БОЛЬФЕ НИ ЛОГАЕДД!!


 

SirNikolasДата: Среда, 22 Августа 2012, 06:26:44 | Сообщение # 21
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Dreii)
r=+100*2500
Syntax error, как бы. JASS не позволяет явно задавать знак плюс перед числом.
Quote (Dreii)
//
p=Player(0)
lol
Quote (Ty3uK)
а, вы же тут на чистом вексо-жассе пишете
Забавно, теперь вексо-жасс называют чистым. :)


 

Ty3uKДата: Среда, 22 Августа 2012, 07:29:44 | Сообщение # 22
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
чистом - без Си
консультировался с Нафаней - игрока обнулять надо =Р


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Среда, 22 Августа 2012, 09:04:53 | Сообщение # 23
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Ty3uK)
игрока обнулять надо
Но не так же!


 

Ty3uKДата: Среда, 22 Августа 2012, 09:35:57 | Сообщение # 24
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
я всегда обнулял
и Нафаня советовал
А он у тоадкопа спрашивал

Добавлено (22 Августа 2012, 09:35:57)
---------------------------------------------
вроде как у него


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Среда, 22 Августа 2012, 10:34:42 | Сообщение # 25
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Я про то, что установка значения в Player(0) - это не обнуление.

 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] this - непонятно
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz