Сейчас 22:01:29 Суббота, 4 февраля, 2023 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » Локальные переменные (Ещё вопросы)
Локальные переменные
FatalBladeДата: Четверг, 14 Июля 2011, 21:09:37 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Я тут почитал пару статей про локальные переменные, но до сих пор несколько вещей не до конца понял:

1) Локальные переменные создают утечки? Их надо удалять?
2) Triggering Unit, Casting Unit, Picked Unit, Last Created Unit, Matching Unit.... Когда я использую их в триггерах, они ведь являются как бы созданными локальными переменными?
3) Triggering Unit, Casting Unit, Picked Unit, Last Created Unit, Matching Unit.... Создают утечки?
4) Если в триггере не присутствует никаких Wait'ов или Таймеров, т.е. пауз, то использование локальных переменных не нужно для "универсальности". Так?

Ниже написанны действия триггера, который проверяет тип героя и тип предмета, и определяет может ли герой его носить. Опять же, тут написаны только действия триггера, условия не так важны щас в данной теме... Так много условий....

Actions
Set ItemFailPoint[1] = (Position of (Hero manipulating item))
Unit - Order (Hero manipulating item) to drop (Item being manipulated) at ItemFailPoint[1]
Cinematic - Send transmission to (Player group((Owner of (Hero manipulating item)))) from (Triggering unit) named (Proper name of (Triggering unit)): Play StormBoltLaunch <gen> and
display I cannot carry Swor.... Modify duration: Add 0.00 seconds and Wait
Custom script: call RemoveLocation(udg_ItemFailPoint[1])

В выше-написанных действиях триггера, использование только глобальных поидее не приведёт к путанице, если 2 юнита на карте поднимут 2 одинаковых предмета с земли, а промежуток между 2-мя этими событиями равен буквально доли секунды. Не так ли?




Сообщение отредактировал FatalBlade - Четверг, 14 Июля 2011, 21:17:51
 

AjaccioДата: Четверг, 14 Июля 2011, 21:45:43 | Сообщение # 2
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
Quote (FatalBlade)
1) Локальные переменные создают утечки? Их надо удалять?

Переменные в JASS зачастую являются просто ссылками на различные игровые объекты (юниты, эффекты и так далее).
Если вы даже удалите объект, но не обнулите переменную, указывающею на него, то он останется в памяти, "утечет".

На примере: вы создаете юнита, заносите в переменную, а затем сразу его удаляете через специальную функцию.
Он, однако, не удалится, хотя и станет недоступным! Движок игры будет хранить его до тех пор, пока вы не обнулите все связанные с ним переменные.

Соответственно, если переменная не ссылается на какой-либо объект (ну она целочисленная, реальная или, может, логическая), то обнулять не нужно.

Quote (FatalBlade)
2) Triggering Unit, Casting Unit, Picked Unit, Last Created Unit, Matching Unit.... Когда я использую их в триггерах, они ведь являются как бы созданными локальными переменными?

Нет же, они просто возвращают значения.

Quote (FatalBlade)
3) Triggering Unit, Casting Unit, Picked Unit, Last Created Unit, Matching Unit.... Создают утечки?

Если записать их в переменную, удалить объект, а потом забыть обнулить её... Иначе нет.

Quote (FatalBlade)
4) Если в триггере не присутствует никаких Wait'ов или Таймеров, т.е. пауз, то использование локальных переменных не нужно для "универсальности". Так?

Использовать тот или иной аппарат нужно, когда нужно, если не нужно, то не нужно.
Вообще тут, вероятно, лучше стремиться к лучшей читаемостью кода. buba


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

FatalBladeДата: Четверг, 14 Июля 2011, 22:25:35 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Ajaccio)
Если записать их в переменную, удалить объект, а потом забыть обнулить её... Иначе нет.

Значит и с точками так же?


 

BinGOДата: Пятница, 15 Июля 2011, 03:04:46 | Сообщение # 4
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Со всеми типами-наследниками от handle так. Их обнулять обязательно.
 

[DS]Дата: Пятница, 15 Июля 2011, 09:40:58 | Сообщение # 5
9 уровень
Группа: Проверенные
Сообщений: 1116
Награды: 0
Репутация: 527
Блокировки:
Точки лучше ваще не использовать

 

FatalBladeДата: Пятница, 15 Июля 2011, 10:56:20 | Сообщение # 6
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (B1nGO)
Со всеми типами-наследниками от handle так. Их обнулять обязательно.

Ты не понял. Я знаю что надо удалять и как. Вопрос мой в другом:
Если Triggering Unit, Casting Unit, Picked Unit, Last Created Unit, Matching Unit - не создают утечки если они не записаны в переменные, то почему (Position of (Casting Unit)) создаёт, даже если оно не занесено в переменную? Ведь и точки и юниты - наследники handle.


 

[DS]Дата: Пятница, 15 Июля 2011, 11:05:45 | Сообщение # 7
9 уровень
Группа: Проверенные
Сообщений: 1116
Награды: 0
Репутация: 527
Блокировки:
Position = GetUnitLoc - вызывают утечки, либо ремов call RemoveLocation(GetUnitLoc(GetTriggerUnit()))
А лучше:
GetUnitX(Unit)
GetUnitY(Unit)
тогда и утечек не будет.


 

FaionДата: Пятница, 15 Июля 2011, 12:13:58 | Сообщение # 8
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
Читаем о локалках.

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


Сообщение отредактировал Faion - Пятница, 15 Июля 2011, 12:14:17
 

FatalBladeДата: Пятница, 15 Июля 2011, 14:57:43 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (|DS|)
А лучше:
GetUnitX(Unit)
GetUnitY(Unit)
тогда и утечек не будет.

Мне нужно проверять расстояние между 2-мя юнитами. Раз уж советуешь пользоваться координатами, то подскажи как проверить это расстояние не создавая точки (утечки), т.е. в координатах.


 

[DS]Дата: Пятница, 15 Июля 2011, 15:23:41 | Сообщение # 10
9 уровень
Группа: Проверенные
Сообщений: 1116
Награды: 0
Репутация: 527
Блокировки:
Форум Jass: Полезные функций:

DistanceBetweenCoords.
Находит расстояние между заданными координатами.
function DistanceBetweenCoords takes real x1, real y1, real x2, real y2 returns real
return SquareRoot((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2))
endfunction


 

FatalBladeДата: Пятница, 15 Июля 2011, 15:36:08 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Вот так вот всё просто?)

 

[DS]Дата: Пятница, 15 Июля 2011, 15:41:45 | Сообщение # 12
9 уровень
Группа: Проверенные
Сообщений: 1116
Награды: 0
Репутация: 527
Блокировки:
set x = GetUnitX(UnitCaster)
set y = GetUnitY(UnitCaster)
set x1 = GetUnitX(UnitTarget)
set y1 = GetUnitY(UnitTarget)
set d = DistanceBetweenCoords(x,y,x1,y1)


 

FatalBladeДата: Пятница, 15 Июля 2011, 15:43:30 | Сообщение # 13
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (|DS|)
GetUnitX(Unit)
GetUnitY(Unit)

Кстати только щас возник вопрос.
GetUnitX... Это координата Х точки местонахождения юнита. Что бы вычислить Х какой то точки, для начала нужна САМА ТОЧКА. Значит всё таки точка сохраняется в памяти, т.е. её handle.
Или же эта функция делает 3 вещи:
1 - Сама создаёт точку в позиции юнита
2 - Сохраняет её координату в Real
3 - Затем удаляет точку (RemoveLocation(handle))

Обьясните плз


 

[DS]Дата: Пятница, 15 Июля 2011, 15:51:12 | Сообщение # 14
9 уровень
Группа: Проверенные
Сообщений: 1116
Награды: 0
Репутация: 527
Блокировки:
Quote (FatalBlade)
2 - Сохраняет её координату в Real

Вот это тока делает.


 

AjaccioДата: Пятница, 15 Июля 2011, 16:44:44 | Сообщение # 15
7 уровень
Группа: Проверенные
Сообщений: 299
Награды: 1
Репутация: 239
Блокировки:
Quote (FatalBlade)
Что бы вычислить Х какой то точки, для начала нужна САМА ТОЧКА.

Точка формируется из координат, а не координаты выделяются из точки.
Функции, возвращающие location'ы, сначала берут координаты, потом конструируют объект типа "точка", а потом уже возвращают его вам.


XOR EAX, EAX
MOV EAX, 00H ;; NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.
 

FatalBladeДата: Пятница, 15 Июля 2011, 17:10:40 | Сообщение # 16
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Ок ясно

 

DeadJassДата: Пятница, 15 Июля 2011, 23:06:33 | Сообщение # 17
7 уровень
Группа: Проверенные
Сообщений: 447
Награды: 0
Репутация: 30
Блокировки:
Вместо GetUnitX/Y используем GetWidgetX/Y


^ кликабельно
Archers Of The Island v1.8 - на стадии завершения
 

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

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