Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий

*Shoker*

Создай функцию, внутри которой будет твой "кусок кода" и вызывай когда нужно.

А вообще ответить сложно. Покажи что у тебя есть (или на примере) и объясни какую часть кода и когда ты хочешь выполнить.

И по возможности подробнее.

Ссылка на комментарий

Да я вообще узнать хотел. Аналоги goto в паскале и прочее. Ковырялся в коде, и вдруг подумал, что в этом месте хорошо бы было "перескачить" кусок кода, чтобы не заморачиваться с условными операторами.

 

Функции и прочее это да, но всё же не совсем то. Ну раз нет, значит нет - ничего страшного :)

 

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Пробило на писательство, поэтому решил дать немного информации. То ли скучно, то ли альтруизм возыграл... (то ли банально - водка :))

Может кому-то нужно будет, может нет, но мне как-то понадобилось отслеживать все события, происходящие с полями таблицы, и производить с ними некие действия (отнюдь не сексуального характера

:)). Будь то добавление поля, или обращение к таковому.

Вот и нашёл (по-украински - досить давно) код.

В такой таблице нужно создать единственное поле с уникальным ключём, значением которого, впоследствии, будет ваша таблица. Доступ к этому ключу будет исключён. Ну разве что случайно.

Для вашей таблицы создаётся метатаблица с методами обращения (__index) и назначения (__newindex) :

local unique_key = 'very_uniquie_key'
local mt={
__index=function(t,k)
print('GET')
return t[unique_key][k]
end,
__newindex = function (t,k,v)
print('NEW')
t[unique_key][k] = v
end

}

function proxy(t)
    local proxy={}
    proxy[unique_key]=t
    setmetatable(proxy, mt)
    return proxy
end


tab = proxy{} -- Тут создаём таблицу. Только добавляем вызов конструктора 'proxy'

-- А тут происходят самые обычные действия
tab[4]=7 -- добавляем новое поле --> вызывается метаметод __newindex --> напечатает "NEW"
local v = tab[4] -- обращаемся к полю нашей таблицы --> вызывается метаметод __index -->  напечатает "GET"

Т.е. как и ожидалось. При любом обращении вызывается метаметод. И тут, вместо 'print('GET')' или соответственно 'print('NEW')', можно чего-то там с ним делать.

Причём при создании - tab = proxy{} Вы можете передавать уже созданную таблицу.. Например :

local t = {[5]='rrr'}
tab = proxy(t)

 

Изменено пользователем Gun12
Ссылка на комментарий

Так-ссс. Молчите? Скажу словами Билли (Николай Караченцов, х/ф "Человек с бульвара Капуцинов"), - "Настоящему мужчине всегда есть что сказать" (xStream - я применяю это изречение как метафору :)).

Ну нет - так нет. Продолжу свой монолог.

Только что попался как мальчишка. Спешка, знаете ли, замылила очи.

Решал простую задачку, и при сложении (частности опущу, оставлю суть) :

local v = 0.1 + 0.1 + 0.1
print(v==0.3) --> false

Оказалость что "Y"-то не равен 0,3. Сгоряча меня это привело в ступор.

Затем пришёл в себя :) Это же FLOAT!. Доки (по крайней мере для С/С++) пишут примерно такое :

Числа с плавающей точкой хранятся как 53 бита мантиссы, плюс 11 бит экспоненты, плюс знаковый бит.

 

sign | exponent | fraction (часть, доля)

63 | (11 bit) 52 | (52 bit) 0

* | *********** | ****************************************************

Для Lua, как надстойку С (and company). думаю это тоже справедливо.

Так что стандартную ошибку в написании (мой пример) нужно всегда учитывать.

Например для сотых долей - это 17 знаков

v = 0.1 + 0.1 + 0.1

if math.abs(v-0.3)<0.0000000000000001 then v=0.3 end
print(v==0.3)
-- или же более цивилизованно
if math.abs(v-0.3)<1e-16 then v=0.3 end
print(v==0.3)

Для сотых 18 знаков, но для начала наберите такой код :

for i=0,1,.05 do
    print(i)
end

Единицы в конце Вы не увидете, хотя и должна же быть? Потому что :

for i=0,1,.05 do
    print(i,string.format('%.18f',i))
end

Для корректности используйте способ, указанный выше.

Дальше...

Не помню когда и где, но кто-то просил написать код для окон GUI. В части распределения символов и слов по ширине строки окна.

Я, в силу своего увлечения lua, не стал конкретизировать код для сталкера, а расчитал его для максимального количества символов в строке.

Ну вдруг кому-то нужно будет? :

function expl(s,c)
    return  function ()
                if s == "" then return end
                local a, b, d = s:sub(1, c), s:sub(c+1), c
                if not (b:match("^%s") or b:len()==0 or a:match("%s$")) then
                    local v = a
                    while a:match("%S$") do
                        d = d-1
                        a = a:sub(1,d)
                        if d == 1 then
                            a, d = v, c
                            break
                        end
                    end
                end
                s = s:sub(d+1)
                return a
            end
end

for v in expl(s,10) do  -- в аргументах указывается строка и число символов, на которые она будет делится (слова не режутся а переносятся целиком)
    print(v)
end

Дальше... Ну хватит пока. К столу приглашают.

 

Изменено пользователем Gun12
Ссылка на комментарий

Пища для ума

 

А вот такой код:

local i= 0.1+0.1+0.2

if (i==0.4) then print("TRY")
end

Работает как надо

 

Сейчас проверил на С++

 

#include <iostream>

using namespace std;

int main ()
{
    float i = 0.1+0.1+0.1;
    if (i==0.3) cout << "i=0.3"<<endl;
    else cout << "no i=" << i <<endl;

    float a = 0.1+0.1+0.2;
    if (a==0.4) cout << "a=0.4"<<endl;
    else cout << "no a=" << a <<endl;

    cout << "done";
    getchar();

    return 1;
}

 

 

Выводит:

no i=0.3

no a=0.2

done

 

Никогда не знал об этом

Изменено пользователем _Призрак_

Freedom

Ссылка на комментарий

Ооо. Люди заитересовались. А если так :

local i= 0.1+0.1+0.3

if (i==0.4) then print("TRY")
end

И объясните - почему? (Не мне а всем)

Изменено пользователем Gun12
Ссылка на комментарий

А так у тебя код математически не правилен. Одна десятая + одна десятая + 3 десятых будут равны пяти десятым, но никак не 0.4 :D

Freedom

Ссылка на комментарий

Сорри. Мой адекват уже на уровне обезьяны.

local i= 0.03+0.07+0.05

if (i==0.15) then print("TRY")
end

Ваше слово?

Изменено пользователем Gun12
Ссылка на комментарий

Ух ты О_о

 

Написал такой код в С++

#include <iostream>

using namespace std;

int main ()
{
    double i = 0.1+0.1+0.1;
    if (i==0.3) cout << "i=0.3"<<endl;
    else cout << "no i=" << i <<endl;

    double a = 0.1+0.1+0.2;
    if (a==0.4) cout << "a=0.4"<<endl;
    else cout << "no a=" << a <<endl;

    cout << "done";
    getchar();

    return 1;
}

 

 

Разница с предыдущим кодом только в изменении типа float на double. Результаты удивили:

no i=0.3

a=0.2

done

 

Получается что в ЛУА все дробные числа типа double

Но почему так происходит - я не понимаю. Знатоки, объясните

 

Добавлено через 6 мин.:

Gun12

Тут даже сказать нечего. Хотя есть чего. Буду меньше пользоваться дробными числами от греха подальше

Freedom

Ссылка на комментарий

local i= 0.1+0.1+0.5
print(string.format('%.18f',i)) --> 0.699999999999999960   НО НЕ  0.7!!!
if (i==0.7) then print("TRY") --> хоть и TRUE
end

 

Добавлено через 26 мин.:

Да, для корректности кода :

for i=0,1,.05 do
    print(i)
end

который даст неправильный результат. рекомендую использовать такую конструкцию :

for i=0,20,1 do
    print(i*0.05)
end

 

Добавлено через 32 мин.:

Да не стесняйтесь задавать вопросы про Lua.

И я, и многие другие когда-то тоже начинали.

Но в отличии от Вас мы всё это проходили методом проб и ошибок.

А теперь уже есть немало доков (инструкций, сайтов), да и я, собственно, буду помогать чем могу.

Главное стремление. Как думаете?

 

Добавлено через 48 мин.:

Тут высказывалось немало мнений ЗА и ПРОТИВ аддонов к сталкеру, но результат работы, в частности работу RvP, я бы не смог переоценивать.

Пускай модули и так создавались при добавлении файла *.script, но теперь я (например) могу создать собственный класс, независимый от прихотей игры. Даже со своим расширением.

Мне, к примеру, не нравится работа с файловой системой в сталкере. Теперь я могу воспользоваться своей, для меня более удобной. Я буду парсить *.ltx и *.xml так, как мне это хочется. Я буду даже работать с CMD, реестром (ну если мне это нужно будет). А debug это отдельная тема. Она как (вот уже укранский) суперечлива, так и однозначно (обьективно) полезна во многих ситуациях.

Да и время подтвердило, что использование даже стандартных средств Lua избавило от многих проблем. Главное знать когда и где их применить.

 

Добавлено через 26 мин.:

На те Вам для напряжения (по Пуаро) серого вещества. Пока без комментариев :

-- Перегрузка операции __add  для конкатенации строк

mt = {}

function String(string)
  return setmetatable({value = string or ''}, mt)
end

function mt.__add(a, b)
  return String(a.value..b)
end

s = String('Hello')
print((s + ' There ' + ' World!').value )

Изменено пользователем Gun12
Ссылка на комментарий

Gun12,

if (i==0.4) then print("TRY")

end[/code]И объясните - почему?

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

Изменено пользователем malandrinus
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

Некоторое время назад malandrius описал как создать тестовый полигон для скриптов. Если интересно, вот немного модифицированная версия. Добалена возможность исполнять отдельную функцию и передавать в нее аргументы - что очень помогает при тестировании, например callbacks.

 

--[[
  Call functions in protected environment (original: http://www.amk-team.ru/forum/index.php?showtopic=6458#entry258260)
  @param string sType - "file" or "chunk". Required. TODO: "chunk" functionality
  @param string sName - file path. Optional. Path of the file to load relative to bin, will use default (aa_test.script) if nil.
  @param boolean bFunc - execute one function with arguments. Optional. By default will execute function test(...)
  @param table tArgs - arguments for function above. Optional. TODO: find out why ... didn't work.
  @return object oResult - function execution results (if any)
--]]
function sandbox(sType, sName, bFunc, tArgs)
    local sStatus, oResult = pcall(exec, sType, sName, bFunc, tArgs)
    if sStatus == false then
      --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Asandbox()~C07 call - ~C0B"..tostring(sResult).."~C07")
      --// Ouput to screen or log
    else
      return oResult
    end
end

--[[
  Execute file or chunk (original: http://www.amk-team.ru/forum/index.php?showtopic=6458#entry258260)
  @param string sType - "file" or "chunk". Required. TODO: "chunk" functionality
  @param string sName - file path. Optional. Path of the file to load relative to bin, will use default (aa_test.script) if nil.
  @param boolean bFunc - execute one function with arguments. Optional. By default will execute function test(...)
  @param table tArgs - arguments for function above. Optional. TODO: find out why (...) didn't work.
--]]
function exec(sType, sName, bFunc, tArgs)
  local t = tArgs or {}
  if sType == "file" then
    if sName then
      local sReturn = assert(loadfile(sFilePath))
      if type(sReturn) == "function" then
        if bFunc then
          sReturn()
          test(t) --// execute specific function with arguments t
        else
          sReturn()
        end
      else
        --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec()~C07 call - ~C0B"..tostring(sReturn).."~C07")
        --// Ouput to screen or log
        return
      end
    else
      local sFilePath = "..\\gamedata\\scripts\\aa_test.script"
      local sReturn = assert(loadfile(sFilePath))
      if type(sReturn) == "function" then
        if bFunc then
          sReturn()
          test(t)
        else
          sReturn()
        end
      else
        --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec()~C07 call - ~C0B"..tostring(sReturn).."~C07")
        --// Ouput to screen or log
        return
      end
    end
  elseif sType == "chunk" then
    --// TODO: chunk functionality
    return
  else
    --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec() ~C07call - invalid sType: ~C0B"..tostring(sType).."~C07")
    --// Ouput to screen or log
  end
end

 

 

 

Примечания - используя Lua перехватчик от alpet, который помимо всего прочего (alpet спасибо!), позволяет выводит строки в одельную консоль и сдвигать ее на второй монитор.

 

Callback:

function on_actor_hit(oObj, fAmount, vDirection, oWho, iBoneIndex)
  aa_util.sandbox("file", "..\\gamedata\\scripts\\aa_test1.script", true, {oObj, fAmount, vDirection, oWho, iBoneIndex})
end

 

aa_test1.script:

function test(tbl)
  oObj, fAmount, vDirection, oWho, iBoneIndex = unpack(tbl)
  local sWhoName = oWho:character_name()
  local sWpn = oWho:active_item():section() or oObj:active_item():section()
  local sBodyPart = aa_util.get_body_part(iBoneIndex)
  local fActorHealth = oObj.health
  if fActorHealth <= 0.5 then
    oObj.health = 1
  end

-- вевести все на экран или в лог (я использую Lua перехватчик, поэтому вызовы закомментировал - думаю разберетесь)
--[[ 
  ODS("~C07[~T] ~C0E[INFO] ~C06Actor hit details: ----------------------------~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Hit by: ~C0B"..sWhoName.."~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Amount: ~C0D"..string.format("%2.1f", fAmount*100).."~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Body P: ~C0B"..sBodyPart.."~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Health: ~C0B"..string.format("%2.1f", fActorHealth*100).."~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Weapon: ~C0B"..sWpn.."~C07")
--]]
end

 

 

 

 

П.С. Если будут проблемы - пишите, помогу отладить.

 

Прежде всего - спасибо за x-ray extensions и справочник по функциям! Трудно представить сколько времени и усилий было затрачено.

 

Вопросы:

1. При использовании оператора ... у меня выдавалась ошибка по типу no such operator defined. Пришлось использовать table, хотя во многих скриптах этот оператор используется. Чем может быть вызвано?

2. Если будет время, напиши небольшой how-to по xray extensions (r18). Видел люди выкладывали то что извеснто на данный момент, но там далеко не все.

 

 

Изменено пользователем Andrey07071977
Ссылка на комментарий

Andrey07071977, пара помарок:

 

1. Функция exec принимает аргументом sName, по наличию которого вызывается функция assert, но в нее передается неопределенный аргумент sFilePath ...

 

2. В функции sandbox при выводе в лог используется также неопределенная sResult вместо (вероятно) полученной oResult (от pcall).

 

Насчет проблемы с оператором '...' - что-то непонятно ... Укажи места кода в которых у тебя затыкалось.

Заменил все твои таблицы на оператор и проверил в игре - никаких заморочек.

Использовал так:

--[[
  Call functions in protected environment (original: http://www.amk-team.ru/forum/index.php?showtopic=6458#entry258260)
  @param string sType - "file" or "chunk". Required. TODO: "chunk" functionality
  @param string sName - file path. Optional. Path of the file to load relative to bin, will use default (aa_test.script) if nil.
  @param boolean bFunc - execute one function with arguments. Optional. By default will execute function test(...)
  @param table tArgs - arguments for function above. Optional. TODO: find out why ... didn`t work.
  @return object oResult - function execution results (if any)
--]]

function sandbox(sType, sName, bFunc, ...)
  local bStatus, Result = pcall(exec, sType, sName, bFunc, ...)
  if bStatus ~= false then
    return Result --/>
  else --// Ouput to screen or log
    --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Asandbox()~C07 call - ~C0B"..tostring(Result).."~C07")
  end
end

--[[
  Execute file or chunk (original: http://www.amk-team.ru/forum/index.php?showtopic=6458#entry258260)
  @param string sType - "file" or "chunk". Required. TODO: "chunk" functionality
  @param string sName - file path. Optional. Path of the file to load relative to bin, will use default (aa_test.script) if nil.
  @param boolean bFunc - execute one function with arguments. Optional. By default will execute function test(...)
  @param table tArgs - arguments for function above. Optional. TODO: find out why (...) didn`t work.
--]]
function exec(sType, sName, bFunc, ...)
  if sType == "file" then
    if not sName then sName = "..\\gamedata\\scripts\\aa_test1.script" end
    local Return = assert(loadfile(sName)) --/ sName == sFilePath
    if type(Return) == "function" then
      if bFunc then
        Return()
        test(...) --// execute specific function with arguments
      else
        Return()
      end
    else --// Ouput to screen or log
      --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec()~C07 call - ~C0B"..tostring(Return).."~C07")
    end
  elseif sType == "chunk" then
    --// TODO: chunk functionality
  else --// Ouput to screen or log
    --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec() ~C07call - invalid sType: ~C0B"..tostring(sType).."~C07")
  end
end


--/ "Пример использования (generic_object_binder:hit_callback):"

--/ Callback:
function generic_object_binder:hit_callback(oObj, fAmount, vDirection, oWho, iBoneIndex)
  aa_util.sandbox("file", "..\\gamedata\\scripts\\aa_test1.script", true, oObj, fAmount, vDirection, oWho, iBoneIndex)
end

--/ aa_test1.script:
function test(oObj, fAmount, vDirection, oWho, iBoneIndex)
  local sWhoName = oWho and oWho:character_name()
  local sWpn = oWho and oWho.active_item and oWho:active_item() and oWho:active_item():section()
  --local sBodyPart = aa_util.get_body_part(iBoneIndex)
  local fActorHealth = oObj and oObj.health
  if fActorHealth and fActorHealth <= 0.5 then
    oObj.health = 1
  end
  --/ вевести все на экран или в лог (я использую Lua перехватчик, поэтому вызовы закомментировал - думаю разберетесь)
--[[
  ODS("~C07[~T] ~C0E[INFO] ~C06Actor hit details: ----------------------------~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Hit by: ~C0B"..sWhoName.."~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Amount: ~C0D"..string.format("%2.1f", fAmount*100).."~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Body P: ~C0B"..iBoneIndex.."~C07")
    ODS("~C07[~T] ~C0E[INFO] ~C07Health: ~C0B"..string.format("%2.1f", fActorHealth*100).."~C07")
  ODS("~C07[~T] ~C0E[INFO] ~C07Weapon: ~C0B"..sWpn.."~C07")
--]]
end

 

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

[offtop]

Извините, но венгерская нотация - это полная жопа.

[/offtop]

 

Что касается песочниц, то... Вот мой вариант:

http://dl.dropbox.com/u/46539648/xs_sandbox.rar

В архиве - мануал и два примера.

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Полная, полная. :)

От этих префиксов глаза устают, а мозги кучерявятся.

И вообще, было сказано на правах оффтопа, что уже подразумевает ИМХУ. Которое можно оспорить.

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

Например - name ну по любому строка по семантике, а bone_index - самодостаточное определение.

Спорить не хочу и не буду. Ибо ИМХО, как уже сказала.

 

И вообще, лучше б отписался по сендбоксу. У тебя критика конструктивная получается. :-P

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

xStream, отвечу с конца (так и оффтопик в тему ляжет).

 

Отпишусь обязательно, но и только что за комп сел и скачал. На вскидку: что-то на половину знакомое, что-то уже заинтересовало, но (вот!) как раз отсутсутвие привычной нотации и достаточно куцая, а порою отсутствующая, семантика - не дает сразу глубоко "въехать в код" ... Согласись, что читая: e, rev, obj, who - не сразу приходит на ум тип данных/объектов, что замедляет 'осмысленное чтение/восприятие'. Поэтому вначале посмотрю, осмыслю и опробую, дабы не отписываться банальностями (хулить иль восторгаться) иль не критиковать понапрасну или обмишурившись ... :-)

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

По своему опыту, именно "мозолящие глаза" префиксы выручают в поисках ошибок при некорректных применениях/использованиях типов данных. Как пример, только сегодня потерял десяток минут в погадалках ошибки, возникшей после оптимизации кода. Было obj:position() для клиентского объекта, а исправил код под серверный, и ... недоглядел. А вот привычное se_obj или soObj - сразу бы резануло глаза и подсказало бы гнилое место ...

 

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Согласись, что читая: e, rev, obj, who

Это уже другой разговор. Пример приведен из того кода, где песочница используется. Причем, насколько я понимаю, это сделано как раз потому, что так ПРИВЫЧНЕЕ. Это ты фанат венгерки.

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

Я единожды уяснив, что это за переменная, не нуждаюсь в том, чтоб мне съедали мозг эти префиксы всюду.

Ваши префиксы, может и хороши, но семантикой ваш код тоже не очень то может похвастаться.

А вот привычное se_obj или soObj

Опять же - кому привычное? У меня есть код, например, где в одной переменной может быть как клиентский объект, так и серверный. При этом логика поведения - не меняется

 

Тут можно долго спорить. Дело предпочтений и привычек. Лично я предпочитаю использовать нечто, очень похожее на Google Code Guideline.

Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

Венгерская нотация? Нет уже, спасибо. Артос, тут ты не прав. Это вылазит в ужасный кошмар - код нечитаем, так как постоянная смена регистра вызывает "рваное" восприятие имен, и приходится напрягаться вчитываясь в текст, чтобы осознать название переменной. Соответственно исходник непригоден для скорочтения и на его разбор уходит раз в пять больше времени, это первое. Второе - использовать венгерскую нотацию в Lua - это вообще нонсенс, так как в среде игры нет типов данных, которые бы можно было друг с другом спутать при написании кода. Третье - такие переменные очень тяжело запоминаются что вызывает необходимость часто пролистывать код, что заставляет тратить много времени впустую. Лучше сразу назвать переменную по-человечески и всё, иначе через пару часов работы с таким кодом начинает раскалываться голова просто...

 

А вот привычное se_obj или soObj - сразу бы резануло глаза и подсказало бы гнилое место ...

 

А sobj и gameobj чем неочевидны? :huh:

Изменено пользователем kamikazze

Отладчик и скриптер мода OGSE. Автор схемы "Компаньоны", стреляющего БТРа и многих других полезностей :wink:

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...