1,151

Re: Вопросы по программированию игр

А что такое _l? Просто в момент вызовов _l объекты какие-то еще не созданы?

Re: Вопросы по программированию игр

Это та самая функция _l(key) то что нужно для её работы парсится при старте. И при использовании внутри функции все работает, а при использовании внутри замыкания - нет. Вопрос по сути некритичный, просто интересно почему так работает, думал может кто знает.

1,153

Re: Вопросы по программированию игр

По идее единственная разница в том, что когда ты пишешь _l прямо в инициализации hill. то куча объектов, до которых не дошла очередь еще не инициализированы. А function - в момент вызова. Когда уже все готово.

Re: Вопросы по программированию игр

Я понял как оно работает smile  В конструкции вида  замыкание( функция()  )  функция вызывается только один раз, при инициализации.

То есть

text = _l('key') - _l вызывается один раз при инициализации, text принимает статическое значение которое вернет функция _l т.е. кривое ?#key#?
text = function() return _l('key') end -- функция function() вызывается при каждом обращении, функция _l вызывается при каждом обращении
text =_r ( _l('key') ) -- замыкание _r вызывается при каждом обращении, то что передается в замыкание вычисляется один раз при первом проходе т.е. _l повторно не вызовется и так и будет ?#key#?

1,155 (edited by Punkroku 2013-08-25 14:42:20)

Re: Вопросы по программированию игр

Я хочу, чтобы создать различные способы сказать то же самое.
отл.
game.use = {'. OK', 'получил его.', 'использованы.', 'сделать.', 'все в порядке.', 'прямо на.', 'успех.','ok.', 'got it.', 'used.', 'done.', 'okay.', 'right on.',};

Мне нравится, как создать удачи на стр. 1. хорошая идея. использовать
function(s) luckf = {i = rnd (100); if i < с then return -1; else if i <(100-s) then return 0; else if i >= (100-s) then return 1; end end end end,

Я хочу знать, как использовать курсивом и жирным шрифтом в тексте, поэтому я могу создать тему, чтобы использовать разные шрифты для лучшего повествования. Я читал где-то на повороты для изменения как рассказчик повествует. Может быть, все БУКВАМИ! или добавление полу случайного текста.

useit = function(s)
 success  = luckf(5); -- Здесь есть масса 5. 5% несчастьем 90% нормальный успех или критическим ударом и т.д. ..
if success then p' критический удар'; else if success == false then p 'пропускать'; else p 'хит'; end end end,

Re: Вопросы по программированию игр

Punkroku, учи русский язык и пиши грамотно. Либо пиши в английском разделе и не выпендривайся.  cool

1,157

Re: Вопросы по программированию игр

Как правильно написать такой код: img('путь/', переменная, '.png')? В таком виде не работает.

1,158

Re: Вопросы по программированию игр

склейка строк это ..
img("абв".."где"..tonumber(100)..".jpg")

1,159

Re: Вопросы по программированию игр

Privet vsem, sorry za latinku, pishu s telephona tak kak v otpuske nahozhus' i zabyl cabel' chtoby pustit' internet v comp. roll

Seichas pytajus' sdelat' slijanie dvuh obj, pri kotorom odin zapisyvajetsia poverh drugogo i dopolniaet ego svoimi parametrami. Chto-to vrode nasledovania v OOP. Problema v tom, chto esli polnost'ju i recursivno slit' odnu obj tablicu v druguju, to perepisyvajutsia i sluzhebnye polia INSTEAD v kotorih hranitsia ID  etc.
Vopros - kakie polia obj ne nado kopirovat'  (iskluchit' iz slijania)?

1,160

Re: Вопросы по программированию игр

Сложно так делать и не надежно. Так как любой модуль может привнести свои переменные. Я не до конца понял про слияние, но можно ли просто добавить обж в обж смисок объекта в который мы сливаем?
Если цель именно слить, то сливай те переменные которые разные. Те те которых нет в обоих объектах одновременно. А потом отдельно dsc.

Re: Вопросы по программированию игр

Добрый ночер. Сие как нибудь можно оптимизировать? Все работает, но, кажется, слажновато получается.. Опыты со спрайтами.


instead_version '1.8.1'
require 'sprites'
require 'timer'
include = book
spr = sprite

rndD6 = function()
        v = rnd(5)+rnd(6)
        return v
end;


main = room {
    nam = 'demo';
    pic = sprite.load 'box:200x200,black';
};


function start()
    opas_nois = 256
    opas_trg = 1
    tim = 0
end


function init()
    timer:set(60);
    end;
    pic1 = sprite.load 'gfx/rain_splash/04.jpg';
    der = sprite.load  'gfx/r1.png';
    derb = sprite.load 'gfx/r2.png';
    derf = sprite.load 'gfx/r3.png';
    derr = sprite.load 'gfx/r4.png';
    dery = sprite.load 'gfx/r5.png';

    splash1 = sprite.load 'gfx/rain_splash/01.jpg';
    splash2 = sprite.load 'gfx/rain_splash/02.jpg';
    splash3 = sprite.load 'gfx/rain_splash/03.jpg';
    stat_01 = sprite.load 'gfx/rain_splash/stat_01.png';
    stat_02 = sprite.load 'gfx/rain_splash/stat_02.png';
    stat_03 = sprite.load 'gfx/rain_splash/stat_03.png';
   
    nois_01 = sprite.load 'gfx/rain_splash/nois_01.png';
    nois_02 = sprite.load 'gfx/rain_splash/nois_02.png';
    nois_03 = sprite.load 'gfx/rain_splash/nois_03.png';
    nois_04 = sprite.load 'gfx/rain_splash/nois_04.png';
    nois_05 = sprite.load 'gfx/rain_splash/nois_05.png';

mainroom = function()
        if tim == 1 then
        spr.draw(pic1, main.pic,0,0);
        --spr.draw(stat_01, main.pic,0,0);
        spr.draw(der,  main.pic,0,0);
        spr.draw(nois_01,  main.pic,0,0,opas_nois);
       
        p (rndD6(v))
        p ('^'..opas_nois)
       
    end
        if tim == 2 then
        spr.draw(pic1, main.pic,0,0);
        --spr.draw(stat_02, main.pic,0,0);
        spr.draw(derb,  main.pic,0,0);
        spr.draw(nois_02,  main.pic,0,0,opas_nois);
       
    end
        if tim == 3 then
        spr.draw(pic1, main.pic,0,0);
        --spr.draw(stat_03, main.pic,0,0);
        spr.draw(derf,  main.pic,0,0);
        spr.draw(nois_03,  main.pic,0,0,opas_nois);
       
    end
        if tim == 4 then
        spr.draw(pic1, main.pic,0,0);
        --spr.draw(stat_02, main.pic,0,0);
        spr.draw(derr,  main.pic,0,0);
        spr.draw(nois_04,  main.pic,0,0,opas_nois);
       
    end
        if tim == 5 and rndD6(v) <10 then
        spr.draw(pic1, main.pic,0,0);
        --spr.draw(stat_01, main.pic,0,0);
        spr.draw(dery, main.pic, 0,0);
        spr.draw(nois_05,  main.pic,0,0,opas_nois);
       
        tim = 0
    elseif
        tim == 5 and rndD6(v) >= 10 then
        spr.draw(pic1, main.pic,0,0);
        --spr.draw(stat_01, main.pic,0,85);
        spr.draw(dery, main.pic, 0,0,80);
        spr.draw(nois_01,  main.pic,0,0,opas_nois);
    end
--der derb derf derr dery
        if tim == 6 then
        spr.draw(splash1, main.pic, 0,0);
        --spr.draw(stat_02, main.pic,0,0,70);
        spr.draw(der, main.pic, 0,0,50);
        spr.draw(nois_02,  main.pic,0,0,opas_nois);
    end
        if tim == 7 then
        spr.draw(splash2, main.pic, 0,0);
        --spr.draw(stat_03, main.pic,0,0,80);
        spr.draw(derb, main.pic, 0,0,70);
        spr.draw(nois_03,  main.pic,0,0,opas_nois);
    end
        if tim == 8 then
        spr.draw(splash3, main.pic, 0,0);
        --spr.draw(stat_02, main.pic,0,0,90);
        spr.draw(derf, main.pic, 0,0,80);
        spr.draw(nois_04,  main.pic,0,0,opas_nois);
    end
        if tim == 9 then
        spr.draw(splash3, main.pic, 0,0);
        --spr.draw(stat_03, main.pic,0,0);
        spr.draw(derr, main.pic, 0,0);
        spr.draw(nois_05,  main.pic,0,0,opas_nois);
       
    end
        if tim == 10 then
        spr.draw(splash3, main.pic, 0,0);
        --spr.draw(stat_02, main.pic,0,0);
        spr.draw(dery, main.pic, 0,0);
        spr.draw(nois_03,  main.pic,0,0,opas_nois);

        tim=0
    end
end;


game.timer = function()
        vsplash = 0
        tim = tim+1
        mainroom()
       
       
        if opas_trg == 1
        then
            opas_nois = opas_nois+25
        end
        if opas_trg == 0
        then
            opas_nois = opas_nois-15
        end;
       
        if opas_nois <=20 and opas_nois <=512  then
            opas_trg = 1
        elseif opas_nois >=512 then
               opas_trg = 0
        end;
       
end;

1,162

Re: Вопросы по программированию игр

Сейчас объясню подробно что я пытаюсь сделать.

Предположим, есть некий сложный obj, например в моей игре про грузовик это экран навигационного компьютера в машине главного героя. Там есть свои скрипты, act, inv, used, obj, разные переменные отслеживаемые скриптами и тд.  Допустим, всю игру герой разъезжает на этой машине, и в каждой локации его машина это (с точки зрения движка) отдельная сцена, при этом в каждой сцене есть этот экран, который должен вести себя везде сходным образом, но с некоторыми изменениями. А ещё есть другие машины, в которых тоже есть аналогичные экраны, которые тоже ведут себя в целом похоже, но отличаются какими-то моментами.
Прописывать заново для каждой сцены такой объект со всей его кухней было бы нерациональным, и загромоздило бы код. А если реализовать внутри объекта логику поведения во всех сценах, то это:
  1) неудобно, поскольку у меня обычно всё разбито на части (главы), а тут сцена в одном месте а кусок её логики в другом
  2) приводит к сложному коду с вложенными условиями, описывающими всё поведение во всех сценах, в котором сам очень скоро начинаешь путаться
  3) выглядит неряшливо и не демонстрирует всю мощь и концептуальность Инстеда

  Самым удобным, в данном случае, мне представляется как в ООП, для каждой сцены создавать свой объект класса "экран" который будет сразу по дефолту содержать всё, что положено иметь экрану. В объявлении такого объекта достаточно просто написать свойства какого объекта он наследует, и указать что в нём поменять, например картинку, или dsc или какой-то obj. Причём последний это элемент списка objs, и он не перепишет весь список, а добавится к нему.   
  Поэтому я решил сделать расширенный класс объектов cobj, способных к наследованию и полиморфизму (см. пример ниже). Сейчас тут всё работает, за исключением того, что не работает smile ... то есть я имею ввиду, что объект создаётся, однако в игре не отображается. Подозреваю, что это потому, что он является слишком уж полной копией исходного включая служебные поля вроде id.

instead_version "1.8.0"


function IsTable(s)   
  return type(s or false) == "table" ;
end;

function table.deepcopy(t)    ---> возвращает полную рекурсивную копию t включая метатаблицы 
                                --(корректная копия любого объекта Lua)    
    if IsTable(t) then
        local mt = getmetatable(t); local res = {};
        local k; local v;
        for k,v in pairs(t) do
            if IsTable(v) then
                v = table.deepcopy(v);
            end;
            res[k] = v;
        end;
        setmetatable(res,mt);
        return res;
    else                
        return t;        
    end;    
end;



function table.deepmerge(t1, t2)                ---> возвращает результат рекурсивного слияния t2 поверх t1
                                                    -- (одинаковые поля переписываются теми что в t2)                                        
    if t2 then                                    -- t2 может не существовать
        local res = table.deepcopy(t1)                    -- временный буфер чтобы не испортить оригинал
        local k; local v;                        
        for k,v in pairs(t2) do
            if IsTable(v) and IsTable(res[k]) then                            -- если и там и там таблицы
                table.deepmerge(res[k], t2[k])                                        -- рекурсивно обходим их
            else 
                res[k] = v                                                            -- если нет, то просто копируем значение t2
            end;
        end;
        return res;
    else
        return t1;
    end;    
end;

function cobj(v)                            ---> конструктор расширенных obj
    if v.inherit then                        -- этот объект наследует
        v = table.deepmerge(v, v.inherit)   -- при этом расширяя/заменяя какие-то параметры родителя своими (полиморфизм)
    end;
    obj(v)                                    -- теперь отдаём получившееся конструктору обычных obj
end;

--- ///////////////  

keyboard = obj {
    nam = "клавиатура";
    dsc = "У компьютера есть клавиатура"
};

mouse = obj {
    nam = "мышь";
    dsc = "и мышка"
}

comp = obj {                                
    _var = "у этого объекта есть переменные ",
    _tabl = {
        "включая таблицы", "возможно добавленные сторонними модулями",
        "и мы можем даже не знать об этом",
    },
    nam = "Компьютер 1",
    dsc = "На стене мерцает экран {компьютера}.",
    act = function(s)
        p (s._var, s._tabl[1]);
    end,
    obj = { keyboard },
};

comp2 = cobj {                                -- расширенный obj способный наследовать
    inherit = comp,                            -- наследуем у comp
    nam = "Компьютер 2",                    -- но меняем имя на другое
    obj = { mouse },                        -- и добавляем/меняем что-то ещё
    _var = "у этого объекта есть другой набор переменных ",
    _tabl = {"и добавлен один новый элемент в таблицу"},
};


main = room {
    nam = "Тестовая 1",
    obj = {comp},
    way = {"main2"},
};

main2 = room {
    nam = "Тестовая 2",
    obj = {comp2},
    way = {"main"},
};

  Функция table.deepmerge вполне корректно работает когда я с её помощью объединяю таблицы двух obj (например deepmerge(comp.obj, comp2.obj) ). А вот если целиком слить два obj (deepmerge(comp, comp1) ), то объект, который она возвращает, после пропускания его через конструктор obj не появляется в игре. То же самое с table.deepcopy.

Re: Вопросы по программированию игр

z-Hunter wrote:

Сейчас объясню подробно что я пытаюсь сделать.

Эти объекты не через дипкопи нужно делать, а писать для них конструктор и создавать новый с новым именем или через new. У меня в Код-10 подобная задача была - бойцы, объекты на местности, противники - все это через наследование сделано, можешь глянуть. В документации были хорошие примеры по этому поводу про разбитое окно помоему.

1,164

Re: Вопросы по программированию игр

Tam kak raz i realizovano cherez konstruktor, prosto ja sdelel glupuju oshibku - vmesto return(obj(v)) napisal prosto obj(v) tak chto ono sozdavalo ob'ekt no konstructor ego ne vozvrashal, sootvetstvenno v igre on ne pojavlialsia.

1,165

Re: Вопросы по программированию игр

Глупый вопрос. Есть комната. В ней прописана картинка, которая этой комнате соответствует.
_picture_name = 'img/0093_main.jpg';
   pic = function(s)
        return s._picture_name;
   end;
Все работает, при заходе в комнату выводится нужная картинка.
Но в следующей комнате по такому же принципу прописана другая картинка:
_picture_name = 'img/0094_hive.jpg';
   pic = function(s)
        return s._picture_name;
   end;
И при смене локаций, картинка не меняется, остается прежней. Что не так делаю?

1,166

Re: Вопросы по программированию игр

Рабочий пример нужен, может быть что угодно. smile

1,167

Re: Вопросы по программированию игр

kolobod wrote:

Глупый вопрос. Есть комната. В ней прописана картинка, которая этой комнате соответствует.
_picture_name = 'img/0093_main.jpg';
   pic = function(s)
        return s._picture_name;
   end;
Все работает, при заходе в комнату выводится нужная картинка.
Но в следующей комнате по такому же принципу прописана другая картинка:
_picture_name = 'img/0094_hive.jpg';
   pic = function(s)
        return s._picture_name;
   end;
И при смене локаций, картинка не меняется, остается прежней. Что не так делаю?

Что сыпется в терминал? Дебаггер молчит? Картинка вообще есть нужная по тому пути который указан? Регистр\правильность написания имен\названий?

Qui habet aures audiendi, audiat...

1,168

Re: Вопросы по программированию игр

j-maks wrote:

Что сыпется в терминал? Дебаггер молчит?

"Дяденька, я не настоящий сантехник, а гаечный ключ просто нашел")) В смысле, я даже не знаю, что в данном контексте - терминал. Мое "программирование" - это подбор методом тыка, до посинения)) Не конструктивно, согласен - но все же я живое доказательство того, что обезьяна с клавиатурой может давать результат. Странный... но результат)

После миллиардов тыков, проблема внезапно решилась после замены ";" на ",". Я не знаю, как это работает, просто магия INSTEAD наверное))

1,169

Re: Вопросы по программированию игр

Исходники бы посмотреть... smile

1,170

Re: Вопросы по программированию игр

kolobod wrote:
j-maks wrote:

Что сыпется в терминал? Дебаггер молчит?

"Дяденька, я не настоящий сантехник, а гаечный ключ просто нашел")) В смысле, я даже не знаю, что в данном контексте - терминал. Мое "программирование" - это подбор методом тыка, до посинения)) Не конструктивно, согласен - но все же я живое доказательство того, что обезьяна с клавиатурой может давать результат. Странный... но результат)

После миллиардов тыков, проблема внезапно решилась после замены ";" на ",". Я не знаю, как это работает, просто магия INSTEAD наверное))

Конечно болтовня, но если допустим запустить instead.exe из командной строки (так называемого терминала), а еще и с параметром -debug, и в коде игры в шапке файла main.lua добавить require "dbg", то всякие вот эти лишние телодвижения по поводу "тыкание до посиенения" сэкономят время и жизненные ресурсы на что-нибудь полезное, допустим написать еще кучу кода, потому как все эти удобства помогают понять, что где и не так в коде.
Интерпритатор пишет где и какие ошибки происходят, луа ругается на строки и прочее, какое ей непонятно и что не определено, ну и про синтаксис, она в общем тоже сообщает. А еще круто использовать какой-нибудь текстовый редактор со сниппетами адаптированными под луа язык, он сразу ругается на использование всяких запятых\точкозапятых не там где можно.

Если уж взялись за разработку так и надо пользоваться хоть каким минимальным набором разработчика.
Окно терминала в windows средах открывается следующим образом, сочетание клавиш Windows + r, в строку появившегося окошка пишем cmd, открывается терминал, переходим в каталог куда установлен instead с помощью команд cd , dir, ls, далее запускаем инстед с параметрами sdl-instead.exe -debug -noautosave

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

Qui habet aures audiendi, audiat...

1,171

Re: Вопросы по программированию игр

j-maks wrote:

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


Спасибо, начал юзать. Теперь, хотя бы смогу показать - на что именно INSTEAD ругается, если что)

1,172 (edited by kolobod 2013-10-16 13:07:46)

Re: Вопросы по программированию игр

Еще вопрос, на который не сумел найти ответ в документации.
Как удалить предмет инвентаря из "меню-кармана"?
inv():del('предмет'); и remove(s, me());  - результата не дают

UPD: пардон, разобрался! Моя дурацкая невнимательность! ; )

1,173

Re: Вопросы по программированию игр

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

key_good_room = obj {
    nam = [[Ключ от комнаты]];
    inv = [[Обычный ключ, со странной гравировкой.]];
    act = [[Ключ, как ключ]];
  tak = [[Вы получили ключ от комнаты]];
  use = function(s, w)
        if w == door_1 then
            p 'Открыл!'
        else
            p 'Не открыл'
        end;
    end;
};

Вопрос в том как в условии "w == door_1", сделать так чтобы если объект начинается на слово door (door_1, door_bar), то условие выполнялось.
Хотел сделать через find, но что-то не идет.
Заранее спасибо.

1,174

Re: Вопросы по программированию игр

я бы сделал у key_good_room признак какой-нибудь, типа _key_type_a = true;

и в объектах-дверях сделал бы функцию used (не use), где проверял бы типа if w._key_type_a then...
ы?

1,175 (edited by Valey 2013-10-16 17:49:45)

Re: Вопросы по программированию игр

Ну как вариант можно, но тогда если что-то менять, надо будет каждую дверь проверять заново.
Думал еще сделать через OR 
if w == door_1 or w == door_2 then
Но условие длинное получиться тогда.