Jump to content

Вопросы и ответы по MTA.


Recommended Posts

Синтаксис с двоеточием ‘:’ используется для определения методов. Эти функций неявно получают параметр 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
Синтаксис с двоеточием ‘:’ используется для определения методов. Эти функций неявно получают параметр 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

Так работает:

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
Так же непонятно, почему без строки "vec1 = Vector3( 192, 168, 0 );" ваша функция "Vector3:Nulled" не вызовется, а с ней - вызывается?

Потому что срабатывает событие __call которое является как бы конструктором, он создаёт новый объект, делает ей метатаблицу и возвращает его (объект). Об этом тоже было сказано в уроке.

Link to comment

Восьмой час уже пытаюсь разобраться в мета-таблицах, ООП и пр. Сдаюсь. :cry:

Допустим мне нужно поменять 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

Восьмой час уже пытаюсь разобраться в мета-таблицах, ООП и пр. Сдаюсь. :cry:

Допустим мне нужно поменять 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 (в плане пояснения метатаблиц):D Да и зачем строить классы самому, когда есть куча различных библиотек?

Link to comment
Вроде весь твой вопрос расписал. Вот так собственно выглядит принцип наследственности в Lua. Использовать необязательно, но просто необходимо знать и понимать всем кто называет себя знающим Lua.

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

Lua - крутой язык, мне нравится :)

Снимаю шляпу перед вами. Очень хорошо все расписано. ИМХО, стоит подредактировать и добавить в уроки.

Link to comment

Важный хоть и маленький нюанс, как в личке выяснилось.

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

То есть, так можно:

  
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

Мой вопрос о том, как выставить режимы смешивания (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
Мой вопрос о том, как выставить режимы смешивания (dxSetBlendingMode), чтобы нарисовать однородную обводку к тексту?

При таком подходе само собой разумеется, что при наложении текстов друг на друга обводка в результате получится совсем не полупрозрачная, а более непрозрачная, чем нужно было. Вот я смотрю, в последних версиях добавили переключение режимов смешивания - может через них можно организовать, чтобы результирующая прозрачность у обводки была именно 127?

П.с. рисую прямо на экран, не в рендер таргеты. Хотя возможно буду и в них тоже. Текст динамический и не один, нужно именно отрисовку обводки "на ходу". Цвет обводки и толщина тоже будет меняться.

Интересная задача. Уменьшать альфу в циклах предполагаю уже были попытки?

Link to comment
Мой вопрос о том, как выставить режимы смешивания (dxSetBlendingMode), чтобы нарисовать однородную обводку к тексту?

При таком подходе само собой разумеется, что при наложении текстов друг на друга обводка в результате получится совсем не полупрозрачная, а более непрозрачная, чем нужно было. Вот я смотрю, в последних версиях добавили переключение режимов смешивания - может через них можно организовать, чтобы результирующая прозрачность у обводки была именно 127?

П.с. рисую прямо на экран, не в рендер таргеты. Хотя возможно буду и в них тоже. Текст динамический и не один, нужно именно отрисовку обводки "на ходу". Цвет обводки и толщина тоже будет меняться.

Интересная задача. Уменьшать альфу в циклах предполагаю уже были попытки?

Нет, не были. Но тут тоже по-моему ясно, что она неоднородная выйдет. Потому что ближе к центру будет больше наложено слоев текста, чем по краям. Вся надежда на блендинг :D

Link to comment

Вспомнил я один сервер, где человек всегда находил интересные решения. И у него есть такая особенность, он в большинстве случаев не компилировал свои скрипты, и никак не пытался их скрыть. Они у него даже были с пояснениями. Так вот, делать так может и неправильно, но я иногда заходил в кэш и смотрел его клиентские файлы. Это на начальных этапах обучения очень мне помогало и там я находил оригинальные решения задач. Это скриптер Puma (клана pac) Так вот к делу, у него весь текст на сервере был с обводкой. Нашёл я эту функцию, немного изменив.

mta_screen_2014_11_08_20_48_21.jpg

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

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

Link to comment
Цель не в самой обводке, непрозрачную я и так нарисовать сумею. Цель в том, чтобы сделать обводку определенной прозрачности, и она будет однородная по всей своей толщине.

Склоняюсь к мысли, что для этого у нас в API MTA пока маловато инструментов, с сожалению.

Link to comment
Пересматривал свой архив комиксов и вот что откопал) До сих пор улыбаюсь) Конечно, это уже неактуально.

ff91b91fb8e1.jpg

После изучения Pawno, наверное стоит попробовать изучить Notepad++

Link to comment

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

Link to comment
все такие умные. куда не посмотришь - все до единого знают различие павн и павно. только павн и павно идут в комплекте у сампа и никто особо не пытается их разделять, потому и путают. а было бы больше мозгов, то и названия были бы для языка и редактора разные.

Телефоны идут в комплекте с зарядкой. Зарядкой их никто не называет.

Не в названии дело. Тот же Qt идет с Qt Creator'om, ну, букв больше, но опять же никто не путает. Да и вообще, если читать любой мануал/книгу/etc по языку, то разница между названиями точно запомнится. Путают их еще из-за форумов с названиями типа pawno-info.

все такие умные. куда не посмотришь - все до единого знают различие павн и павно.

Значит тебя окружают умные люди, это ведь хорошо :)

Link to comment
все такие умные. куда не посмотришь - все до единого знают различие павн и павно. только павн и павно идут в комплекте у сампа и никто особо не пытается их разделять, потому и путают. а было бы больше мозгов, то и названия были бы для языка и редактора разные.

В таком случае может быть стоит почитать пару уроков по Visual Studio?

Link to comment
все такие умные. куда не посмотришь - все до единого знают различие павн и павно. только павн и павно идут в комплекте у сампа и никто особо не пытается их разделять, потому и путают. а было бы больше мозгов, то и названия были бы для языка и редактора разные.

В таком случае может быть стоит почитать пару уроков по Visual Studio?

Ну, VS это очень многофункциональная IDE, а pawno это некий блокнот + подсветка + компилятор. Тут действительно можно говорить "я освоил/изучил VS". Вообще, можно так про что угодно говорить, но это звучит довольно нелепо, если "изучил" то, что просто как палка.

Link to comment

У меня есть таблица созданных пикапов 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
У меня есть таблица созданных пикапов 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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...