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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: PUVer, SirNikolas, Ty3uK  
[ВАЖНО] Общалка кодеров
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
Блокировки:
Стоп.
Какая trollface ?
 

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 останавливается на единице.
Вот карта.
Прикрепления: newepic1.w3x (19.9 Kb)
 

ВолчачкаДата: Пятница, 10 Мая 2013, 18:07:49 | Сообщение # 211
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Код
         if i == 100 then
              set i = 1
          endif
          exitwhen i == null   


Код
exitwhen i == 100
 

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)
---------------------------------------------
Сравнивать считаю правильным только в случае передачи аргументов - тогда нулл показывает отсутствие аргумента.


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

ВолчачкаДата: Пятница, 10 Мая 2013, 23:04:37 | Сообщение # 215
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Ty3uK, лол, я о том что нулевой аргумент, типа ничего нету Xd
 

Ty3uKДата: Пятница, 10 Мая 2013, 23:25:40 | Сообщение # 216
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
кстати, дайте дебаг на B2S(0 == null), пожалуйста. :)

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

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
Блокировки:
забавно. :)

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

ВолчачкаДата: Суббота, 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, так что скорее всего нет. Хотя хэндл - всего лишь ссылка


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

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
Блокировки:
В Си нулл, если мне память не изменяет, дефайн. :)

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

ВолчачкаДата: Суббота, 11 Мая 2013, 15:58:19 | Сообщение # 225
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
Цитата (Ty3uK)
В Си нулл, если мне память не изменяет, дефайн.

Не спорю.
Жаль нельзя оптимизировать null в одну переменную например n xd. Хотя это было бы не этично.
 

Поиск:

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