YND Posted November 4, 2014 Share Posted November 4, 2014 Синтаксис с двоеточием ‘:’ используется для определения методов. Эти функций неявно получают параметр self в качестве первого аргумента. Это понятно, непонятно то, как сделать одну функцию для n объектов. Т.е. есть, например, функция: function cars:delDoor(args) --body end Для конкретного объекта можно её вызвать так (но в данном случае self = cars): cars:delDoor(carMustang) cars:delDoor(carBus) cars:delDoor(carBullet) Но как её вызвать так?: carMustang:delDoor() carBus:delDoor() carBullet:delDoor() Link to comment
Kernell Posted November 6, 2014 Share Posted November 6, 2014 Синтаксис с двоеточием ‘:’ используется для определения методов. Эти функций неявно получают параметр self в качестве первого аргумента. Это понятно, непонятно то, как сделать одну функцию для n объектов. Т.е. есть, например, функция: function cars:delDoor(args) --body end Для конкретного объекта можно её вызвать так (но в данном случае self = cars): cars:delDoor(carMustang) cars:delDoor(carBus) cars:delDoor(carBullet) Но как её вызвать так?: carMustang:delDoor() carBus:delDoor() carBullet:delDoor() viewtopic.php?f=153&t=57987 - только вместо обработчиков событий используйте свои функции. Link to comment
YND Posted November 6, 2014 Share Posted November 6, 2014 Так работает: local cars = {} local cars_meta = { __call = function(self, car) --<<<<<< setVehiclePaintjob (car, 2) --<<<<<< end } setmetatable(cars, cars_meta) addCommandHandler("mt", function() cars(cars[1]) -- тут я cars[1] передаю в качестве аргумента end) А так выдает, что "call method 'cars' - nil". local cars = {} local cars_meta = { __call = function(self) --<<<<<< setVehiclePaintjob (self, 2) --<<<<<< end } setmetatable(cars, cars_meta) addCommandHandler("mt", function() cars[1]:cars() -- а тут пытаюсь переда, как self end) Этот код мне самому непонятен, но ошибка такая, что первый аргумент setVehiclePaintjob - таблица. Т.е. функция вызывается, но self != cars[2] local cars = {} local cars_meta = {__call = function(returncar) return returncar end} --<<<<<< setmetatable(cars, cars_meta) function cars:Nulled() setVehiclePaintjob (self, 2) end addCommandHandler("mt", function() cars[1] = cars(cars[1) --<<<<<< cars[1]:Nulled() end) Так же непонятно, почему без строки "vec1 = Vector3( 192, 168, 0 );" ваша функция "Vector3:Nulled" не вызовется, а с ней - вызывается? Link to comment
KatastrofaS Posted November 6, 2014 Share Posted November 6, 2014 Кто-нибудь знает, как возить пассажира в лодке? Link to comment
Kernell Posted November 6, 2014 Share Posted November 6, 2014 Так же непонятно, почему без строки "vec1 = Vector3( 192, 168, 0 );" ваша функция "Vector3:Nulled" не вызовется, а с ней - вызывается? Потому что срабатывает событие __call которое является как бы конструктором, он создаёт новый объект, делает ей метатаблицу и возвращает его (объект). Об этом тоже было сказано в уроке. Link to comment
GTA-Multiplayer.com Posted November 7, 2014 Share Posted November 7, 2014 Восьмой час уже пытаюсь разобраться в мета-таблицах, ООП и пр. Сдаюсь. Допустим мне нужно поменять Paintjob конкретной машины. Как вызвать функцию cars:paintjob так, чтобы self был cars[1] ? Передавать отдельным аргументом не вариант. Возможно ли? Смотри. Прежде всего в функции cars:paintjob должны быть (). Далее. У тебя есть таблица cars. Это и есть класс для твоего автомобиля. Логичнее ее бы называть в единственном числе: car, но дело твое. Этот класс (таблица) и будет содержать общие функции для всех экземпляров твоего класса "cars". Собственно ты это и делаешь когда объявляешь: cars = {} function cars:new (o) -- Some stuff end function cars:paintjob() -- Все таки должны быть здесь скобки "()" -- Some stuff end Класс, кроме общих функций должен иметь и общие и дефолтные свойства, как я вижу из твоего кода: model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text". В таком случае добавляем к нашему классу "cars" метатаблицу: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) -- Some stuff end function cars:paintjob() -- Some stuff end Таким образом мы выставили свойства model, x, y, ... классу. Все экземпляры класса будут по умолчанию иметь эти свойства. То есть все поля таблицы сейчас выглядят так: model = 566, x = 1421.6, y = -1345.9, z = 13.6, rx = 0, ry = 0, rz = 0, carText = "Text", -- Это свойства класса new = function () -- Some stuff end, paintjob = function () -- Some stuff end -- А это методы класса Далее тебе нужно "инициализировать" класс, т.е. "создать объект". Все в кавычках, потому что перед нами Lua, а не ООП-язык. "Конструктором" нам служит new(). В нем будет рождаться экземпляр класса. Что такое экземпляр класса (или объект) в Lua? Это новая таблица, которая имеет своей метаблицей таблицу класса, т.е. твою таблицу "cars". Мы в "конструкторе" new() создаем новую пустую таблицу и присваиваем ей класс-таблицу cars как метатаблицу, вот так: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее return carObject end function cars:paintjob() -- Some stuff end Важный момент, для того чтобы потом обращаться к экзмепляру класса (объекту) мы должны его возвращать. Можно возвращать сам объект-таблицу "carObject", а "carObject"-ы хранить в отдельной таблице под индексами. В своем проекте я поступаю иначе и, как мне кажется, изящнее - я сам класс делаю хранилищем созданных экземпляров класса. Но это уже другая история. У нас еще остался маленький нюанс - аргумент o, передаваемый в конструктор и который может содержать индивидуальные свойства для каждого экзмепляра класса. Скажем model может быть не 566, а 577, другая позиция или другой carText. Или вовсем добавлено новое свойство, например, color. В этом случае мы поступаем так: 1. Рождаем экземпляр класса как и раньше. 2. Проверяем, если o не пустое значение, то к нам приехала индивидуальная таблица. 3. Делаем этой таблице o метатаблицу наш инициализированный экземпляр класса carObject. То есть по сути мы делаем эту таблицу экзмепляром класса, а ее родителем - carObject. 4. Присваиваем carObject = o, чтобы остаток кода в методе (пока это только "return carObject") сработал как надо. cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. if (o) then setmetatable(o, {__index = carObject}) carObject = o end -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее -- Затем полученный мта-объект засовываем в carObject, например carObject.element = vehicleElement return carObject end function cars:paintjob() -- Здесь берем self.element и красим его, например, setVehiclePaintjob(self.element, 2) end Все теперь мы можем делать как тебе нужно: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. if (o) then setmetatable(o, {__index = carObject}) carObject = o end -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее -- Затем полученный мта-объект засовываем в carObject, например carObject.element = vehicleElement return carObject end function cars:paintjob() -- Здесь берем self.element и красим его, например, setVehiclePaintjob(self.element, 2) end local car1 = cars:new() trace(cars1.model) -- 566 trace(cars1.color) -- nil local car2 = cars:new({model = 577}) trace(cars2.model) -- 577 trace(cars2.color) -- nil local car3 = cars:new({model = 588, color="white"}) trace(cars3.model) -- 588 trace(cars3.color) -- white cars2:paintjob() -- красим cars2 Вроде весь твой вопрос расписал. Вот так собственно выглядит принцип наследственности в Lua. Использовать необязательно, но просто необходимо знать и понимать всем кто называет себя знающим Lua. Я специально перегрузил текст терминами "экземпляры класса", "классы" и др., потому что считаю что их использовать надо, это полезно. Lua - крутой язык, мне нравится Link to comment
Other Languages Moderators Disinterpreter Posted November 7, 2014 Other Languages Moderators Share Posted November 7, 2014 Восьмой час уже пытаюсь разобраться в мета-таблицах, ООП и пр. Сдаюсь. Допустим мне нужно поменять Paintjob конкретной машины. Как вызвать функцию cars:paintjob так, чтобы self был cars[1] ? Передавать отдельным аргументом не вариант. Возможно ли? Смотри. Прежде всего в функции cars:paintjob должны быть (). Далее. У тебя есть таблица cars. Это и есть класс для твоего автомобиля. Логичнее ее бы называть в единственном числе: car, но дело твое. Этот класс (таблица) и будет содержать общие функции для всех экземпляров твоего класса "cars". Собственно ты это и делаешь когда объявляешь: cars = {} function cars:new (o) -- Some stuff end function cars:paintjob() -- Все таки должны быть здесь скобки "()" -- Some stuff end Класс, кроме общих функций должен иметь и общие и дефолтные свойства, как я вижу из твоего кода: model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text". В таком случае добавляем к нашему классу "cars" метатаблицу: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) -- Some stuff end function cars:paintjob() -- Some stuff end Таким образом мы выставили свойства model, x, y, ... классу. Все экземпляры класса будут по умолчанию иметь эти свойства. То есть все поля таблицы сейчас выглядят так: model = 566, x = 1421.6, y = -1345.9, z = 13.6, rx = 0, ry = 0, rz = 0, carText = "Text", -- Это свойства класса new = function () -- Some stuff end, paintjob = function () -- Some stuff end -- А это методы класса Далее тебе нужно "инициализировать" класс, т.е. "создать объект". Все в кавычках, потому что перед нами Lua, а не ООП-язык. "Конструктором" нам служит new(). В нем будет рождаться экземпляр класса. Что такое экземпляр класса (или объект) в Lua? Это новая таблица, которая имеет своей метаблицей таблицу класса, т.е. твою таблицу "cars". Мы в "конструкторе" new() создаем новую пустую таблицу и присваиваем ей класс-таблицу cars как метатаблицу, вот так: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее return carObject end function cars:paintjob() -- Some stuff end Важный момент, для того чтобы потом обращаться к экзмепляру класса (объекту) мы должны его возвращать. Можно возвращать сам объект-таблицу "carObject", а "carObject"-ы хранить в отдельной таблице под индексами. В своем проекте я поступаю иначе и, как мне кажется, изящнее - я сам класс делаю хранилищем созданных экземпляров класса. Но это уже другая история. У нас еще остался маленький нюанс - аргумент o, передаваемый в конструктор и который может содержать индивидуальные свойства для каждого экзмепляра класса. Скажем model может быть не 566, а 577, другая позиция или другой carText. Или вовсем добавлено новое свойство, например, color. В этом случае мы поступаем так: 1. Рождаем экземпляр класса как и раньше. 2. Проверяем, если o не пустое значение, то к нам приехала индивидуальная таблица. 3. Делаем этой таблице o метатаблицу наш инициализированный экземпляр класса carObject. То есть по сути мы делаем эту таблицу экзмепляром класса, а ее родителем - carObject. 4. Присваиваем carObject = o, чтобы остаток кода в методе (пока это только "return carObject") сработал как надо. cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. if (o) then setmetatable(o, {__index = carObject}) carObject = o end -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее -- Затем полученный мта-объект засовываем в carObject, например carObject.element = vehicleElement return carObject end function cars:paintjob() -- Здесь берем self.element и красим его, например, setVehiclePaintjob(self.element, 2) end Все теперь мы можем делать как тебе нужно: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. if (o) then setmetatable(o, {__index = carObject}) carObject = o end -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее -- Затем полученный мта-объект засовываем в carObject, например carObject.element = vehicleElement return carObject end function cars:paintjob() -- Здесь берем self.element и красим его, например, setVehiclePaintjob(self.element, 2) end local car1 = cars:new() trace(cars1.model) -- 566 trace(cars1.color) -- nil local car2 = cars:new({model = 577}) trace(cars2.model) -- 577 trace(cars2.color) -- nil local car3 = cars:new({model = 588, color="white"}) trace(cars3.model) -- 588 trace(cars3.color) -- white cars2:paintjob() -- красим cars2 Вроде весь твой вопрос расписал. Вот так собственно выглядит принцип наследственности в Lua. Использовать необязательно, но просто необходимо знать и понимать всем кто называет себя знающим Lua. Я специально перегрузил текст терминами "экземпляры класса", "классы" и др., потому что считаю что их использовать надо, это полезно. Lua - крутой язык, мне нравится в Lua полно недостатков, особенно в 5.1. А урок Kernell'a гораздо лучше https://forum.multitheftauto.com/viewtopic.php?f=153&t=57987 (в плане пояснения метатаблиц) Да и зачем строить классы самому, когда есть куча различных библиотек? Link to comment
YND Posted November 7, 2014 Share Posted November 7, 2014 Вроде весь твой вопрос расписал. Вот так собственно выглядит принцип наследственности в Lua. Использовать необязательно, но просто необходимо знать и понимать всем кто называет себя знающим Lua. Я специально перегрузил текст терминами "экземпляры класса", "классы" и др., потому что считаю что их использовать надо, это полезно. Lua - крутой язык, мне нравится Снимаю шляпу перед вами. Очень хорошо все расписано. ИМХО, стоит подредактировать и добавить в уроки. Link to comment
GTA-Multiplayer.com Posted November 7, 2014 Share Posted November 7, 2014 Важный хоть и маленький нюанс, как в личке выяснилось. При инициализации экземпляра класса с передаваемой таблицей в виде аргумента нужно инициализировать эту таблицу каждый раз. То есть, так можно: local car1 = cars:new() local car2 = cars:new({model = 577}) local car3 = cars:new({model = 588, color="white"}) Так нельзя: local car1 = cars:new() local tableWithFields = {model = 588, color="white"} local car2 = cars:new(tableWithFields) local car3 = cars:new(tableWithFields) Очевидно, что в этом случае car2 и car3 будет одним и тем же "объектом"-таблицей. Просто поля car2 будут перезаписаны полями car3. Например, поле-ссылка на мташный объект vehicle и в car2 и в car3 будут указывать только на машину #3, а машина #2 потеряется. Link to comment
Arisu Posted November 7, 2014 Share Posted November 7, 2014 Мой вопрос о том, как выставить режимы смешивания (dxSetBlendingMode), чтобы нарисовать однородную обводку к тексту? Имеем: цвет текста (например R255,G0,B0,A255), имеем цвет обводки (0,0,0,127) - черная полупрозрачная, и ее толщину - 3. Типичный алгоритм для обводки - берем и рисуем цветом обводки текст несколько раз на указанную толщину. Типа такого: for dx=-thickness, thickness do for dy=-thickness, thickness do dxDrawText(text, x + dx, y + dx, ...) end end dxDrawText(text, x, y ...) -- сам текст При таком подходе само собой разумеется, что при наложении текстов друг на друга обводка в результате получится совсем не полупрозрачная, а более непрозрачная, чем нужно было. Вот я смотрю, в последних версиях добавили переключение режимов смешивания - может через них можно организовать, чтобы результирующая прозрачность у обводки была именно 127? П.с. рисую прямо на экран, не в рендер таргеты. Хотя возможно буду и в них тоже. Текст динамический и не один, нужно именно отрисовку обводки "на ходу". Цвет обводки и толщина тоже будет меняться. Link to comment
GTA-Multiplayer.com Posted November 7, 2014 Share Posted November 7, 2014 Мой вопрос о том, как выставить режимы смешивания (dxSetBlendingMode), чтобы нарисовать однородную обводку к тексту?При таком подходе само собой разумеется, что при наложении текстов друг на друга обводка в результате получится совсем не полупрозрачная, а более непрозрачная, чем нужно было. Вот я смотрю, в последних версиях добавили переключение режимов смешивания - может через них можно организовать, чтобы результирующая прозрачность у обводки была именно 127? П.с. рисую прямо на экран, не в рендер таргеты. Хотя возможно буду и в них тоже. Текст динамический и не один, нужно именно отрисовку обводки "на ходу". Цвет обводки и толщина тоже будет меняться. Интересная задача. Уменьшать альфу в циклах предполагаю уже были попытки? Link to comment
Arisu Posted November 8, 2014 Share Posted November 8, 2014 Мой вопрос о том, как выставить режимы смешивания (dxSetBlendingMode), чтобы нарисовать однородную обводку к тексту?При таком подходе само собой разумеется, что при наложении текстов друг на друга обводка в результате получится совсем не полупрозрачная, а более непрозрачная, чем нужно было. Вот я смотрю, в последних версиях добавили переключение режимов смешивания - может через них можно организовать, чтобы результирующая прозрачность у обводки была именно 127? П.с. рисую прямо на экран, не в рендер таргеты. Хотя возможно буду и в них тоже. Текст динамический и не один, нужно именно отрисовку обводки "на ходу". Цвет обводки и толщина тоже будет меняться. Интересная задача. Уменьшать альфу в циклах предполагаю уже были попытки? Нет, не были. Но тут тоже по-моему ясно, что она неоднородная выйдет. Потому что ближе к центру будет больше наложено слоев текста, чем по краям. Вся надежда на блендинг Link to comment
Memory Posted November 8, 2014 Share Posted November 8, 2014 Вспомнил я один сервер, где человек всегда находил интересные решения. И у него есть такая особенность, он в большинстве случаев не компилировал свои скрипты, и никак не пытался их скрыть. Они у него даже были с пояснениями. Так вот, делать так может и неправильно, но я иногда заходил в кэш и смотрел его клиентские файлы. Это на начальных этапах обучения очень мне помогало и там я находил оригинальные решения задач. Это скриптер Puma (клана pac) Так вот к делу, у него весь текст на сервере был с обводкой. Нашёл я эту функцию, немного изменив. w, h = guiGetScreenSize() shadowTable = { {1,-1}, {1,0}, {1,1}, {0,1}, {0,-1}, {-1,-1}, {-1,0}, {-1,1} } function render () local shadows = {} local texts = {} table.insert ( texts, {"Простой текст", 400, 100, 100, 100, tocolor(255,255,255,255), 1, "bankgothic", "left", "top"} ) table.insert ( shadows, {"Простой текст", 400, 100, 100, 100, 255, 1, "bankgothic", "left", "top", 1} ) --указываем без tocolor, просто alpha, последнее значение толщина обводки table.insert ( texts, {"Простой большой текст", 400, 400, 100, 100, tocolor(255,255,255,255), 2, "bankgothic", "left", "top"} ) table.insert ( shadows, {"Простой большой текст", 400, 400, 100, 100, 255, 2, "bankgothic", "left", "top", 3} ) for i, t in pairs ( shadowTable ) do local oX, oY = t[1], t[2] for j, textTable in pairs ( shadows ) do local text, x, y, x2, y2, a, scale, font, alignX, alignY, thickness = unpack(textTable) oX, oY = oX*thickness, oY*thickness dxDrawText ( text, x+oX, y+oY, x2+oX, y2+oY, tocolor(0,0,0,a), scale, font, alignX, alignY ) end end for i, t in pairs ( texts ) do dxDrawText ( unpack(t) ) end end addEventHandler ( "onClientRender", getRootElement(), render ) Link to comment
Arisu Posted November 8, 2014 Share Posted November 8, 2014 Цель не в самой обводке, непрозрачную я и так нарисовать сумею. Цель в том, чтобы сделать обводку определенной прозрачности, и она будет однородная по всей своей толщине. Link to comment
Memory Posted November 8, 2014 Share Posted November 8, 2014 Извиняюсь, машинально, бездумно написал. Сейчас попробую что-нибудь дельное придумать. Link to comment
GTA-Multiplayer.com Posted November 9, 2014 Share Posted November 9, 2014 Цель не в самой обводке, непрозрачную я и так нарисовать сумею. Цель в том, чтобы сделать обводку определенной прозрачности, и она будет однородная по всей своей толщине. Склоняюсь к мысли, что для этого у нас в API MTA пока маловато инструментов, с сожалению. Link to comment
Narrator Posted November 10, 2014 Share Posted November 10, 2014 Пересматривал свой архив комиксов и вот что откопал) До сих пор улыбаюсь) Конечно, это уже неактуально. Link to comment
Kernell Posted November 11, 2014 Share Posted November 11, 2014 Пересматривал свой архив комиксов и вот что откопал) До сих пор улыбаюсь) Конечно, это уже неактуально. После изучения Pawno, наверное стоит попробовать изучить Notepad++ Link to comment
Easterdie Posted November 11, 2014 Share Posted November 11, 2014 все такие умные. куда не посмотришь - все до единого знают различие павн и павно. только павн и павно идут в комплекте у сампа и никто особо не пытается их разделять, потому и путают. а было бы больше мозгов, то и названия были бы для языка и редактора разные. Link to comment
Elengar Posted November 11, 2014 Share Posted November 11, 2014 все такие умные. куда не посмотришь - все до единого знают различие павн и павно. только павн и павно идут в комплекте у сампа и никто особо не пытается их разделять, потому и путают. а было бы больше мозгов, то и названия были бы для языка и редактора разные. Телефоны идут в комплекте с зарядкой. Зарядкой их никто не называет. Не в названии дело. Тот же Qt идет с Qt Creator'om, ну, букв больше, но опять же никто не путает. Да и вообще, если читать любой мануал/книгу/etc по языку, то разница между названиями точно запомнится. Путают их еще из-за форумов с названиями типа pawno-info. все такие умные. куда не посмотришь - все до единого знают различие павн и павно. Значит тебя окружают умные люди, это ведь хорошо Link to comment
Kernell Posted November 11, 2014 Share Posted November 11, 2014 все такие умные. куда не посмотришь - все до единого знают различие павн и павно. только павн и павно идут в комплекте у сампа и никто особо не пытается их разделять, потому и путают. а было бы больше мозгов, то и названия были бы для языка и редактора разные. В таком случае может быть стоит почитать пару уроков по Visual Studio? Link to comment
Elengar Posted November 11, 2014 Share Posted November 11, 2014 все такие умные. куда не посмотришь - все до единого знают различие павн и павно. только павн и павно идут в комплекте у сампа и никто особо не пытается их разделять, потому и путают. а было бы больше мозгов, то и названия были бы для языка и редактора разные. В таком случае может быть стоит почитать пару уроков по Visual Studio? Ну, VS это очень многофункциональная IDE, а pawno это некий блокнот + подсветка + компилятор. Тут действительно можно говорить "я освоил/изучил VS". Вообще, можно так про что угодно говорить, но это звучит довольно нелепо, если "изучил" то, что просто как палка. Link to comment
Narrator Posted November 14, 2014 Share Posted November 14, 2014 Kernell, я по достоинству оценил твою "щутку", спасибо. Но в комиксе речь не обо мне, этот комикс я давным-давно скачал откуда-то с этого форума. https://forum.multitheftauto.com/viewtopic.php?f=141&p=461626 Link to comment
YND Posted November 14, 2014 Share Posted November 14, 2014 У меня есть таблица созданных пикапов pickup[1]; pickup[2]...pickup[n]. Как прикрепить к ним событие "onPickupHit"? Прицепить его к "pickup" не вышло. Прицеплять к каждому - не вариант. Прицепить к руту - есть пикапы, для которых не нужно, чтобы срабатывало событие, а делать так, наверное, глупо. Что тогда делать? for i=1, ido if source == pickup[i] then --code return end end Табуляцию не могу сделать, так как пишу прямо тут. UPD: Как сделать видимым пикап, лишь для одного игрока? gamePickup[1] = createPickup (830.70001, -872.79999, 68.8, 107.9, 3, 1247); setElementVisibleTo (gamePickup[1], root, false); setElementVisibleTo (gamePickup[1], thePlayer, true); Так жалуется, что первый аргумент - bool, но почему так? Link to comment
Strix Posted November 14, 2014 Share Posted November 14, 2014 У меня есть таблица созданных пикапов pickup[1]; pickup[2]...pickup[n]. Как прикрепить к ним событие "onPickupHit"? Прицепить его к "pickup" не вышло. Прицеплять к каждому - не вариант. Создаёшь элемент, устанавливаешь его родителем каждого из пикапов, прикрепляешь обработчик события onPickupHit к этому элементу. Готово! createElement setElementParent addEventHandler UPD: Как сделать видимым пикап, лишь для одного игрока? gamePickup[1] = createPickup (830.70001, -872.79999, 68.8, 107.9, 3, 1247); setElementVisibleTo (gamePickup[1], root, false); setElementVisibleTo (gamePickup[1], thePlayer, true); Так жалуется, что первый аргумент - bool, но почему так? При создании пикапа createPickup указан лишний аргумент: 107.9. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now