IQDDD 5 Опубликовано 11 Июля 2009 (изменено) C++ class [класс] { const [описание1] = [константа1]; const [описание2] = [константа2]; ... [константы заменяют описания при вызове методов классов]; property [свойство1]; property [свойство2]; ... [свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр. читаются через точку: obj.health]; [глобальная(-ые) функция(-ии), которой вызывается класс]; function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...); function [метод2] ([аргумент 1 функции2]...); ... [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами. вызываются через двоеточие: obj:add_animation(...)]; } Скрытый текст C++ class fcolor { property a; --альфа-цвет, отвечающий за прозрачность. property b; --blue-цвет, отвечающий за синий оттенок цвета. property g; --green-цвет, отвечающий за зелёный оттенок цвета. property r; --red-цвет, отвечающий за красный оттенок цвет. fcolor (); function set(number, number, number, number); --установка цвета (r,g,b,a) function set(const fcolor&); --установка цвета по уже имеющемуся классу "fcolor()" function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого. }; Например: color = fcolor() color.a = 50 color.g = 255 color.r = 100 color.b = 50 или color = fcolor() color:set(100,255,50,50) Но где и как это использовать? Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object: function hit(hit*); Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание: C++ class hit { const burn = 0; --здесь идут константы типов урона, используемых в свойстве "type". Все мы прекрасно знаем, что означает каждый. const chemical_burn = 6; const dummy = 11; const explosion = 7; const fire_wound = 8; const radiation = 4; const shock = 1; const strike = 2; const telepatic = 5; const wound = 3; property direction; --дирекция урона property draftsman; --обозначает персонажа, нанёсшего урон. property impulse; --импульс урона property power; --сила урона property type; -- тип урона (см. константы) hit (); hit (const hit*); function bone(string); --метод с указанием кости урона }; Пример использования: hit = hit() -- создание объекта класса hit hit.direction = vector():set(1,0,0) --дирекция по оси x hit.draftsman = db.actor --нанёс урон актор hit.impulse = 600 --импульс hit.power = 1.45 --хит hit.type = 2 --тип урона - выстрел hit:bone("bip01_head") -- удар приходится на голову obj:hit(hit) -- наносим урон Изменено 29 Июля пользователем Kirgudu Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 4 Ноября 2010 Вот это дело! Теперь осталось только ui_events. Кстати, а какая константа обозначает коллбек флажка (checkbutton'а) на снятие/установку. Пробовал CHECK_BUTTON_SET, CHECK_BUTTON_RESET, PROPERTIES_CLICKED - не работают. И как сохранить значение флажка?) Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 4 Ноября 2010 (изменено) Да я понимаю, что есть check:GetCheck(). но разрабы сохраняют в оригинальных скриптах через некий класс COptionsManager() (см. ui_mm_opt_main) BUTTON_CLICKED работает. Изменено 4 Ноября 2010 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 4 Ноября 2010 да всё, вопрос исчерпан. Я просто хотел найти способ сохранять настройки мода иным способом, отличным от записи в pstor. в принципе, легче записать в него, чем копать потенциальный класс. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 26 Ноября 2010 А как в ЧН добавлять к ComboBox элементы? Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 26 Ноября 2010 (изменено) да я уж понял. приходится всплывающим листбоксом делать. зы: а по идее можно создать собственный ComboBox, используя классы CUIButtonWnd, CUIStaticWnd и CUIListWnd. Неполноценный, конечно, но всё равно. А есть коллбек на потерю фокуса окном? Изменено 26 Ноября 2010 пользователем IQDDD Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 29 Ноября 2010 почему же недоступно? доступно. но вот как обратиться к дочерним элементам-загадка. и зарегистрированы ли под именами-тоже. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 5 Декабря 2010 1. Как узнать локацию серверного объекта? Смотрел справочник, смотрел состав net packet'ов, юзал поиск на форуме и google (возможно, плохо) - не нашёл. 2. Почему вызов level.add_map_object_spot_ser на объект из другой локации не ставит метку? (Перебирал все предметы alife'а, стоя на болотах. Метки появились только на болотах. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 13 Января 2011 и за что этот can_switch отвечает? Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 17 Января 2011 (изменено) Где у меня ошибка со скриптовым постэффектом? Метод process не вызывается почему-то. Вот вызов: local ppe=recovery_effect(max_restored_health-db.actor.health) ppe:start() Вот сам класс: -- Постэффект class "recovery_effect" (effector) function recovery_effect:__init(add_health) super() self.params = effector_params() self.params.blur=0 self.params.gray=0 self.params.dual=duality(0,0) self.params.noise=noise(0,0,0) self.params.color_add=color(0,0,0) self.params.color_base=color(0,0,0) self.params.color_gray=color(0,0,0) self.max_add=add_health -- Максимальная яркость self.time_start=time_global() -- Время начала self.time_in=self.time_start+add_health*1.5*1000 -- Время максимального осветления self.time_white_scr=self.time_in+add_health*2.5*1000 -- Время начала сброса осветления self.time_out=self.time_white_scr+add_health*0.75*1000 -- Время конца self.time_start_in=self.time_in-self.time_start self.time_white_scr_out=self.time_out-self.time_white_scr self.pi2=math.pi/2 end function recovery_effect:process(pp) local time=time_global() msg("!") if time<self.time_in then local color_add_cur=self.max_add*math.cos(self.pi2*(self.time_in-time)/self.time_start_in) self.params.color_base=color(color_add_cur,color_add_cur,color_add_cur) elseif time<self.time_white_scr then self.params.color_base=colol(self.max_add,self.max_add,self.max_add) elseif time<self.time_out then local color_add_cur=self.max_add*math.sin(self.pi2*(self.time_out-time)/(self.time_white_scr_out)) self.params.color_base=color(color_add_cur,color_add_cur,color_add_cur) end effector.process(self,pp) pp:assign(self.params) return true end function recovery_effect:finished() return self.time_out<time_global() end Где найти соответствие имен костей и номеров костей? Изменено 18 Января 2011 пользователем Cyclone Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 18 Января 2011 Как работает level.vertex_in_direction? Конкретно алгоритм действия движка. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 19 Января 2011 Можно представить любую локацию как карту с графом, где вершины - level vertex'ы. С исходным вертексом и направлением более-менее понятно. А вот с третьим параметром не очень. Возможно, что движок тупо отсчитывает от данного в вертекса в таком-то направлении такое-то расстояние и выбирает ближайший к получившейся точке level vertex. Тогда вызов level.vertex_in_direction(lv,dir,dis) в модуле level эквивалентен: function vertex_in_direction(lv,dir,dis) local pos=vertex_position(lv) dir=dir:normalize() pos:add(dir*dis) return position_to_vertex(pos) -- где position_to_vertex(pos) возвращает ближайший к точке pos level vertex. end Я прав? Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 19 Января 2011 Так что функция получается быстрая - собственно такой формат аи-сетки для этого и делали smile.gif А какой это "такой формат аи-сетки"? И что значит двоичный поиск? Если думать о том, как этот алгоритм может быть реализован, то можно прийти в выводу, что функция эта весьма затратная, поскольку вертексов может быть под миллион и больше. По идее, если номера вертексов более-менее связаны между собой, то возможно используются генетические алгоритмы. Поделиться этим сообщением Ссылка на сообщение
IQDDD 5 Опубликовано 10 Июля 2016 Как определить, к какому серверному классу принадлежит серверный объект? Поделиться этим сообщением Ссылка на сообщение