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

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

Ответ
 
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
Сохранение структуры в хеш ?
Как сохранить структуру в хеш ? И есть ли в этом необходимость ? Мне нужно аттачить структуру к юниту,
чтобы у каждого юнита была своя структура.
Читал что каждая созданная структура обладает уникальным номером. Если это так, то как его получить и нааборот как зная этот номер перейти к структуре ?
Старый 30.01.2011, 11:48
Doc

offline
Опыт: 63,163
Активность:
Структура это integer.
Старый 30.01.2011, 11:54
Nekit1234007

offline
Опыт: 11,916
Активность:
Старый 30.01.2011, 11:56
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
т.е ?
function1
local struct s=struct.create()
call SaveInteger(hash,GetHandleId(u),1,s)
endfunction
function2
local struct s=struct.create()
set s = LoadInteger(hash,GetHandleId(u),1)
endfunction
а если используется одна глобальная структура ? То по идее у всех юнитов будет одна и таже структура ? А это не есть гут.

Отредактировано Zanozus, 30.01.2011 в 12:07.
Старый 30.01.2011, 12:01
Nekit1234007

offline
Опыт: 11,916
Активность:
Неправильно, попробуй ещё раз.
Старый 30.01.2011, 12:04
Doc

offline
Опыт: 63,163
Активность:
function2
local struct s=LoadInteger(HT,GetHandleId(u),1)
endfunction
если используется одна глобальная структура ? То по идее у всех юнитов будет одна и таже структура ? А это не есть гут.
непонятно.
Старый 30.01.2011, 12:05
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
globals
struct s=0
hashtable hash=InitHashtable()
endglobals
function1
local unit u=CreateUnit(...)
set s.x=50.00
set s.y=10.00
....
call GroupAddUnit(group,u)
call SaveInteger(hash,GetHandleId(u),1)
endfunction
function2
local unit u=GetEnumUnit()
set s=LoadInteger(hash,GetHandleId(u),1)
endfunction
к примеру так. Можно ли так делать или для каждого созданного юнита нужно создавать локальную структуру ?
Старый 30.01.2011, 12:14
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Custom Value простейший способ для сохранения id структуры (если оно еще есть в текущих версиях).

А вообще надо подумать, есть ли необходимость аттачить структуру. Расскажи конкретную логику своего примера, для чего нужен этот аттач.
Старый 30.01.2011, 12:16
Doc

offline
Опыт: 63,163
Активность:
Не понимаю зачем тебе аттачить структуру если она одна на всех юнитов.
Старый 30.01.2011, 12:21
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
От CustomValue я уже давно отказался (даже системка есть по хранению свободных индексов CustomValue). И да он еще существует.
Жуть для чего нужен:
private struct point
real x1
real y1
real z1
real x2
real y2
real z2
real d
real a
real b
real roll
real pitch
real yaw
method Dist takes nothing returns nothing
set .d=SquareRoot((.x2-.x1)*(.x2-.x1)+(.y2-.y1)*(.y2-.y1)+(.z2-.z1)*(.z2-.z1))
endmethod

method Rotation1 takes nothing returns nothing
set .x2=.x1+.d*CosBJ(.a)
set .y2=.y1+.d*SinBJ(.a)
set .z2=.z1
endmethod

method Rotation2 takes nothing returns nothing
call this.Dist()
set .x2=.x1+.d*CosBJ(.a)
set .y2=.y1+.d*SinBJ(.a)
set .z2=.z1
endmethod

method AxisX takes nothing returns nothing
call this.Dist()
set .b=Atan2(SquareRoot((.z2-.z1)*(.z2-.z1)+(.y2-.y1)*(.y2-.y1)),.x2-.x1)
set .x2=.x1+.d*Cos(.b)
set .y2=.y1+.d*Sin(.b)*SinBJ(.a)
set .z2=.z1+.d*Sin(.b)*CosBJ(.a)
endmethod

method AxisY takes nothing returns nothing
call this.Dist()
set .b=Atan2(SquareRoot((.x2-.x1)*(.x2-.x1)+(.z2-.z1)*(.z2-.z1)),.y2-.y1)
set .x2=.x1+.d*Sin(.b)*CosBJ(.a)
set .y2=.y1+.d*Cos(.b)
set .z2=.z1+.d*Sin(.b)*SinBJ(.a)
endmethod

method AxisZ takes nothing returns nothing
call this.Dist()
set .b=Atan2(SquareRoot((.x2-.x1)*(.x2-.x1)+(.y2-.y1)*(.y2-.y1)),.z2-.z1)
set .x2=.x1+.d*Sin(.b)*CosBJ(.a)
set .y2=.y1+.d*Sin(.b)*SinBJ(.a)
set .z2=.z1+.d*Cos(.b)
endmethod

method Plane takes nothing returns nothing
call this.Rotation2()
call this.AxisX()
call this.AxisZ()
endmethod
endstruct
мне нужно сохранять для каждого юнита эти параметры: центр вращения, углы поворотов, растояние и т.д (для каждого юнита они свои). Сама структура еще не доделана но думаю понятно.
чтобы не сохранять все это по отдельности в хеш решил задействовать структуру.
Старый 30.01.2011, 12:23
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Просто смотря чем ты оперируешь. Судя по твоему примеру тебе легче сохранять ссылку на юнита в поле структуры и оперировать структурами, а не юнитами.
Старый 30.01.2011, 12:27
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
можно пример ?
Старый 30.01.2011, 12:28
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
private struct point
unit u
...
static point array Points
Все структуры для удобной адресации можно хранить в статическом члене структуры массиве.
Старый 30.01.2011, 12:30
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
это не то т.к у каждого юнита свой набор значений переменных структуры.
в итоге мне всеравно придется куда-то их сохранять и откуда-то их загружать.
мой прошлый вопрос остается открытым:
Для хранения индивидуальных параметров каждого юнита нужно создавать для каждого локальную структуру или достаточно одной глобальной структуры ?
Старый 30.01.2011, 12:34
spellwerk

offline
Опыт: 4,869
Активность:
globals
	integer array struct_array
	integer struct_count = 0
endglobals

private struct point
unit u	// твой юнит
real x1
real y1
real z1
real x2
real y2
real z2
//...
endstruct
//..
function some takes nothing returns nothing
	local point p = 0
	local integer i = 0
	loop
		exitwhen i >= struct_count
		set p = struct_array[i]
		// действия с структурой
		// например
		if ( p.x1 > 1. ) then
			KillUnit(p.u)
		endif
		set i = i + 1
	endloop
endfunction
Старый 30.01.2011, 12:36
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
Массив структур, запись/удаление в который производится в конструкторе/деструкторе структуры.
Товариш выше предлагает тоже самое, только через глобальный массив. Через статический член более красиво и не нарушается инкапсуляция структуры.
exploder добавил:
Тут вопрос в другом. Важно знать порядок выборки, по которому производиться обработка. Если его контролируешь ты, то тебе не важно что ты хранишь, юнитов или структуры.
Но если порядок выборки определяется движком (например триггер с событием действия юнита, или срабатывание таймера), то тогда аттач необходим.
Старый 30.01.2011, 12:40
Doc

offline
Опыт: 63,163
Активность:
exploder, компилируется все в абсолютно то же самое, но да статический член лучше вписывается.
Zanozus, со структурами вообще нет нужды использовать хеш.
Старый 30.01.2011, 12:41
DioD

offline
Опыт: 45,134
Активность:
не понимаю, что мешает компилировать код и посмотреть как он выглядит в реале?
Старый 30.01.2011, 12:43
exploder
iOS zealot
offline
Опыт: 19,394
Активность:
DioD, не понимаю что мешает тебе сразу писать в машинных кодах.
Старый 30.01.2011, 12:45
Nekit1234007

offline
Опыт: 11,916
Активность:
Я не понимаю почему вы тупите, номер структуры отлично сохраняется на юнита с помощью юзердаты и/или хеш таблицы. =\ Выше дал пример на таймер.
Старый 30.01.2011, 12:49
Ответ

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

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

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

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



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