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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: PUVer, SirNikolas, Ty3uK  
[ВАЖНО] Помощь по JASS
DoctorGesterДата: Среда, 24 Февраля 2010, 22:50:10 | Сообщение # 201
6 уровень
Группа: Проверенные
Сообщений: 209
Награды: 0
Репутация: 50
Блокировки:
Ооооооо, где берутся такие гении?
xgm.ru/forum/showthread.php?t=18742
xgm.ru/project.php?id=100&page=jass_local_vars
 

SvyagaДата: Среда, 24 Февраля 2010, 23:00:26 | Сообщение # 202
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (DoctorGester)
Ооооооо, где берутся такие гении?
xgm.ru/forum/showthread.php?t=18742
xgm.ru/project.php?id=100&page=jass_local_vars

Вот цитата из твоего тутора:
Quote
неудаленный обьект - к примеру мы использовали констуркцию
Код:
local location l=GetSpellTargetLoc()
после этого мы обязаны удалить эту локацию, иначе память отведенная под нее не освободиться и она будет все время "висеть". более того неудаленный юнит будет грузить движок - и как результат лаги.

То же относится и к таймеру. И если ты так веришь указанному тутору(мне он не оч понра, на хайве имхо лучше, хоть и на англ.), то ты просто обязан удалить таймер :D


Сообщение отредактировал Svyaga - Среда, 24 Февраля 2010, 23:02:02
 

DoctorGesterДата: Среда, 24 Февраля 2010, 23:02:57 | Сообщение # 203
6 уровень
Группа: Проверенные
Сообщений: 209
Награды: 0
Репутация: 50
Блокировки:
Ааааа, чтобы система перестала работать? Тогда да.
 

SvyagaДата: Среда, 24 Февраля 2010, 23:07:01 | Сообщение # 204
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (DoctorGester)
Ааааа, чтобы система перестала работать? Тогда да.

ВОТ Ё-МОЁ:
Quote (Dragon93)
Svyaga, а не реально в функции "а" ловить хэндл этого таймера через GetExpiredTimer() ?,а потом удалять
таймер будет удалён,проверено
это ещё кот доказал

Добавлено (24-02-2010, 23:07)
---------------------------------------------
О да, кстати, вот ещё, из того же тутора :D

Quote

Код:
local unit u=GetTriggerUnit()
// ---> ---> --->
set u=null

медленне чем

Код:
call GetTriggerUnit()
call GetTriggerUnit()

т.е. если вам надо вызвать какую либо функцию несколько раз, крепко подумайте, стоит ли ее результат заносить в локальную переменную.


Так что извини, но я был прав насчёт локалки :D
 

DragoNДата: Среда, 24 Февраля 2010, 23:48:52 | Сообщение # 205
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (Svyaga)
Так что извини, но я был прав насчёт локалки :D

в теории так,но практика показывает что в некоторых случаях куда удобнее юзать локалки
+ на современных(например интеловских) так особенно не ощущается разница,офк если у тебя не over9000 вызовов на один такт процессора или в очень короткое время(~0.001с)


El Psy Congroo
 

SvyagaДата: Среда, 24 Февраля 2010, 23:55:29 | Сообщение # 206
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (Dragon93)
в теории так,но практика показывает что в некоторых случаях куда удобнее юзать локалки

Ну например когда я убрал подобные локалки из своей карты, то она минимум раза в 1.5 стала меньше лагать, особенно при первом использовании какой-либо функции. Да, в некоторых случаях их очень удобно использовать. Вот например когда я использую:
-Назначить спецэффект чтоб потом его уничтожить (со временем т.е.)
-Назначить созданного юнита чтоб спокойно с ним выполнять действия
-Использования типа: если условие выполняется то сделать локалку = 1, если нет, то локалка = 2, а потом с этой локалкой выполнять действия.
Ну есть и ещё, но я отхожу от темы=) Так что всё)
Quote (Dragon93)
+ на современных(например интеловских) так особенно не ощущается разница,офк если у тебя не over 9000 вызовов на один такт процессора или в очень короткое время

Ну то что не ощущается разница это не значит что её нет=) Тем более мы говорили не о том насколько она ощущается, а о правильности использования. И ТЕМ БОЛЕЕ у мя комп средненький xD
 

Ramazan(off)Дата: Понедельник, 01 Марта 2010, 19:03:10 | Сообщение # 207
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 775
Блокировки:
В чем ошибка? Спелл не работает...
Quote (Jass)
function Trig_MoveUnitBack_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction

function Trig_MoveUnitBack_Timer takes nothing returns nothing
// Заносим цель спелла в локалку.
local unit u = GetSpellTargetUnit()
// Угол тоже занесём в локальную переменную. Т.к. буде поворачивать спиной, отнимаем от него 180.
local real a = GetUnitFacing(u) - 180
// Коорды.
local real x = GetUnitX(u) + 20. * Cos(a * .0174532)
local real y = GetUnitY(u) + 20. * Sin(a * .0174532)
// Двигаем.
call SetUnitX(u,x)
call SetUnitY(u,y)
// Если откинули уже на нужное расстояние, то стоп мотор!
if udg_distance > SquareRoot((GetUnitX(u) - udg_targetx) * (GetUnitX(u) - udg_targetx) + (GetUnitY(u) - udg_targety) * (GetUnitY(u) - udg_targety)) then
// Унпаузим цель...
call PauseUnit(GetSpellTargetUnit(),false)
call PauseTimer(GetExpiredTimer())
call DestroyTimer(GetExpiredTimer())
endif
endfunction

function Trig_MoveUnitBack_Actions takes nothing returns nothing
local timer t = CreateTimer()
// Отправляем юнита-кастера в переменную.
set udg_caster = GetSpellAbilityUnit()
// Отброс на 500 пусть будет.
set udg_distance = 500
// Исходные позиции сейвим в глобалки.
set udg_targetx = GetSpellTargetX()
set udg_targety = GetSpellTargetY()
// Паузим цель...
call PauseUnit(GetSpellTargetUnit(),true)
// Запускаем таймер...
call TimerStart(t,0.04,true,function Trig_MoveUnitBack_Timer)
endfunction

//===========================================================================
function InitTrig_MoveUnitBack takes nothing returns nothing
set gg_trg_MoveUnitBack = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_MoveUnitBack,EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(gg_trg_MoveUnitBack,Condition(function Trig_MoveUnitBack_Conditions))
call TriggerAddAction(gg_trg_MoveUnitBack,function Trig_MoveUnitBack_Actions)
endfunction

 

DiR94Дата: Понедельник, 01 Марта 2010, 20:13:28 | Сообщение # 208
5 уровень
Группа: Проверенные
Сообщений: 133
Награды: 0
Репутация: 59
Блокировки:
Выдает в этом коде:

выдает следующие ошибки:

Цветами в коде помечены:
141 строка - оранжевым
146 строка - желтым
148 строка - зеленым
166 строка - фиолетовым
169 строка - серым
181 строка - синим
182 строка - красным

PS: извините за красный цвет, других цветов не было.

 

SvyagaДата: Понедельник, 01 Марта 2010, 20:41:25 | Сообщение # 209
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (Ramazan(off))
В чем ошибка? Спелл не работает...

Ну во-первых нет такой функции как GetSpellTargetX или GetSpellTargetY. Во-вторых спелл не муи. "set udg_caster = GetSpellAbilityUnit()" вообще не пойму для чего сделан, ибо нигде не используется. Исправил кое-что, но не полностью уверен, потести. (кроме исправлений также оптимизировал) Если есть вопросы - задавай =)
Code
scope MoveUnitBack initializer Init
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
endfunction

private function Timer takes integer D, real x1, real y1 returns nothing
  local real a = GetUnitFacing(GetSpellTargetUnit()) - 180
  local real x2 = GetUnitX(GetSpellTargetUnit()) + 20. * Cos(a * .0174532)
  local real y2 = GetUnitY(GetSpellTargetUnit()) + 20. * Sin(a * .0174532)
     call SetUnitX(GetSpellTargetUnit(),x2)
     call SetUnitY(GetSpellTargetUnit(),y2)
     if D > SquareRoot((GetUnitX(GetSpellTargetUnit()) - x1) * (GetUnitX(GetSpellTargetUnit()) - x1) + (GetUnitY(GetSpellTargetUnit()) - y1) * (GetUnitY(GetSpellTargetUnit()) - y1)) then
       call PauseUnit(GetSpellTargetUnit(),false)
       call DestroyTimer(GetExpiredTimer())
     endif
endfunction

private function Trig_MoveUnitBack_Actions takes nothing returns nothing
     call PauseUnit(GetSpellTargetUnit(),true)
     call TimerStart( CreateTimer(),0.04,true,function Timer( 500, GetUnitX(GetSpellTargetUnit()), GetUnitY(GetSpellTargetUnit()) )
endfunction

//===========================================================================
private function Init takes nothing returns nothing
  local trigger t  = CreateTrigger()
     call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_CAST)
     call TriggerAddCondition(t,Condition(function Conditions))
     call TriggerAddAction(t,function Actions)
  set t = null
endfunction  
endscope
 

DragoNДата: Понедельник, 01 Марта 2010, 21:02:53 | Сообщение # 210
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (Svyaga)
нет такой функции как GetSpellTargetX или GetSpellTargetY

лол
они появились в новом патче


El Psy Congroo
 

SvyagaДата: Понедельник, 01 Марта 2010, 21:07:47 | Сообщение # 211
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (Dragon93)
они появились в новом патче

патче чего? Прост пишу спеллы и системы через jngp, и там не показывает эти функции
Quote (Dragon93)
лол

Ну извиняйте уж <_<


Сообщение отредактировал Svyaga - Понедельник, 01 Марта 2010, 21:08:49
 

DragoNДата: Понедельник, 01 Марта 2010, 21:22:37 | Сообщение # 212
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Svyaga, поставь Хорус
там подсветка функций из 1.24 и cJass синтаксиса


El Psy Congroo
 

DoctorGesterДата: Понедельник, 01 Марта 2010, 23:15:58 | Сообщение # 213
6 уровень
Группа: Проверенные
Сообщений: 209
Награды: 0
Репутация: 50
Блокировки:
Ладно не разводим холивар, но ты считаешь что 9 вызовов одной и той же функции лучше одной локалки? ОО

Добавлено (01-03-2010, 23:15)
---------------------------------------------
И вообще пишите на вжасс, он удобней. Сжасс тоже хорошо, но код плохо читабельный на нем, хотя и короткий.

 

DragoNДата: Понедельник, 01 Марта 2010, 23:17:25 | Сообщение # 214
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Ramazan(off), мб не правильно подставил равкод?О_О

El Psy Congroo
 

[DUОS]Дата: Вторник, 02 Марта 2010, 00:04:03 | Сообщение # 215
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
DiR94,
Code
function Trig_Choose_Conditions takes nothing returns boolean
     return GetUnitTypeId(GetEnteringUnit()) == 0x65777370
endfunction

function IsUnitHero takes nothing returns boolean
     return IsUnitType(GetFilterUnit(),UNIT_TYPE_HERO) == true
endfunction

function NumberOfRect takes unit ent returns integer
     local integer i1 = 1
     local integer a
     loop
         exitwhen i1 > 8
         if RectContainsCoords(udg_Resp[i1],GetUnitX(ent),GetUnitY(ent)) then
             set a = i1
         endif
         set i1 = i1 + 1
     endloop
     return a
endfunction

function Help1 takes nothing returns nothing
     set udg_TEMP_UNIT_1 = GetEnumUnit()
endfunction

function Trig_Choose_Actions takes nothing returns nothing
     local group g = CreateGroup()
     local unit u
     local unit u2
     local unit svet = GetEnteringUnit()
     local player p = GetOwningPlayer(svet)
     local real x
     local real y
     local integer NumRect = NumberOfRect(svet)
     call RemoveUnit(svet)
     call GroupEnumUnitsInRect(g,udg_Resp[NumRect],Filter(function IsUnitHero))
     call ForGroup(g,function Help1)
     set u = udg_TEMP_UNIT_1
     call ShowUnit(u,false)
     if IsPlayerAlly(p,Player(0)) == true then
         set u2 = CreateUnit(p,GetUnitTypeId(u),GetRectCenterX(gg_rct_base1resp),GetRectCenterY(gg_rct_base1resp),270.)
     else
         set u2 = CreateUnit(p,GetUnitTypeId(u),GetRectCenterX(gg_rct_base2resp),GetRectCenterY(gg_rct_base2resp),270.)
     endif
     set x = GetUnitX(u2)
     set y = GetUnitY(u2)
     if GetLocalPlayer() == p then
         call PanCameraTo(x,y)
     endif
     call CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_Choosing_Area,true,false)
     if IsPlayerAlly(p,Player(0)) == true then
         call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_base1resp,true,false))
         call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_EnterBase1,true,false))
     else
         call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_base2resp,true,false))
         call FogModifierStart(CreateFogModifierRect(p,FOG_OF_WAR_VISIBLE,gg_rct_EnterBase2,true,false))
     endif
     call DestroyGroup(g)
     set u = null
     set u2 = null
     set svet = null
     set p = null
endfunction

//===========================================================================
function InitTrig_Choose takes nothing returns nothing
     set gg_trg_Choose = CreateTrigger()
     call TriggerRegisterEnterRectSimple(gg_trg_Choose,udg_Resp[1])
     call TriggerRegisterEnterRectSimple(gg_trg_Choose,udg_Resp[2])
     call TriggerRegisterEnterRectSimple(gg_trg_Choose,udg_Resp[3])
     call TriggerRegisterEnterRectSimple(gg_trg_Choose,udg_Resp[4])
     call TriggerRegisterEnterRectSimple(gg_trg_Choose,udg_Resp[5])
     call TriggerRegisterEnterRectSimple(gg_trg_Choose,udg_Resp[6])
     call TriggerRegisterEnterRectSimple(gg_trg_Choose,udg_Resp[7])
     call TriggerRegisterEnterRectSimple(gg_trg_Choose,udg_Resp[8])
     call TriggerAddCondition(gg_trg_Choose,Condition(function Trig_Choose_Conditions))
     call TriggerAddAction(gg_trg_Choose,function Trig_Choose_Actions)
endfunction

Вот, извёл 10 минут на очистку кода. Только создай у себя глобальную переменную TEMP_UNIT_1 типа "Боевая единица", иначе снова ошибки будут)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

SvyagaДата: Вторник, 02 Марта 2010, 07:12:13 | Сообщение # 216
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (DoctorGester)
Ладно не разводим холивар, но ты считаешь что 9 вызовов одной и той же функции лучше одной локалки? ОО

Ну во-первых никакого холивара и не было, а просто обсуждение.
Во-вторых, насчёт локалок уже был спор в этой же теме, и было теоретически и примером из тутора доказано что намного быстрее использовать так как я предложил (и доказано было мной ^_^ ), почитай на 2-3 предыдущих страницах (не помню точно сколько)
Quote (DoctorGester)
И вообще пишите на вжасс, он удобней. Сжасс тоже хорошо, но код плохо читабельный на нем, хотя и короткий.

А где ты видел сжасс? о_О

Добавлено (02-03-2010, 07:12)
---------------------------------------------

Quote (|DUОS|)
Вот, извёл 10 минут на очистку кода. Только создай у себя глобальную переменную TEMP_UNIT_1 типа "Боевая единица", иначе снова ошибки будут)

Ненужные локальные и использование BJ функций в инициализации. А TEMP_UNIT_1 можно в код дописать как:
Code
globals
    unit TEMP_UNIT_! = null
endglobals

И в использовании просто убрать "udg_"


Сообщение отредактировал Svyaga - Вторник, 02 Марта 2010, 08:20:04
 

DoctorGesterДата: Вторник, 02 Марта 2010, 09:15:50 | Сообщение # 217
6 уровень
Группа: Проверенные
Сообщений: 209
Награды: 0
Репутация: 50
Блокировки:
Svyaga, ты потрясающ. Твое чсв просто зашкаливает. Я гляжу ты самый тру кодер на сайте. Ты случайно в близард не работал?
А теперь мой пример.
Есть некая система, которая может повесить на юнита таймер. В действиях таймера 7 локалок. Система спокойно держит около 30 юнитов на моем компе с процессором 1.4 ггц. Специально убрал все локалки и производил все расчеты прямо в функции. При 8 юнитах игра превращается в пошаговою стратегию. Причем все на нативках.
Я не видел здесь сжасс, я лишь сказал на чем лучше писать.
 

SvyagaДата: Вторник, 02 Марта 2010, 09:23:20 | Сообщение # 218
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (DoctorGester)
Svyaga, ты потрясающ. Твое чсв просто зашкаливает. Я гляжу ты самый тру кодер на сайте. Ты случайно в близард не работал?

Без комментариев, ибо небольшая провокация. Лишь скажу что утверждаю то что знаю, и в этом нет ничего "такого". Во всех туторах о джасс и локалках (да так и есть) указано что быстрее работает, если много раз использовать одну и ту же нативу, чем занести её в локалку и затем использовать, а затем обнулять локалку.
Quote (DoctorGester)
Есть некая система, которая может повесить на юнита таймер. В действиях таймера 7 локалок. Система спокойно держит около 30 юнитов на моем компе с процессором 1.4 ггц. Специально убрал все локалки и производил все расчеты прямо в функции. При 8 юнитах игра превращается в пошаговою стратегию. Причем все на нативках.

Систему в студию.
И вот мой пример: у меня в карте раньше было много локалок, подобных этим (т.е. ненужных), всего было около 60 тригов (может больше), и в каждом по 5-8 таких локалок. После того как я их все убрал, многие лаги уменьшились раза в полтора, а некоторые и вообще исчезли.


Сообщение отредактировал Svyaga - Вторник, 02 Марта 2010, 10:45:58
 

Ramazan(off)Дата: Вторник, 02 Марта 2010, 14:26:03 | Сообщение # 219
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 775
Блокировки:
Svyaga, нужен спелл отталкивание юнита назад без JNGP. Т.к. делаю карту в WE (Sacred RPG).
В общем спелл таков: Отталкивание происходит как у баратрума в доте.
 

SvyagaДата: Вторник, 02 Марта 2010, 14:30:33 | Сообщение # 220
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (Ramazan(off))
Svyaga, нужен спелл отталкивание юнита назад без JNGP. Т.к. делаю карту в WE (Sacred RPG).
В общем спелл таков: Отталкивание происходит как у баратрума в доте.

Ммм... Всё что я сделал это оптимизировал твою систему (т.е. сделал её короче и быстрее, мог бы ещё 3 локалки убрать, но тогда функция выглядела слишком длинной), так что не думаю что повлияет jngp у тебя или нет.
А что, твоя система не работает?
Отталкивание я делать не пробовал, так как пока мне это не нужно было. Но посмотрю что можно сделать.
 

Ramazan(off)Дата: Вторник, 02 Марта 2010, 14:37:42 | Сообщение # 221
11 уровень
Группа: Проверенные
Сообщений: 1670
Награды: 1
Репутация: 775
Блокировки:
Quote (Svyaga)
А что, твоя система не работает?

Именно выдает ошибки компиляции. Ты пожалуйста тести без JNGP)
 

SvyagaДата: Вторник, 02 Марта 2010, 14:41:20 | Сообщение # 222
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Quote (Ramazan(off))
Именно выдает ошибки компиляции. Ты пожалуйста тести без JNGP)

Проблема в том что я не тестил :D А какие ошибки-то?
 

[DUОS]Дата: Вторник, 02 Марта 2010, 15:27:18 | Сообщение # 223
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Svyaga,
Ну сколько, сколько раз тут повторять - никаких vJass-примочек и JNGP!
Жалуются же на это, ё моё... а все джассеры не юзают JNGP и vJass.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

SvyagaДата: Вторник, 02 Марта 2010, 15:31:51 | Сообщение # 224
7 уровень
Группа: Проверенные
Сообщений: 472
Награды: 0
Репутация: 65
Блокировки:
Почему "никаких vJass-примочек и JNGP!"? о_О Да и впервые подобное вижу.
"а все джассеры не юзают JNGP и vJass. " Слово "все" значит все, а не все кого знаешь.
Да и почему?
P.S.Написал бы в ЛС, но у тя заблокировано.
 

DiR94Дата: Вторник, 02 Марта 2010, 15:46:53 | Сообщение # 225
5 уровень
Группа: Проверенные
Сообщений: 133
Награды: 0
Репутация: 59
Блокировки:
[DUОS], спасибо большое тебе за правку кода :)
Слушай, а ты можешь указать на ошибки? Даже не то, чтобы указать, а сказать, что не так я делаю? Я вижу ты заменил все функции, использующие точки, функциями с координатами. Почему лучше использовать координаты, а не точки? Можешь объяснить какую-то логику при написании кода и его оптимизации? Заранее спасибо.


Сообщение отредактировал DiR94 - Вторник, 02 Марта 2010, 15:51:07
 

Поиск:

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