|
|
|
|
[ВАЖНО] Общалка кодеров
|
|
Pebbles | Дата: Четверг, 09 Мая 2013, 13:14:24 | Сообщение # 201 |
7 уровень
Группа: Проверенные
Сообщений: 258
Награды: 0
Репутация: 1335
Блокировки:
| Зачем квадратные корни и произведения, есть же обычная функция для взятия расстояния между точками?
Yabba Dabba Doo!
|
|
|
|
Bru | Дата: Четверг, 09 Мая 2013, 13:15:55 | Сообщение # 202 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Стоп. Какая ?
|
|
|
|
bornikkeny | Дата: Четверг, 09 Мая 2013, 14:27:14 | Сообщение # 203 |
5 уровень
Группа: Проверенные
Сообщений: 107
Награды: 0
Репутация: 81
Блокировки:
| Pebbles, между точками очень не удобно, лучше по координатам.
|
|
|
|
Bru | Дата: Четверг, 09 Мая 2013, 14:42:11 | Сообщение # 204 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| bornikkeny, это твой код в моём варианте, если ты понял
|
|
|
|
bornikkeny | Дата: Четверг, 09 Мая 2013, 15:15:19 | Сообщение # 205 |
5 уровень
Группа: Проверенные
Сообщений: 107
Награды: 0
Репутация: 81
Блокировки:
| Bru, приму за комплимент ;) Но могу сказать, что можно снять с триггера, и прицепить на таймеры.
|
|
|
|
Pebbles | Дата: Четверг, 09 Мая 2013, 19:03:47 | Сообщение # 206 |
7 уровень
Группа: Проверенные
Сообщений: 258
Награды: 0
Репутация: 1335
Блокировки:
| Чем неудобно? Что утечки надо удалять? Bru, математика - дистанция
Yabba Dabba Doo!
|
|
|
|
bornikkeny | Дата: Четверг, 09 Мая 2013, 19:31:36 | Сообщение # 207 |
5 уровень
Группа: Проверенные
Сообщений: 107
Награды: 0
Репутация: 81
Блокировки:
| Pebbles, ну да, точнее - точки. Я вообще точки не люблю, еще со времен GUI я не часто их юзал ;)
|
|
|
|
SirNikolas | Дата: Четверг, 09 Мая 2013, 19:40:57 | Сообщение # 208 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Цитата (Bru) call GroupEnumUnitsInRange(g, GetUnitX(u[1]), GetUnitY(u[1]), 1000.0, (IsPlayerEnemy(Player(12), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405)) В JASS2 нет замыканий. Разве что через cJass:Код GroupEnumUnitsInRange(g, GetWidgetX(u[1]), GetWidgetY(u[1]), 1000., \ lambda bool() { return IsPlayerEnemy(Player(12), GetOwningPlayer(GetFilterUnit())) && GetWidgetLife(GetFilterUnit()) > .405); } ); Цитата (Bru) ForGroup(udg_group, function simpleaiFunc) Пропущено call, без AdicHelper не скомпилируется. Впрочем, это к автору кода.
Заменил группу враждебных юнитов массивом и провел небольшие оптимизации:Код //globals //constant group udg_G = CreateGroup() //unit array udg_SimpleAI_Creeps //integer udg_SimpleAI_CreepCount = 0 //endglobals
function Trig_SimpleAI_Period takes nothing returns real return .5 endfunction
function Trig_SimpleAI_SquareRadius takes nothing returns real return 1000000. endfunction
function Trig_SimpleAI_Conditions takes nothing returns boolean return IsUnitEnemy(GetFilterUnit(), Player(12)) and GetWidgetLife(GetFilterUnit()) > .405 endfunction
function Trig_SimpleAI_Actions takes nothing returns nothing local integer i = udg_SimpleAI_CreepCount local unit target = null local unit u local real dist local real x local real y local real dx local real dy loop exitwhen i == 0 set i = i - 1 set dist = Trig_SimpleAI_SquareRadius() set x = GetWidgetX(udg_SimpleAI_Creeps[i]) set y = GetWidgetY(udg_SimpleAI_Creeps[i]) call GroupEnumUnitsInRange(udg_G, x, y, dist, Filter(function Trig_SimpleAI_Conditions)) loop set u = FirstOfGroup(udg_G) exitwhen u == null call GroupRemoveUnit(udg_G, u) set dx = GetWidgetX(u) - x set dy = GetWidgetY(u) - y if dx * dx + dy * dy < dist then set dist = dx * dx + dy * dy set target = u endif endloop call IssueTargetOrderById(udg_SimpleAI_Creeps[i], 851983, target) set target = null endloop endfunction
function InitTrig_SimpleAI takes nothing returns nothing call TimerStart(CreateTimer(), Trig_SimpleAI_Period(), true, Trig_SimpleAI_Actions) endfunction Код удаления крипа из массива при смерти:Код function Trig_SimpleAI_Remove takes nothing returns nothing local unit u = GetTriggerUnit() local integer i = udg_SimpleAI_CreepCount loop exitwhen i == 0 set i = i - 1 if u == udg_SimpleAI_Creeps[i] then set udg_SimpleAI_CreepCount = udg_SimpleAI_CreepCount - 1 set udg_SimpleAI_Creeps[i] = udg_SimpleAI_Creeps[udg_SimpleAI_CreepCount] exitwhen true endif endloop set u = null endfunction
function InitTrig_SimpleAI_Remove takes nothing returns nothing local trigger trig = CreateTrigger() call TriggerRegisterPlayerUnitEvent(trig, Player(12), EVENT_PLAYER_UNIT_DEATH, null) call TriggerAddAction(trig, function Trig_SimpleAI_Remove) set trig = null endfunction Код добавления крипа в массив:Код set udg_SimpleAI_Creeps[udg_SimpleAI_CreepCount] = u set udg_SimpleAI_CreepCount = udg_SimpleAI_CreepCount + 1
|
|
|
|
bornikkeny | Дата: Четверг, 09 Мая 2013, 19:51:35 | Сообщение # 209 |
5 уровень
Группа: Проверенные
Сообщений: 107
Награды: 0
Репутация: 81
Блокировки:
| SirNikolas, вот блин, и в правду я пропустил "call"... Как-то стыдно.
|
|
|
|
Bru | Дата: Пятница, 10 Мая 2013, 17:50:58 | Сообщение # 210 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Дурацкий выбор героя светлячком. Код //globals //unit array Hero - после выбора - выбранный игроком герой. //unit sv - светлячки //unit h - герои, которых можно выбрать //rect array spawnrect - точки спауна для разных игроков //rect array r - точки возле героев, которых можно выбрать //endglobals //multiplayer!
function Trig_pickHero_Actions takes nothing returns nothing local real lx local real ly local integer i = 1 local integer intos = 1 loop lx = GetWidgetX(udg_sv[intos]) ly = GetWidgetY(udg_sv[intos]) if (lx < GetRectMaxX(udg_r[i]) and lx > GetRectMinX(udg_r[i])) and (ly < GetRectMaxY(udg_r[i]) and ly > GetRectMinY(udg_r[i])) then call RemoveUnit( udg_sv[intos] ) set udg_Hero[intos] = udg_h[i] call SetUnitOwner( udg_Hero[intos], GetOwningPlayer(udg_sv[intos]), true ) call SetUnitPositionLoc( udg_Hero[intos], Location(GetRectCenterX(udg_spawnrect[intos]), GetRectCenterY(udg_spawnrect[intos]))) endif set i = i + 1 set intos = intos + 1 if intos == 12 then set intos = 1 endif if i == 100 then set i = 1 endif exitwhen i == null endloop endfunction
//=========================================================================== function InitTrig_pickHero takes nothing returns nothing set gg_trg_pickHero = CreateTrigger() call TriggerRegisterTimerEvent(gg_trg_pickHero, 0.4, true) call TriggerAddAction( gg_trg_pickHero, function Trig_pickHero_Actions ) endfunction Ограничение героев - 100. Игроков - 12. Скажите почему я могу выбрать только первого героя, а остальных нет? Скорее всего это значит, что i останавливается на единице. Вот карта.
|
|
|
|
Волчачка | Дата: Пятница, 10 Мая 2013, 18:07:49 | Сообщение # 211 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Код if i == 100 then set i = 1 endif exitwhen i == null
|
|
|
|
SirNikolas | Дата: Пятница, 10 Мая 2013, 19:15:04 | Сообщение # 212 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Bru, почему бы не использовать TriggerRegisterEnterRegion? Добавлено (10 Мая 2013, 19:15:04) --------------------------------------------- И да, сравнение integer (равно как и boolean) с null - плохой тон.
|
|
|
|
Волчачка | Дата: Пятница, 10 Мая 2013, 19:25:08 | Сообщение # 213 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Цитата (SirNikolas) И да, сравнение integer (равно как и boolean) с null - плохой тон. ага, если i = 1, а по идее null Типа нуля же Xd(только для классовых объектов, как unit, timer, trigger и т.д. )
Сообщение отредактировал Волчачка - Пятница, 10 Мая 2013, 19:25:32 |
|
|
|
Ty3uK | Дата: Пятница, 10 Мая 2013, 22:35:24 | Сообщение # 214 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Уважаемый, Вы не на Си пишете. Тут нулл не 0. Добавлено (10 Мая 2013, 22:35:24) --------------------------------------------- Сравнивать считаю правильным только в случае передачи аргументов - тогда нулл показывает отсутствие аргумента.
|
|
|
|
Волчачка | Дата: Пятница, 10 Мая 2013, 23:04:37 | Сообщение # 215 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Ty3uK, лол, я о том что нулевой аргумент, типа ничего нету Xd
|
|
|
|
Ty3uK | Дата: Пятница, 10 Мая 2013, 23:25:40 | Сообщение # 216 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| кстати, дайте дебаг на B2S(0 == null), пожалуйста.
|
|
|
|
Bru | Дата: Пятница, 10 Мая 2013, 23:29:25 | Сообщение # 217 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Точно бро спасибо Добавлено (10 Мая 2013, 23:29:25) --------------------------------------------- Волчанка красава
|
|
|
|
Волчачка | Дата: Пятница, 10 Мая 2013, 23:38:22 | Сообщение # 218 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Bru, сообразим на троих. Добавлено (10 Мая 2013, 23:38:22) --------------------------------------------- Ty3uK, Код function Trig_sfsd_Actions takes nothing returns nothing call TriggerSleepAction(4.) if 0 == null then call DisplayTextToPlayer(Player(0),0,0,"true!") endif
endfunction
//=========================================================================== function InitTrig_sfsd takes nothing returns nothing set gg_trg_sfsd = CreateTrigger( ) call TriggerAddAction( gg_trg_sfsd, function Trig_sfsd_Actions ) endfunction Выдало true :D
|
|
|
|
Ty3uK | Дата: Суббота, 11 Мая 2013, 00:50:10 | Сообщение # 219 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| забавно.
|
|
|
|
Волчачка | Дата: Суббота, 11 Мая 2013, 01:00:46 | Сообщение # 220 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Ty3uK, значит всё таки null и есть целочисленное нуль(ноль) :) интересно true == null или false == null ? конечно же false == null будет) Логический, булев (англ. Boolean или logical data type) тип данных — примитивный тип данных в информатике, которые могут принимать два возможных значения, иногда называемых правдой (true) и ложью (false). Присутствует в подавляющем большинстве языков программирования как самостоятельная сущность или реализуется через численный тип. В подавляющем большинстве языков за истину полагается единица, за ложь — ноль.
Название Boolean получило своё название в честь английского математика и логика Джорджа Буля, среди прочего, занимавшегося вопросами математической логики в середине 19 века. © Wiki
|
|
|
|
Ty3uK | Дата: Суббота, 11 Мая 2013, 10:14:25 | Сообщение # 221 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Цитата (Волчачка) значит всё таки null и есть целочисленное нуль(ноль) Нельзя сравнить хэндл и 0, так что скорее всего нет. Хотя хэндл - всего лишь ссылка
|
|
|
|
SirNikolas | Дата: Суббота, 11 Мая 2013, 12:23:28 | Сообщение # 222 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Ty3uK, integer и boolean можно не только сравнивать с null, но даже присваивать его им. Поэтому я не говорил, что так нельзя делать. Я сказал, что это плохой тон.Цитата (Ty3uK) Сравнивать считаю правильным только в случае передачи аргументов - тогда нулл показывает отсутствие аргумента. Нет, так было бы, если бы передавался указатель на int. Но мы не в Си. И не в Python или JavaScript, где "все является объектом".
Добавлено (11 Мая 2013, 12:23:28) --------------------------------------------- Цитата (Волчачка) значит всё таки null и есть целочисленное нуль(ноль) На низкоуровневой реализации - да, но не следует так считать, программируя на JASS (на других языках, впрочем, тоже). null - нулевой указатель, 0 - целое число, false - логическая ложь. Смешение этих понятий противоречит логике и здравому смыслу.
|
|
|
|
Волчачка | Дата: Суббота, 11 Мая 2013, 12:59:05 | Сообщение # 223 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Цитата (SirNikolas) На низкоуровневой реализации - да, но не следует так считать, программируя на JASS (на других языках, впрочем, тоже). null - нулевой указатель, 0 - целое число, false - логическая ложь. Смешение этих понятий противоречит логике и здравому смыслу. Не надо мне объяснять, я и так знаю. Это просто был маленький эксперимент. Лол, я не говорил, что их присваивать можно, но сравнить то можно. мне проще i == 0, чем i == null. в Си нельзя присваивать вроде и сравнивать тоже.
|
|
|
|
Ty3uK | Дата: Суббота, 11 Мая 2013, 14:01:45 | Сообщение # 224 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| В Си нулл, если мне память не изменяет, дефайн.
|
|
|
|
Волчачка | Дата: Суббота, 11 Мая 2013, 15:58:19 | Сообщение # 225 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Цитата (Ty3uK) В Си нулл, если мне память не изменяет, дефайн. Не спорю. Жаль нельзя оптимизировать null в одну переменную например n xd. Хотя это было бы не этично.
|
|
|
|
|
|
|
|
|
|
|