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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » Локальные переменные
Локальные переменные
Banzay89Дата: Пятница, 15 Апреля 2011, 17:37:22 | Сообщение # 26
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
Titans, потому что поллед вейт криво работает, сбивая поток триггера
 

TitansДата: Пятница, 15 Апреля 2011, 17:54:18 | Сообщение # 27
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
Banzay89, А каким действием его можно заменить?
 

lawsonДата: Пятница, 15 Апреля 2011, 18:51:29 | Сообщение # 28
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Titans)
А каким действием его можно заменить?

таймером и только им.


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

TitansДата: Пятница, 15 Апреля 2011, 20:15:05 | Сообщение # 29
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
Таймер? И как выгледит его код? (В смысле задать условие на отсчёт времени?)
 

lawsonДата: Пятница, 15 Апреля 2011, 20:17:34 | Сообщение # 30
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
local timer t = CreateTimer()
call TimerStart(t, период, одноразовый\многоразовый(false\true), функция которую таймер должен исполнять по истечению времени).


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


Сообщение отредактировал lawson - Пятница, 15 Апреля 2011, 20:18:06
 

TitansДата: Пятница, 15 Апреля 2011, 20:50:03 | Сообщение # 31
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
lawson к примеру мне надо нанести урон, подаждать 2 сек. и снизить скорость передвижения юнита, то мне придётся создать две функции: в первой снижения скорости юнита, а во второй нанесения урона и запуск таймера с указанием на первую функцию? И что значит "одноразовый\многоразовый"?

Сообщение отредактировал Titans - Пятница, 15 Апреля 2011, 20:51:34
 

lawsonДата: Пятница, 15 Апреля 2011, 21:22:08 | Сообщение # 32
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Titans)
одноразовый
Это значит что функция которую таймер будет выполнять по истечению времения. будет выполняться один раз.
В функциии где ты наносишь урон создай таймер по истечению которого будет выполняться функция где юнит замедляется.


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


Сообщение отредактировал lawson - Пятница, 15 Апреля 2011, 21:24:37
 

TitansДата: Пятница, 15 Апреля 2011, 21:38:00 | Сообщение # 33
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
А как локальные переменные перенести в другую функцию?
Можете показать на примере?
Code
function Move01 takes nothing returns nothing
        if ( RectContainsUnit(Region_move, Hero) == true ) then
            call DoNothing(  )
        else
            call SetUnitManaBJ( Hero, ( GetUnitStateSwap(UNIT_STATE_MANA, Hero) - 20.00 ) )
        endif
endfunction
            
function Move00 takes nothing returns nothing
        local unit Hero = GetEnumUnit()
        local rect Region_move = RectFromCenterSizeBJ(GetUnitLoc(Hero), 30.00, 30.00)
        local timer Wait = CreateTimer()
        if ( GetUnitStateSwap(UNIT_STATE_MANA, Hero) <= 20.00 ) then
            call PauseUnitBJ( true, Hero )
        else
            call TimerStart(Wait, 0.80, false, function Move01)
        endif
endfunction

function Trig_Move_Actions takes nothing returns nothing
        call ForGroupBJ( GetUnitsInRectAll(GetEntireMapRect()), function Move00 )
endfunction

//===========================================================================
function InitTrig_Move takes nothing returns nothing
        set gg_trg_Move = CreateTrigger(  )
        call TriggerRegisterTimerEventPeriodic( gg_trg_Move, 0.80 )
        call TriggerAddAction( gg_trg_Move, function Trig_Move_Actions )
endfunction

Мне надо чтоб функция Move01 имела переменные Hero, Region_move.


Сообщение отредактировал Titans - Пятница, 15 Апреля 2011, 22:09:46
 

lawsonДата: Пятница, 15 Апреля 2011, 23:07:21 | Сообщение # 34
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Вот как должно выглядеть твои функции на норамльном JASS.
Code
function Move00 takes nothing returns nothing
local unit Hero = GetEnumUnit()
local rect Region_Move = Rect(GetUnitX(Hero) - 30, GetUnitY(Hero) - 30, GetUnitX(Hero) + 30, GetUnitY(Hero) + 30)
local timer Wait = CreateTimer()
if (GetUnitState(Hero, UNIT_STATE_MANA) <= 20) then
call PauseUnit(Hero, true)
else
call TimerStart(Wait, 0.80, false, function Move01)
call SaveRectHandle(Hash, GetHandleId(Wait), 0, Region_Move) - сохранит в хеш область вокруг юнита
call SaveUnitHandle(Hash, GetHandleId(Wait), 0, Hero) - сохранит самого юнита в хеш
endif
call RemoveRect(Region_Move)
set Region_Move = null
set wait = null
set Hero = null
endfunction

function Move01 takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = LoadUnitHandle(Hash, GetHandleId(GetExpiredTimer), 0) - загрузит из хеша юнита
local rect r = LoadRectHandle(Hash, GetHandleId(GetExpiredTimer), 0) - загрузит из хеша область вокруг юнита
local unit d
local group g = CreateGroup()
call GroupEnumUnitsInRect(g, r, null)
set d = FirstOfGroup(g)
if (u != d) then
call SetUnitState(u, UNIT_STATE_MANA, GetUnitState(u, UNIT_STATE_MANA) - 20)
endif
call FlushChildHashtable(Hash, GetHandleId(GetExpiredTimer()))
call DestroyGroup(g)
call RemoveRect(r)
set r = null
set g = null
set d = null
set u = null
endfunction


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


Сообщение отредактировал lawson - Пятница, 15 Апреля 2011, 23:07:34
 

FaionДата: Суббота, 16 Апреля 2011, 01:00:06 | Сообщение # 35
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
Quote (Titans)
Можно ли использовать локальные переменные в других триггерах не создовая их снова, как глобальные?

Что бы передать локальные переменные из 1 функции в другую не объявляя их снова и без использования хэша, достаточно сделать функцию которая берет какие то значения.

Прим:

jass2 simple

Code


function B takes unit u, integer i, angle a returns nothing
  ...
endfunction

function A takes nothong returns nothing
  local integer i  
  local unit u
  ...
  call B(u,i)
endfunction

cJass simple

void B(unit u, int i)
{
  ...
}

void A()
{
  int i
  unit u
  ...
  b(u,i)

}

Локалки передавать бесконечно невозможно, т.е. вложенных функций в функцию должно быть не более 3-4(не помню), хотя мб ошибаюсь, но как то столкнулся с тем что вложенные функции тупо отказывались работать из за большого кол-ва.

Так же не советую пренебрегать глобалками, если ими грамотно пользоватся, то они лучше локалок. Для примера, в рамках какой то системы с большим кол-вом функций порой приходится в каждой функции многократно объявлять локалки повторно, в то время как можно было бы использовать набор глобалок. Так же отмечу что далеко не во всех языках локалки быстрее глобалок. В жасс хз как дело с этим обстоит.

Хеш юзать не рекомендую, особенно для длительного хранения больших объемов данных, в особенности если они статичны.


О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL
 

Banzay89Дата: Воскресенье, 17 Апреля 2011, 03:35:49 | Сообщение # 36
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
lawson, положи руку на сердце и скажи - этот твой пример работает?)) думаю нет. нельзя вызывать функцию стоящую ниже, вызываемая функция должна быть сверху (это я топикстартеру говорю на всякий)
 

lawsonДата: Воскресенье, 17 Апреля 2011, 16:22:08 | Сообщение # 37
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Banzay89,
Да ладно правда, я тебе честно говорю что сработает.


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


Сообщение отредактировал lawson - Воскресенье, 17 Апреля 2011, 16:24:21
 

TitansДата: Суббота, 07 Мая 2011, 22:50:32 | Сообщение # 38
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
Ещё один вопрос по локальным переменным.
Как правильно записат локальную переменную типа "integer array"?
Сначала её надо объявить, а потом присваивать где надо?
У меня в триггере она не работает, тоесть я сначала объявляю её, потом проверяю что в ней записано, а потом присваиваю.


Сообщение отредактировал Titans - Суббота, 07 Мая 2011, 22:54:30
 

DreiiДата: Суббота, 07 Мая 2011, 23:13:07 | Сообщение # 39
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Titans, пример:
Code
local integer i=0
local integer array d
loop
exitwhen i==10
set d[i]=GetRandomInt(0,30)
set i=i+1
endloop


 

lawsonДата: Суббота, 07 Мая 2011, 23:23:23 | Сообщение # 40
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Titans,
Мда тебе еще основы надо читать.
Переменные с массивами сначала объявляються а только потом устанавливать в них значения.
Такие перменные должны указываться с номером ячейки(целоисчислительная) в которую ты записываешь значение.


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


Сообщение отредактировал lawson - Суббота, 07 Мая 2011, 23:23:44
 

TitansДата: Воскресенье, 08 Мая 2011, 00:09:02 | Сообщение # 41
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
А так можно?
Code
local integer array A
if (A >= 10)
call DisableTrigger( GetTriggeringTrigger() )  
endif
set A[0] = A[0] + 1
set A[1] = A[1] + 1

Добавлено (08-05-2011, 00:09)
---------------------------------------------
А всё sorry, забыл "then" дописать и из за этого не работала переменная, хотя при сохранении карты We не выдал ошибки.

 

lawsonДата: Воскресенье, 08 Мая 2011, 01:00:52 | Сообщение # 42
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Нет так нельзя. У переменной массива всегда должен быть номер ячейки в которую записано знчение.
тоесть в твоем случае
local array integer i
set i[0] = 10
if (i[0] >= 10) then
call DisabelTrigger()
endif
set i[0] = i[0] + 1
set i[1] = i[0] + 1
set i[2] = i[0] + i[1]
i - переменная []- здесь указываеться номер ячейки, [1] - 1 - это номер ячейки.


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


Сообщение отредактировал lawson - Воскресенье, 08 Мая 2011, 01:02:27
 

TitansДата: Воскресенье, 08 Мая 2011, 10:39:06 | Сообщение # 43
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
Вообще мне надо примерно так:
Code
local integer array A  
  if (A[0] + A[1] + A[2] >= 10) then
  call DisableTrigger( GetTriggeringTrigger() )   
  else
  set A[0] = A[0] + 1  
  set A[1] = A[1] + 1
  set A[2] = A[2] + 1
  endif

Ещё я сделал вывод значения переменной "A" в игре и она всегда показывает 1, почему?
 

SirNikolasДата: Воскресенье, 08 Мая 2011, 11:07:31 | Сообщение # 44
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Нужно обязательно инициализировать переменные (присвоить им начальные значения).

 

TitansДата: Воскресенье, 08 Мая 2011, 11:41:03 | Сообщение # 45
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
SirNikolas, так пойдёт?
Code
local integer array A
set A[0] = A[0]
set A[1] = A[1]
set A[2] = A[2]
if (A[0] + A[1] + A[2] >= 10) then   
call DisableTrigger( GetTriggeringTrigger() )     
else   
set A[0] = A[0] + 1    
set A[1] = A[1] + 1   
set A[2] = A[2] + 1   
endif


Сообщение отредактировал Titans - Воскресенье, 08 Мая 2011, 11:41:53
 

SirNikolasДата: Воскресенье, 08 Мая 2011, 11:43:37 | Сообщение # 46
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Естественно, нет.
Code
set A[0] = 0
set A[1] = 0
set A[2] = 0


 

DreiiДата: Воскресенье, 08 Мая 2011, 11:43:41 | Сообщение # 47
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Quote (Titans)
set A[0] = A[0] set A[1] = A[1] set A[2] = A[2]

лолшо?


 

SirNikolasДата: Воскресенье, 08 Мая 2011, 11:44:20 | Сообщение # 48
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Dreii)
лолшо?
function KillThread takes nothing returns nothing


 

DreiiДата: Воскресенье, 08 Мая 2011, 11:45:45 | Сообщение # 49
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Quote (SirNikolas)
set A[0] = 0 set A[1] = 0 set A[2] = 0

лучше циклом офк
Code
local integer i=0
local integer array A
loop
exitwhen i==2
set A[i]=0
set i=i+1
endloop

Добавлено (08-05-2011, 11:45)
---------------------------------------------

Quote (SirNikolas)
function KillThread takes nothing returns nothing

:D


 

TitansДата: Воскресенье, 08 Мая 2011, 11:59:22 | Сообщение # 50
6 уровень
Группа: Проверенные
Сообщений: 167
Награды: 0
Репутация: 77
Блокировки:
Можно на этой функции показать?
 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » Локальные переменные
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

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