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

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

Закрытая тема
 
adic3x

offline
Опыт: 108,439
Активность:
[Task] Движение снарядов #2
или "отсроченная обработка динамически расширяемых данных"

суть



сначала я наверное обрисую ситуацию, а потом поясню уже саму задачу...

данные - некоторые характеристики снаряда (к примеру координаты, векторы, юнит-для визуального ряда и т.д.)

обработка - функция, в области видимости которой должны быть доступны соответсвующие данные т.е. если я говорю обработать данные отсроченно - это значит что в функцию должны быть сообщены эти данные. причем важно что таких груп данных может быть много

к примеру есть функция function Add takes unit u, real x, real y returns *** - в нее мы сообщаем наши данные, потом с помощью таймера ждем некоторое время и в функцию function Move takes unit u, real x, real y returns nithng мы должны их передать, причем также в последней функции должна быть возможности отчитски этих данных

ну к примеру



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

но, важно также то, что у нас есть несколько типов снарядов (к примеру один охотиться на юнитов, другой летит в 3д и т.д.) т.е. для каждого из них должна вызываться своя функция Add/Move

шаблон



тут я примерно напишу как это дб выглядить:

Код:
function Add_00 takes integer i returns ***
function Add_01 takes integer i, integer c returns ***
function Add_02 takes integer i, integer a, integer b returns ***
function Add_03 takes nothing returns ***

function Move_00 takes integer i returns ***
 set i=i+0xffffffff
 if i==0x00then
  // тут должно стоять действие которое предотрватит следующую обработку этого "снаряда"
 endif
endfunction

function Move_01 takes integer i, integer c returns ***
 set i=i-c
 if i<=0x00then
  // тут должно стоять действие которое предотрватит следующую обработку этого "снаряда"
 endif
endfunction

function Move_02 takes integer i, integer a, integer b returns ***
 set i=i-a-b
 if i<=0x00then
  // тут должно стоять действие которое предотрватит следующую обработку этого "снаряда"
 endif
endfunction

function Move_03 takes nothing returns ***
 if GetRandomInt(0x00, 0x01)==0x00then
  // тут должно стоять действие которое предотрватит следующую обработку этого "снаряда"
 endif
endfunction


сразу оговорюсь, что передача в функцию через "такес" тут невозможно, потому что данные должны быть изменяемыми, т.е. я привожу это только для примера

вот, как это должно работать

Код:
call Add_00(5)
call Add_02(50, 2, 1)


после чего через равные отрезки времени должны вызываться две функции - Мове_00 (в нее сообщаеться 5, там оно уменьшается на 1, значит в след раз должно быть сообщено 4 и т.д. после того как данные приравняются к нюлю это должгны быть прекращено) и точно также с Мове_02

ка бы это выглядело на SCV



Код:
function Move ...
 loca timer t=GetExpiredTimer()
 local integer i=GetStoredInteger(c, I2S(H2I(t)), "integer i")
 set i=i-0x01
 if i==0x00then
  call FlushStoredMission(c, I2S(H2I(t)))
 else
  call StoreInteger(c, I2S(H2I(t)), "integer i", i) 
 endif
 set t=null
endfunction

 set t=CreateTimer()
 call StoreInteger(c, I2S(H2I(t)), "integer i", 0x05)
 call TimerStart(t, true, .025, function Move)
 set t=null


это только для одного типа (00), но это очень неоптимально

тут хранение данных организованно в кеше, а передача их за счет аттача к хендлу таймера

задача



предложить оптимальный вариант хранения данных, алгоритм их расширения и сужения (ну т.е. вызов функций Адд и удаления данных) а также их обработку в соответсвующих типу данных функциях

условия



выкладываем тут свои варианты, никаких сложных ограничений нет, но все должно быть очень производительно, т.к. предпологается что на карте одновременно может обрабатываться и 64 таких "комплекта" данных разных типов

» old
вобщем нетривиальная задача от мну)

у меня в карте предположим существует 4 типа снарядов (к примеру один отталкивается от террайна, другой ищет деструбы, другой тип юнитов и т.д.)

вобщем смысл в том что! для каждого из них используется свой алгоритм

одновременно скажем на карте сущетсвуют от 4 до 64 снарядв (ну мб и больше и мб их вообще 0)

что сделать



4 функции, к примеру AddPrj_00; AddPrj_01; AddPrj_02 ...
и Move_00; Move_01

теперь, каждая из них должна создавать снаряд... что такое снаряд - некоторые данные (его текущие координаты, юнит, владелец и т.д. вобщем это не важно) и при этом эти данные должны передаваться в соответсвующие функции

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

хорошо, я чувствую написанно тут несовсем ясно...

к примеру:

Код:
call AddPrj_00(unit, 1, 2)
call AddPrj_02(u, x, y)


после этого через ХХ сек должны вызываться функции Move_00 (в нее я должен иметь возможность обратитьсяк unit, to 1 and to 2), и Move_02 (u, x and y соответсвенно)

т.е. єто все нужно к примеру для карт типа того же ТсХ =) (там много снарядов и т.д.)

причем! само движение и т.д.нас не волнует, нужно сделать именно систему для хранения данных + их возможность их отсроченного применения)

ну вот думаю теперь ясно)))

Отредактировано ADOLF, 12.07.2008 в 09:50.
Старый 11.07.2008, 21:11
Radiant
Silence
offline
Опыт: 4,907
Активность:
Newgenpack-а нет, участвовать бесполезно(
А вообще имхо, задача написана неиочень понятно, сначала про прожектайлы, потом про систему хранения данных, запутано както...
Старый 11.07.2008, 21:21
adic3x

offline
Опыт: 108,439
Активность:
а прожектилы это что? это и естб данные

Цитата:
Newgenpack-а нет, участвовать бесполезно(

О_о скачать сложно?! + он по сути не нужен)
Старый 11.07.2008, 21:55
Toadcop

offline
Опыт: 54,313
Активность:
ADOLF
Цитата:
причем! само движение и т.д.нас не волнует, нужно сделать именно систему для хранения данных + их возможность их отсроченного применения)
эт оя вообще не понял.

ну а твоя мысль заключаетьса в бинарном дереве что ли ? =) теоретически можно стартануть 4 потока. но думаю 2 ифа будут быстрей =))))


я вот лично не понял сути задачи =)
Старый 11.07.2008, 22:02
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
я вот лично не понял сути задачи =)

я тоже, ну я понял вроде надо сделать функции созданию юнитов, потом создать таймер, и для каждого создного прожектила вызывать в таймеру свою функцию Move_xx, в щависимости от какой функции он был создан AddPr_xx
т.е. написать просто систему переброса даных от создания к таймеру, я прав?
Старый 11.07.2008, 22:06
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
ну а твоя мысль заключаетьса в бинарном дереве что ли ? =) теоретически можно стартануть 4 потока. но думаю 2 ифа будут быстрей =))))


ну имхо несовсем, как вариант может быть и не дерево а несколько потоков или циклов

Цитата:
причем! само движение и т.д.нас не волнует, нужно сделать именно систему для хранения данных + их возможность их отсроченного применения)


я имею ввиду что писать СетЮнитХ(...) ненадо)

ADOLF добавил:
Jon, да наверное... ну смотрите, я кастую спелл, он создает юнита, вася кастует спел, тот спелл тоже создает юнита

система должна приаатачить к юнитам к примеру координаты, владельца и т.д. и потом через некоторые отрезки времени двигать их, но разными методами)
Старый 11.07.2008, 22:16
Toadcop

offline
Опыт: 54,313
Активность:
ADOLF ты чётко сформулируй свою задачю а не Х того Х иного... и если Х это большое число то надо юзать EvaluateTrigger и группы юнитов...
Старый 11.07.2008, 22:25
adic3x

offline
Опыт: 108,439
Активность:
Код:
function Move00 takes unit u, real x, real y returns nothing
function Move01 takes unit u, real x, real y, real z returns nothing
function Move02 takes unit u, real x, real y, integer i returns nothing
function Move03 takes unit u, returns nothing

function Add00 takes unit u, real x, real y returns nothing
function Add01 takes unit u, real x, real y, real z returns nothing
function Add01 takes unit u, real x, real y, integer i returns nothing
function Add02 takes unit u, returns nothing

function Remove00 takes ??? returns nothing
function Remove01 takes ??? returns nothing
function Remove02 takes ??? returns nothing
function Remove03 takes ??? returns nothing


после вызова функции Адд надо что бы к примеру в течение пусть 5 секунд через равные отрезки времени вызывалась функция Мове (с соотв. индексом) а потом вызывалась бы Ремове, но ремове должна также вызываться и из Мове (к примеру выход за границы карты)
Старый 11.07.2008, 22:34
adic3x

offline
Опыт: 108,439
Активность:
обновил первый пост, думаю теперь дб яснее)
Старый 12.07.2008, 13:42
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
предложить оптимальный вариант

Может так?
Но если ExecuteFunc уходит в другой поток, то понадобятся многочисленные ифы.
Или есть другой способ запустить в том же потоке записанную функцию.
Код:
function TimedCycle takes nothing returns nothing
    set GlobalIndex=FirstIndex()
    set WantToDestroy=false        //Вообще то хватит однократной инициализации
    loop
        if codearray[GlobalIndex] != "" then  //Вдруг Add_ в процессе...
            call ExecuteFunc(codeearray[GlobalResult])  //!!!!!!!!!!!!!!!!!!!!!!!
            if WantToDestroy then
                set codearray[GlobalIndex] = ""  //до освобождения 
                call FreeIndex()
                set WantToDestroy=false
            endif
        endif
        set GlobalIndex=NextIndex()
        exitwhen set GlobalIndex==0
    endloop
endfunction

function Add_00 takes integer int1 real real2 returns integer
    local integer i=NewIndex()
    set i1[i]=int1
    set r1[i]=real1
    set codearray[i]="Move_00"
    return i        //Для вызова потом FreeIndex takes integer i returns nothing если хочешь
endfunction

function Move_00 takes nothing returns nothing
    //Считай, что Move_00 takes integer i1[GlobalIndex] real r1[GlobalIndex] returns boolean
    //Делай, что хочешь, меняй переменные...
    
    if хочешь удалить объект then
        set WantToDestroy=true
    endif
endfunction
Старый 12.07.2008, 23:05
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Вот примерно как я себе представляю реализацию решения данной задачи.
Если понадобится добавить какой-либо тип прожектила, то мы пишем под него структуру вида:
Код:
struct pXX extends proj_if
  // --->> struct members
  method Move takes nothing returns nothing
    // --->> realization
  endmethod
  method Remove takes nothing returns nothing
    // --->> realization
  endmethod
endstruct

и функцию добавления, вида:
Код:
function Add_XX takes nothing returns nothing
  local proj p = proj.create(proj_if.create(pXX.typeid))
  // --->> setting parameters for p.p
endfunction
Прикрепленные файлы
Тип файла: rar swdn_proj_2.rar (761 байт, 50 просмотров )
Старый 12.07.2008, 23:23
Toadcop

offline
Опыт: 54,313
Активность:
имхо моя мысль заключаетьса в том. что задачя так же поставлена не правильно как и в преведущем случие.
т.е. ты придумал искутвеные условия лишбы это было "сложней" (хотя для меня тока запутаней).
что бы раскрыть потенцыал алгоритма надо знать точную цель "что это должно делать" а ты указываеш "как это должно делать". ты заставляеш других кодить по своей логики что есть банальный phail =) что тебе надо динамичски изменимый продж ?
  1. в таком случие ОЧЕНЬ ВНИМАТЕЛЬНО надо следать за конфликтами. т.е. тем самым лутче всего всё закодить в ОДНОЙ функции и давать доступ через флаги (флаг) хотя флаги будет быстрей.
  1. еще раз повторюсь задачя плохо поставлена. т.е. как я теперь понял тебе нужен проджектайл с динамически изменямыми характеристиками полёта ? если да то это лутче всего делать как я написал выше. через харкодед функцию. но а если нужно "Плагин подобная система" то делать цыкл с TriggerEvaluate. но что я вляетьса вполне ресурсо ёмко.
  1. как я уже писал.
если у нас есть константные возможност двигать продж. т.е. 4 вида (функции) то это всё делаетьса хардкодед через флаги (були)
если это Х возможных функии то это делаетьса через TriggerEvaluate хотя второй вариант являетьса непродуманым концептом.
реально вещи которые надо Евалуейтить это евенты. удар об землю, столкновение, смерть проджектайла еще чёнить...
я знаю что ты это не прочитаеш еще 2 недели :Р но всё же.
Старый 13.07.2008, 14:04
Sebra

offline
Опыт: 5,603
Активность:
Снёс Касперского, заменил worldedit.exe - вернул NewGen.
Посмотрел, чего я творил 3 месяца назад.
Оцените, может это то, что ищется.
И вообще - глупо или пойдёт?
Тестовый эффект запускается Esc.
Прикрепленные файлы
Тип файла: w3m RTS.w3m (15.8 Кбайт, 59 просмотров )
Старый 14.07.2008, 19:32
Radiant
Silence
offline
Опыт: 4,907
Активность:
ShadoW DaemoN, тыбы показал это на примере...
Sebra, не плохо, но помоему это совсем нито...
Старый 15.07.2008, 12:33
Sebra

offline
Опыт: 5,603
Активность:
Цитата:
Sebra, не плохо, но помоему это совсем нито...

Разве? Вызываем Add() - регулярно вызывается step().
Только параметры не в вызове функции, а в структуре записаны.
Для каждого типа объектов Add и Step свои.
А двигает step что-то, наблюдает за чем-то или так себе крутится - дело десятое.


Там ещё DoOnce - вот это не то - так, завалялось, оцените заодно.
Старый 15.07.2008, 18:32
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Sebra, хмм, где-то я уже видел подобную карту...
Ну интерфейсы я тоже использую, обрабатывающий цикл же сделан у меня по-другому.
Я показывал Адольфу свой код - он загадочно ответил "да, вроде", так что мы на правильном пути)
Radiant, сейчас времени нет.
Старый 15.07.2008, 20:34
Sebra

offline
Опыт: 5,603
Активность:
ADOLF, скажи словечко...
то/не то?
Старый 17.07.2008, 18:42
dk

offline
Опыт: 60,293
Активность:
Он две недели не появится, так что...
Старый 18.07.2008, 04:18
Radiant
Silence
offline
Опыт: 4,907
Активность:
А мне вар наконец принесли, так что тоже постараюсь поучаствовать^^
Старый 18.07.2008, 09:51
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
я теперь понял тебе нужен проджектайл с динамически изменямыми характеристиками полёта ? если да то это лутче всего делать как я написал выше. через харкодед функцию. но а если нужно "Плагин подобная система" то делать цыкл с TriggerEvaluate. но что я вляетьса вполне ресурсо ёмко.


ну по сути цикл с тригер евалуате, но это действительно долго т.е. стоит предумать нечто подобно... нет, функция одно для каждого снаряда, она не меняеться, но может быть несколько разных типов снарядов)

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

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

по суте если разрести все злое ооп, выйдет, что использованна структура на паралельных массивах, которая так же содержит еще один обьект (читать индекс к массивам, хотя он будет таким же как и у самих снарядов - как результат при создании снаряда дважды срабатывает механизм аллокации и возращает тот же индекс, хотя я и неуверен) + по моему даже на ооп можно было сделать не так запутанно =)))

теперь про сам цикл

полиморфенный метод срабатывает за счет ТригерЕвалуате из массива тригеров с индексом типа снаряда, как итог мы получаем медленный и запутанный алгоритм, хотя и работающий вроде правильно

+

имхо цикл по все снарядам с проверкой на созданность можент также быть медленным

теперь по второй карте бай себра)

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

зы, извините за отсутсвие, завтро попробую выложить свой вариант)

ADOLF добавил:
а вообще молодцы, хотя бы за то что поняли задачу)

ADOLF добавил:
подумайте над оптимизацией цикла и выполнения не через ТригерЕвалуте

подсказка: есть на компах тема Execute vx Evaluate, хотя и там я дал не совсем тот вариант)))
Старый 28.07.2008, 15:04
Закрытая тема

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

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

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

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



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