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

OH SHI~
Я так и думал. Надо сделать перерыв. hmm

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

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

Как можно подсчитать количество предметов у игрока?

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

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

В большинстве случаев (если не переопределялся инвентарь и не используется произвольное индексирование):

stead.table.maxn(inv());

Ну или считать самому, или итератор.

29 (edited by era3d 2011-04-10 14:25:26)

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

Вопрос:
возникла необходимость переключения между игроками. Есть код вида:


pl1 = player {
        nam = "Чел_01",
        where = 'main',
        obj = { }
};

pl2 = player {
        nam = "Чел_02",
        where = 'r2',
        obj = { }
};

main = room {
    nam = 'Комната один',
    dsc = 'Тыц-тыц совсем тыц-тыц',
    obj = {'teleport'},
    };
   

    r2 = room {
    nam = 'Совсем другая комнта',
    dsc = 'Тыц-тыц',
    obj = {'teleport2'},
    };

teleport = obj {
    nam = 'ТелепортI',
    dsc = '{Телепорт}',
    act = function ()
        return goto('main', pl1);
end,
};

teleport2 = obj {
    nam = 'ТелепортII',
    dsc = '{Другой Телепорт}',
    act = function ()
        return goto('r2', pl2);
end,
};

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

Я творец! Хочу - творю, а хочу - вытворяю!

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

1)Смена игрока: change_pl.
2)Были неправильные телепорты в неправильных комнатах. big_smile

Код ниже  вроде работает.

who = stat {
    nam = function(s)
        return 'Я:'..me().nam;
    end
};

pl1 = player {
        nam = "Чел_01",
        where = 'main',
        obj = { 'who' }
};

pl2 = player {
        nam = "Чел_02",
        where = 'r2',
        obj = { 'who' }
};

main = room {
    nam = 'Комната один',
    dsc = 'Тыц-тыц совсем тыц-тыц',
    obj = {'teleport'},
    };
   

    r2 = room {
    nam = 'Совсем другая комнта',
    dsc = 'Тыц-тыц',
    obj = {'teleport2'},
    };

teleport = obj {
    nam = 'ТелепортI',
    dsc = '{Телепорт}',
    act = function ()
    change_pl('pl1');
        return goto('r2');
end,
};

teleport2 = obj {
    nam = 'ТелепортII',
    dsc = '{Другой Телепорт}',
    act = function ()
    change_pl('pl2');
        return goto('main');
end,
};

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

А это более правильный вариант. Наверное, это и требовалось?
Без goto, но с return change_pl(), так как последний сам делает goto туда, где находится новый player.

who = stat {
    nam = function(s)
        return 'Я:'..me().nam;
    end
};

pl1 = player {
        nam = "Чел_01",
        where = 'main',
        obj = { 'who' }
};

pl2 = player {
        nam = "Чел_02",
        where = 'r2',
        obj = { 'who' }
};

main = room {
    nam = 'Комната один',
    dsc = 'Тыц-тыц совсем тыц-тыц',
    obj = {'teleport'},
    };
   

    r2 = room {
    nam = 'Совсем другая комнта',
    dsc = 'Тыц-тыц',
    obj = {'teleport2'},
    };

teleport = obj {
    nam = 'ТелепортI',
    dsc = '{Телепорт}',
    act = function ()
    return change_pl('pl2');
end,
};

teleport2 = obj {
    nam = 'ТелепортII',
    dsc = '{Другой Телепорт}',
    act = function ()
    return change_pl('pl1');
end,
};

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

Что значит

attempt to index local 'o' (a string value)

и почему это происходит при

        
used = function(s,o)
drop(o)
o._dropped = true
end
Просим вас также помнить о пагубном воздействии на психику
агрессивных эмоций и негативных эмоций вообще.

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

Спасибо Peter. Очень помог. Работает все как надо.

Я творец! Хочу - творю, а хочу - вытворяю!

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

3yMa wrote:

Что значит

attempt to index local 'o' (a string value)

и почему это происходит при

        
used = function(s,o)
drop(o)
o._dropped = true
end

в данном примере 'o' это практически наверняка (если писать стандартным образом) текст.
То-есть, например, o == 'vedro';  Это ссылка на объект, но не сам объект. Большинство функций, типа drop, правильно работают как с ссылкой,так и с самим объектом.

А o._dropped это явное обращение к объекту. Варианты:

vedro._dropped  = true

Или, что правильнее:

ref(o)._dropped = true; -- этот вариант сработает всегда

Где ref -- это получить объект по ссылке. ( Пояснение: ref('vedro') == vedro, ref(vedro) == vedro)

35 (edited by 3yMa 2010-01-25 14:37:05)

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

Спасибо! Очень помог!

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

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

А можно прописать свои функции вместо стандартных tak, dsc и т.п. у объектов?

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

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

Не совсем понял вопрос, так как по умолчанию у объектов нет ни dsc ни tak, но в любом случае ответ 'да'. big_smile

см в wiki раздел (наследование): http://instead.pinebrush.com/wiki/ru/doku.php?id=tricks

Делаешь свой класс объектов и делаешь с ним что хочешь.
Методы используешь/добавляешь тоже как угодно. Например:

function trash(v)
    v.nam = 'Мусорка';
    v.dsc = function(s)
        return call(s, 'describe');
    end
    v.used = function(s, w)
            inv():del(w);
    end
    return obj(v)
end

mytrash = trash {
        describe = 'Описание',
};

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

Охрененно! lol
Спасибо еще раз!

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

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

А такой вопрос, если я, создав класс, не определю действие, допустим, для used, то вызовется стандартная функция used?

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

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

3yMa wrote:

А такой вопрос, если я, создав класс, не определю действие, допустим, для used, то вызовется стандартная функция used?

Стандартной нет. Если у объекта есть used -- он вызовется. Если нет -- нет. Но есть еще game.act, game.use, game.used -- вот они вызываются, если не определены обработчики в объекте. В док-ции вроде есть.

41 (edited by asdbn 2010-03-23 21:27:03)

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

Добрый день
В INSTEAD есть окно действия и окно инвентаря.
У меня вопрос -  можно ли разелить окно инвентаря еще на два окна (порграммным способом или же в настройках темы) ?
Просто нужно чтобы в дополнительном окне отображался статус игрока (статус здоровья, количество патронов и т.д.)
Что то типо этого:
+---------+----+
|             |      |
|             |  2  |
|      1     |____|
|             |  3  |
+---------+----+
1-действия
2-инвентарь
3-статус или журнал

Заранее спасибо за ответ.

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

Если отвечать формально и кратко -- то нельзя.

Но вообще говоря в Карантине, зеркале и других играх есть статус и не понятно зачем для
того, чтобы отображать статус делать еще одно окно? Создается объект stat и все... Если нужна четкая граница -- вставьте графический элемент и/или оформите соответствующим образом подложку. То есть в инвентаре можно выводить то, что хочется, но _окон_ нет. Есть две области, которые называются: сцена и инвентарь. smile

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

Благодарю, Peter, за скорейший ответ
Действительно все просто  smile
А не подскажете тогда как выводить статус в нижнюю область окна инвенаря ?

44 (edited by Odyssey 2010-03-23 21:56:46)

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

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

Но, как вариант, можно разделить инвентарь на области с помощью текста, т.е. пустых строк или горизонтальной линии (____, -----, =====, и т.п., можно ещё посмотреть подходящие символы юникода). Для этого нужно добавить в инвентарь объект с соответствующим текстом. Что-то похожее было сделано в игре "Среди руин" (ruins), можно скачать её и посмотреть, исходники открыты.

P.S.
Упс, не успел smile

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

Четко спозиционировать не получится, можно только сделать статус вверху (как мы и делали до сих пор) или последней записью. Создать объект stat и добавить его первым в инвентарь или добавить в инвентарь с большим индексом inv():add('mystatus',10000);

При этом в статусе нарисовать разделитель с помощью img();

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

Peter wrote:

При этом в статусе нарисовать разделитель с помощью img();

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

инвентарь
    предмет инвентаря 1
    ...
    предмет инвентаря N
    [10000] статус (журнал)
        разделитель (текстовый или графический через img)
        статусное сообщение 1
        ...
        статусное сообщение N        

47 (edited by asdbn 2010-03-23 22:10:06)

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

Ну тогда еще вопрос.
В версии 1.1.5 добавлена поддержка события клика по картинке сцены.
Тоесть я так понимаю на сцене можно вывести какую нибуть картинку и щелчек по ней будет вызывать нужное событие... (тоесть как щелчек по нужным {словам} текста)..?
И можно узнать какой командой это делается?

PS. Извеняюсь за столько нубских вопросов... просто мне INSTEAD больно приглинулся и хотелось бы в нем разобратся  smile

PPS. Peter, Odyssey большое спасибо вам  smile

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

Про мышь:
http://instead.pinebrush.com/wiki/ru/do … 1%88%D1%8C

От себя могу посоветовать не начинать с великих свершений а сделать простой квест, без наворотов. smile Недавно такой квест сделал jhekasoft, просто и интересно. Инстед делался не для наворотов ( которыми он все таки начал обрастать) а для того, чтобы автор не думал об оформлении, но думал об истории. Также, если с программированием сложно, можно писать на URQ (есть модуль для инстеда), клики по картинкам там тоже есть...

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

Согласен с Peter, что начинать в текстовых квестах лучше всё же с текста smile

Если нужна возможность щелчка по картинкам, то в INSTEAD нужно различать картинку сцены, и картинки, встроенные в описание.

В первом случае картинка -- это единое целое, как в квестах "Возвращение квантового кота" и "Одна старая история". Т.е. она НЕ состоит из объектов, как описание сцены. В версии 1.1.5 появилась возможность отслеживать клик по такой картинке по координатам, но это будет отдельное событие, в котором координаты придётся проверять и вызывать нужные обработчики самостоятельно.

Во втором случае (картинки, встроенные в описание), можно просто встроить небольшую картинку в описание объекта с помощью img. Тогда она появится в потоке текста. Если включить её в ссылку ({}) то при щелчке по ней вызовется обработчик объекта, в описание которого она встроена.

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

день добрый!
пытаюсь использовать форматирования текста

obj = { vway("дальше", txtm('"Из люка донеслось глухое {рычание}."'), 'scene03') },

в итоге вылазит ошибка:

Error: main.lua:17: attempt to call global 'txtm' (a nil value)

как сделать правильно, подскажите smile