XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Идея для создания Системы воскрешения крипов
У меня появилась идея по поводу создания системы воскрешения (респавна как вам угодно) крипов.
Она заключается в том, что каждый раз после смерти юнита на его месте создаётся невидимый юнит, которого мы добавляем в некую группу, т.е. создаём свободный спавнпоинт. Далле Wait 20-40 сек. и мы воскрешаем умершего крипа на позиции рандомного юнита из группы спавнпоинтов. Далее удаляем юнит-спавнпоинт из группы и из игры.
Подскажите как это всё лучше реализовать грамотно и без утечек.
Старый 11.04.2008, 14:22
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
лучше это все реализовать локациями, или, еще лучше - структурами-координатами таких спавнопоинтов.

FellGuard добавил:
т.е. тебе в раздел джасс, читать про джасс нью ген)
Старый 11.04.2008, 14:27
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Т.е. способ который предложил я - менее экономичный и с ним придётся больше возиться, если на карте большое число крипов разных типов, нежели способ при создании нью геном?
Старый 11.04.2008, 14:35
adic3x

offline
Опыт: 108,439
Активность:
забудте о нью гене на время - это макро средства
если нам нужна именно производительность мыслить надо на самом "низком" уровне
ну я тп, на гуи впринципе ничего "качественно" не сделаешь, т.е. в любом случае на жасс это можно сделать быстрее/лучше/проще
юнит наверное самый ресурсоемкий обьект в игре, использовать его для поментки нестоит
Старый 11.04.2008, 14:41
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
Код:
struct cord
 real x
 real y
 real z
endstruct

function MyFunc takes nothing returns nothing

 local cord A=cord.create()

 set A.x=5
 set A.y=8
 set A.z=3

endfunction


FellGuard т.е. ты мне предлогаешь записать каждого нужного мне юнита вот таким способом?)
На это ведь вся моя жизнь уйдёт...

Ну допустим будет у меня база данных координат и как я проверять буду - жив юнит на этой координате или нет...

Цитата:
Сообщение от ADOLF
юнит наверное самый ресурсоемкий обьект в игре, использовать его для поментки нестоит

Но ведь юинт будет создаваться лишь на время которе необходимо для респавна умершего крипа т.е. память будет занимать лишь на короткое время.
И есть ли другое предложение чем можно заменить юнита?
Старый 11.04.2008, 15:09
df Hunter
Нападатель
offline
Опыт: 5,749
Активность:
Alex27 когда юнит умирает, ты добавляешь в массив тип юнита, игрока и координаты и запускаешь таймер, когда таймер истекает - юнит возрождается, а ячейка освобождается
Старый 11.04.2008, 15:18
adic3x

offline
Опыт: 108,439
Активность:
ну конечно не писать весь код вручную + достаточно двух координат, короче как сказал хантер
Код:
struct revive
 real x
 real y
 integer id
 player p
endstruct


теперь по событию сметри юнита
Код:
local unit u=GetTriggerUnit()
 local revive v=revive.create
 set v.x=GetUnitX(u)
 set v.y=GetUnitY(u)
 set v.p=GetOwningPlayer(u)
 set v.id=GetUnitTypeId(u)


создаем таймер, запускаем его, и вешаем через любую аттач сисму на него наш структуру, потом создаем юнита по ней
Старый 11.04.2008, 16:21
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
По-моему я фигню смолол)
Мне почему-то показалось, что крип будет возрождаться на месте где он сразу и находился, а не на том где его убили.
Старый 11.04.2008, 16:35
adic3x

offline
Опыт: 108,439
Активность:
а тебе как надо то? где убили или где он был изначально?
Старый 11.04.2008, 16:47
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
2-ой вариант
Старый 11.04.2008, 17:02
DeaDoK

offline
Опыт: 5,783
Активность:
Таймер+Ректы
Старый 12.04.2008, 09:36
adic3x

offline
Опыт: 108,439
Активность:
DeaDoK, ммм, давай ты будешь сначала думать, а потом писать?

Alex27, тогда просто изменить функцию
Код:
globals
 unit u_temp=null
endglobals

struct revive
 real x
 real y
 real f
 integer i
 player p
endstruct

function CreateUnitEx takes player p, integer i, real x, real y, real f returns unit
 local revive v=revive.create
 set u_temp=CreateUnit(p, i, x, y, f)
 call SetUnitUserData(u_temp, v)
 set v.x=x
 set v.y=y
 set v.p=p
 set v.i=i
 set v.f=f
 returns u_temp
endfunction


ану, ребята, тренеруем мозги и пытаемся понять что я тут написал))) давайте, все достаточно просто)))
Старый 12.04.2008, 10:44
silumin

offline
Опыт: 11,153
Активность:
Alex27 Создаёшь массив Units типа Боевая единица на нужно количество элементов. Создаёшь массив Points типа Точка на это же количество элементов. Потом тригером создаёшь каждого отдельного крипа в нужной области и с помощью Units[index] = "Last Greated Unit" заносишь в ранее созданный массив попутно заполняя массив Точек с помощью Points[index] = "Position of (Last Greated Unit)". Врезультате у тебя получается массив напичканный ссылками на Боаевые единицы и ещё массив с Точками их респавна.
Для респавна создаёшь триггер, который каждые 60 сек игры проверяет каждый элемент (или группу выбранных элементов) массива Units на наличие ХП, если ХП = 0, то очищаешь память с помощью "Remove Unit" где Unit - это и есть Units[index] и создаёшь боевую единицу в точке Position[index] (т.к. массивы Units и Points заполнялись вместе, то Points[i] = Position of Units[i]), далее Units[index] = Last Greated Unit т.е. заполняешь пустую ячейку массива Юнитов ссылкой на новый юнит.

событие для запуска респавна может быть разнооюразное (не только 60сек игры)...
Я лично делал почти так.
Старый 12.04.2008, 15:32
DrKirc

offline
Опыт: 5,933
Активность:
По мне все тупо самый оптимальный и рабочий вариант это мой:
» 1.Этап

Код:
function Trig_Creep_Locations_Func003A takes nothing returns nothing
    set udg_Point[udg_Free] = GetUnitLoc(GetEnumUnit())
    set udg_Creep[udg_Free] = GetUnitTypeId(GetEnumUnit())
    call SetUnitUserData( GetEnumUnit(), udg_Free )
    set udg_Free = ( udg_Free + 1 )
endfunction

function Trig_Creep_Locations_Actions takes nothing returns nothing
    set udg_Free = 0
    call ForGroupBJ( GetUnitsInRectOfPlayer(GetPlayableMapRect(), Player(PLAYER_NEUTRAL_AGGRESSIVE)), function Trig_Creep_Locations_Func003A )
endfunction

//===========================================================================
function InitTrig_Creep_Locations takes nothing returns nothing
    set gg_trg_Creep_Locations = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_Creep_Locations, 5 )
    call TriggerAddAction( gg_trg_Creep_Locations, function Trig_Creep_Locations_Actions )
endfunction

» 2.Этап

Код:
function Trig_Creep_Revival_Func001C takes nothing returns boolean
    if ( not ( IsUnitType(GetDyingUnit(), UNIT_TYPE_HERO) == false ) ) then
        return false
    endif
    return true
endfunction

function Trig_Creep_Revival_Conditions takes nothing returns boolean
    if ( not Trig_Creep_Revival_Func001C() ) then
        return false
    endif
    return true
endfunction

function Trig_Creep_Revival_Actions takes nothing returns nothing
    call TriggerSleepAction( I2R(GetRandomInt(5, 10)) )
    call CreateNUnitsAtLoc( 1, udg_Creep[GetUnitUserData(GetDyingUnit())], Player(PLAYER_NEUTRAL_AGGRESSIVE), udg_Point[GetUnitUserData(GetDyingUnit())], GetRandomDirectionDeg() )
    call SetUnitUserData( GetLastCreatedUnit(), GetUnitUserData(GetDyingUnit()) )
endfunction

//===========================================================================
function InitTrig_Creep_Revival takes nothing returns nothing
    set gg_trg_Creep_Revival = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Creep_Revival, Player(PLAYER_NEUTRAL_AGGRESSIVE), EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_Creep_Revival, Condition( function Trig_Creep_Revival_Conditions ) )
    call TriggerAddAction( gg_trg_Creep_Revival, function Trig_Creep_Revival_Actions )
endfunction

А думать как сделать это, уже ваша проблема
Старый 12.04.2008, 15:34
adic3x

offline
Опыт: 108,439
Активность:
silumin и DrKirc, оба написали хз что, обьяняю, что слип акшин отсчитывает время когда игра стоит на паузе, первому проверять постоянно что то я вообще тп что=/

ADOLF добавил:
+ второй вариант от дркирк - ГедДаингЮнит хз что вернет через время ожидания
Старый 12.04.2008, 15:48
silumin

offline
Опыт: 11,153
Активность:
Alex27 ADOLF Мои триги не столь утончённы как сделал бы Адольф, но тем не менее они работают. Я люблю массивы и проверки, имхо очень удобно. Пример работающего респавна:
Прикрепленные файлы
Тип файла: w3x resp.w3x (14.2 Кбайт, 22 просмотров )
Старый 12.04.2008, 16:26
adic3x

offline
Опыт: 108,439
Активность:
работает и работает максимально быстро и без багов немного разные понятия всетаки + удобство очень растяжимое понятие
Старый 12.04.2008, 17:24
DrKirc

offline
Опыт: 5,933
Активность:
Ладно если мой код не понятен, то вот наработка. Тоже хорошая наработка!
Прикрепленные файлы
Тип файла: w3x Revive.w3x (19.5 Кбайт, 25 просмотров )
Старый 12.04.2008, 21:20
Аминь
Crazy about that shit
offline
Опыт: 3,214
Активность:
ADOLF, а можешь выложить карту-пример что-бы разобраться было полегче?
Старый 14.04.2008, 01:29
adic3x

offline
Опыт: 108,439
Активность:
к сожалению нет, т.к. не располагаю свободным временем
пробуйте сами
Старый 14.04.2008, 13:49
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 01:47.