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

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

Ответ
 
Doc

offline
Опыт: 63,163
Активность:
Zanozus, лицоладонь. И зачем?
Старый 30.01.2011, 16:54
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
а вот зачем этот массив интеджеров в него сохраняются структуры, чтобы потом пройтись по массиву циклом и выполнять действия с этими структурами.
так ?
Старый 30.01.2011, 17:11
spellwerk

offline
Опыт: 4,869
Активность:
посмотри как реализованы вообще структуры, и не будет таких вопросов
Старый 30.01.2011, 17:14
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
прочитал. Щас на практике проверю мою версию и отпишусь.
Старый 30.01.2011, 17:18
reALien

offline
Опыт: 29,211
Активность:
до компиляции:
struct govno{
    integer x
    real y
    bool b
}
после:
constant integer si__govno=1
integer si__govno_F=0 //MOOOO
integer si__govno_I=0
integer array si__govno_V
integer array s__govno_x
real array s__govno_y
boolean array s__govno_b
делаем выводы =О
Старый 30.01.2011, 17:20
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
так, ладно, понял наконец-то что вы мне пытались объяснить. Это немного не то.
Вы храните номера структур в массиве интеджеров, а при перемещении
юнитов перебираете этот массив и присваиваете local point p = array[i]
и получаем p.x, p.y для каждого юнита.
а что если юнит умер ? как полностью удалить его из цикла и структуру в которой он находился ? а также номер структуры из массива.
и попутный вопрос: на много ли быстрее цикл чем ForGroup() ? И если цикл будет "пропускать" свободные индексы массива интеджеров всеравно быстрее ?

Отредактировано Zanozus, 30.01.2011 в 17:37.
Старый 30.01.2011, 17:29
Nekit1234007

offline
Опыт: 11,916
Активность:
((код
globals
hashtable hash = InitHashtable()
endglobals
struct struct0001
structdata
endstruct
function onUnitDie takes nothing returns nothing
local struct0001 s = LoadInteger(hash, GetHandleId(GetDyingUnit()), 0)
call s.destroy()
endfunction
function func0001 takes nothing returns nothing
local struct0001 s = struct0001.create()
local unit u = CreateUnit(...)
call SaveInteger(hash, GetHandleId(u), 0, s)
set u = null
endfunction
))
Старый 30.01.2011, 17:50
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
Nekit1234007, во я к этому все и клоню. Зачем тогда сохранять юнита в структуре, потом сохранять номер структуры в массив интеджеров и перебором этого массива двигать юнита.
Если можно сразу сохранить структуру в хеш под индексом юнита и добавить юнита в группу.
Потом в ForGroup() загружать обратно эту структуру и двигать юнита. И при смерти юнита также загрузить его структуру и удалить.
Или ForGroup() настолько медленнее цикла что стоит всего этого гемороя ?
Старый 30.01.2011, 18:00
spellwerk

offline
Опыт: 4,869
Активность:
Вариант раз:
function f
	struct s = LoadInteger(...)
	//...
endfunction

function a
	ForGroup(g,function f)
endfunction
Вариант два:
globals
	integer array sa
	integer sc = 0
endglobals

function f
	integer i = 0
	struct s
	loop
		exitwhen i >= sc
		s = sa[i]
		//...
		i = i + 1
	endloop
endfunction
в первом варианте вызывается функция a, затем с помощью функции ForGroup мы к каждому по сути вызываем функцию f, а там еще дополнительно LoadInteger, и делаем действия со структурой.
во втором варианте мы вызываем функцию f, проходим по всем элементам в массиве структур, делаем с каждой действия.
может быть, не очень точно описал, но примерно это будет так.
так что решай, как тебе лучше.
Spy_ добавил:
и кстати какой геморой? создать массив интегеров и один интегер, или создать хэштаблицу и каждый раз делать Save/LoadInteger.
аттач тоже не бесполезен, но в данном случае, если ты делаешь действия со всеми структурами, то лучше это делать через массив.
Старый 30.01.2011, 19:06
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
Spy_, как ты тогда собираешься удалить сохраненную структуру из массива и что потом делать с "дыркой" в массиве после удаления ?
Старый 30.01.2011, 19:36
Doc

offline
Опыт: 63,163
Активность:
Zanozus, удалить также как и обычно -.- заменить последним элементом в массиве.
Старый 30.01.2011, 20:48
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Zanozus, мы тебе пытались объяснить и выпытать у тебя зачем тебе нужен аттач к юниту. Например, в системе дамми-снарядов, смертью юнита ты управляешь программно и там, как мне кажется, структуры хранить было бы удобнее. Структуры всех активных в данный момент снарядов в одном массиве, который обрабатывается одним глобальным таймером например.
В твоем случает, ты должен учитывать собития, которые генерирует движок, то есть юнит может умереть и так далее, то есть в твоем случае действительно уместнее использовать аттач и хранение ссылок на структуры через хэш.
Мораль басни, если ты всегда будешь искать решения через аттач, ты можешь упустить более эффективные решения проблемы.
Старый 30.01.2011, 23:52
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
exploder, думаете я просто так вас всех тут допрашиваю ?=)
я как раз таки пытаюсь обойти хеш-таблицу и группы,
попутно взвешивая все "за" и "против",
подготавливаю почву для одной тяжеловесной задумки.
Старый 31.01.2011, 11:44
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Zanozus, ты собираешься атачить статичные значения юнитам ? Если да и они типизируются, создай что то типо БД на каждый тип юнита, на юнита прикрепи тригер хендл, и когда тебе нужно будет получить эти данные просто вызови его триггер.

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

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

Но такая фича только для статичного типа данных, с динамичными онли структуры\хт\массивы и тд.
Старый 31.01.2011, 12:38
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
Faion, нет не статичные.
Думаю это последний вопрос:
struct name
unit u
real x=GetUnitX(u)<-----
real y=GetUnitY(u)<-----
real x1
real y1

method polar takes real d returns nothing
set .x1=.x+Cos(a)*d <--------
set .y1=.y+Sin(a)*d <---------
endmethod

endstruct
будут ли вычисления в методе зависеть от текущих координат юнита ? имеет ли смысл так писать ?
или нужно так:
set .x1=GetUnitX(u)+....
set .y1=GetUnitY(u)+....

Отредактировано Zanozus, 31.01.2011 в 13:30.
Старый 31.01.2011, 13:22
spellwerk

offline
Опыт: 4,869
Активность:
нет, не будут.
нужен второй вариант
Старый 31.01.2011, 14:58
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
ВСЁ ! Всем большое спасибо ! Если тема больше никому не нужна - закрывайте !
(примерно через недельку допишу спелл, вернее систему)
Старый 31.01.2011, 15:07
Ответ

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

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

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

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



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