Topic: спрайты

Всем привет!

А есть ли где-нибудь дема спрайт-движка instead-1.7.0?
Оптимально, если посмотреть совместное использование текстового квеста и спрайтов?

Спасибо!
S.

Re: спрайты

1. в описании модуля sprites на вики
2. игра color lines в оф репе
3. игра star fighter в неоф репе

но должно хватить и 1

Re: спрайты

А можно ссылок в wiki накидать? А то с первого раза не нашел.

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

Re: спрайты

Читать вики проще чем писать игры. smile Лучше научиться первое сначала.

Вики->Документация для разработчиков -> модули -> sprites.

Спрайты в instead это просто способ рисовать напрямую (и относительно быстро) в экран или в область картинки. Коллизии придется рассчитывать самому.

В принципе - для простых аркадных вставок хватит, но это не полноценный 2d движок, например, все трансформации делаются софтверно.

Разницу между renpy и INSTEAD лучше увидеть на готовых играх: они совсем разные. И концептуально и внешне. Посмотри пару игр из официального репозитория. Это не визуальные новеллы. Конечно, есть что-то общее, но принцип разный.  Лучше сначала решить что ты хочешь написать.

Вообще, не смотря на то, что когда мы слышим словосочетание "текстовый квест", большинство представляет нечто среднее (книга игра/Космические рейнджеры/CYO) реально разница в подходах велика. Если стоит выбор между renpy и INSTEAD у меня появляется мысль, что не подойдет ни один из движков, тк принципы у них совсем разные и выбор скорее всего стоит как: мне нужно что-то, что выводит текст. smile

Можно открыть отдельную ветку, где я попробую написать для чего делался INSTEAD, для каких игр.

Re: спрайты

Не, просто в wiki реально ссылка не бросается в глаза smile

Тут в общем дело не в том, что и для чего делалось.

на самом деле, я хочу странного, и действительно,
что renpy, что instead, делались совсем не для того,
для чего я их хочу использовать.

Тут надо немного объяснить - я программист, под всякое
embedded, в основном под Linux, и у меня большой бакграунд
именно как программиста. Но захотелось мне немного себя
развить как автора - есть идея истории, вынашиваемая уже несколько
лет. Но есть также и программистский бакграунд и лень,
потому как знаю я, кроме всяких скриптовостей, C, perl, python и lua.
C++, на котором все что только можно написано - мне не пошел совсем.
Мне гораздо проще адаптировать что-то на C или на Python для своих
целей, чем брать что-то, чему я не смогу полностью доверять.
К тому же мне не нужно 3D.

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

То есть по сути это вкусовщина, и я просто хочу понять, что мне выбрать.
Времени у меня совсем немного, смотреть буду совсем неспешно,
Просто я уже сунулся в renpy, там можно все сделать, но очень уж оно
замороченно получается, соответсвенно хочу понять, а не проще ли оно в instead.
Экстеншн на C, если потребуется, напишу, так как lua я много использую во всякой встройке.

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

Re: спрайты

Спрайты есть - это прямой враппер в SDL, но SDL неспешен и софтварен, поэтому массы спрайтов в реалтаймне не будет. Будет что то вроде color lines или star figter. То-есть простая аркада - да - возможно (см star fighter), можно даже сложнее и на современном железе будет давать 60 fps, если надо ... Но... Но - все-таки это не совсем прямой путь. Исходный код глянь star fighter - увидишь насколько сложно или просто.

Вообще - есть тупо функции - отрисуй, залей итд, и таймер - внутри которого отрисовывается сцена. Вот и все.

P.S. на C нет смысла писать - все равно отрисовка спрайтов это проброс в SDL напрямую.

Re: спрайты

Есть два режима:
1) весь экранн окна INSTEAD наш
2) область картинки наша

И рисуем соответственно в 1 или 2.

В wiki это описано и есть законченный пример демо, который можно запустить (скопипастив его), это и есть хороший старт.

Ну и, конечно, есть шрифты. Враппер в SDL_ttf.

Re: спрайты

Огромное спасибо!

Re: спрайты

А сколько маленьких, не анимированных спрайтов одновременно находящихся на экране потянет instead? Скажем, если мне взбредет в голову замостить часть экрана спрайтиками 8х8 пикселей? Область 100х100 спрайтов вытянет? Анимация не нужна, нужна статичная картинка, т.е. запредельный FPS не нужен, но все же возможность кликать по ссылочкам должна остаться.

Re: спрайты

Статичная? А в чем тогда проблема? Вообще в плане анимации спрайтов не все так плохо, довольно хорошая скорость, можно сделать много разных эффектов, причем с большим ФПС.

Re: спрайты

Ну по скольку Instead - это интерпретатор и без того, как я понял, не быстрого языка, а в этой теме сказано, что отображение графики в оболочке проходит весьма и весьма не спешно, отсюда и возникает вопрос мой.
Вот нужно мне, допустим, в некой комнате вывести одновременно 10000 (сетка 100х100) маленьких спрайтов. Сколько времени займет прогрузка такой комнаты и не будет ли комп тормозить в этой комнате? Мощное железо не рассматриваем, берем, к примеру, среднестатистический нетбук. 1.6 гигагерца, 1-2 гига оперативый, видяха 128 метров, высасываемых из оперативы.

12 (edited by Vorov2 2013-01-15 23:50:24)

Re: спрайты

Инстед - это интерпретатор как раз довольно быстрого языка (по меркам интерпретируемых). Но вообще, если речь идет о графике, все упирается в отрисовку, тут скорость кода на самом языке роли большой не играет. Да и сам SDL-то не Луа написан. А загрузка 10000 разных спрайтов вообще упрется в диск, как мне кажется.

В целом, по вашему юз-кейсу я ничего конкретно сказать не могу, т.к. подобного не делал, но вот анимацию большого спрайта 960x580 инстед вытягивает с 50 ФПС на моем не самом свежем проце с 2.6 Ггц. В вашем же случае - проще взять и проверить. Думаю, если спрайты, если часто повторяются, и вы их будете кэшировать, все это должно отрисоваться в пределах секунды.

Re: спрайты

Ну секунда - это норм smile значит надо будет попробовать!
Я интересуюсь в плане отрисовать, например, карту местности, собранную из тайлов. Разумеется типов тайлов будет несколько меньше, чем 10000 smile
А как их закэшировать? В менуале на wiki я такого не заметил... это возможность lua?
И, если не против, давай на ты, м?

Re: спрайты

Загрузить спрайт и сохранить ссылку на него в каком-нибудь поле или переменной. Если спрайты используются постоянно, можно грузить их при загрузке игры сразу. После отрисовки, разумеется, free не вызывать.
Отрисовывать, кстати, надо обязательно через sprite.copy - так быстрее всего.

Вообще я бы сделал загрузку-кэширование по требованию. Как-то так:

spritecache = {
   get = function(s,sprite_name)
      if s[sprite_name] == nil then
         s[sprite_name] = sprite.load("gfx/"..sprite_name..".jpg"); --Тут надо вписать реальный генерируемый путь
      end
      return s[sprite_name];
   end
}

--Использование
spritecache:get("floor")

15 (edited by malcolm 2013-02-06 12:45:41)

Re: спрайты

что-то не пойму... почему вот такой код:

global {
    sky = 'gfx/sky.png; ';
    w_l2 = 'gfx/w_l2.png; ';
    w_f_l = 'gfx/w_f_l.png; ';
    w_r1 = 'gfx/w_r1.png; ';
    dark = 'gfx/dark.png; ';
};

main = room {
    pic = function()
        p (sky, w_l2, w_f_l, w_r1, dark);
    end;
    nam = 'тестовые переходы',
    dsc = [[Эта комната для проверки отображения переходов]],
    way = {vroom('', 'nord'), vroom('На север', 'nord'), vroom('^', 'nord'), vroom('На запад', 'west'), vroom('На восток', 'east'), vroom('^', 'east'), vroom('На юг', 'sud'), vroom('', 'sud')},
};

работает нормально, вот такой:

global {
    instpic = sprite.load('instead.png');
};

nord = room {
    pic = instpic,
    nam = 'север',
    dsc = [[Это северная комната]],
    way = {'main'},
};

тоже работает, а вот такой:

global {
    sky = sprite.load('gfx/sky.png; ');
    w_l2 = sprite.load('gfx/w_l2.png; ');
    w_f_l = sprite.load('gfx/w_f_l.png; ');
    w_r1 = sprite.load('gfx/w_r1.png; ');
    dark = sprite.load('gfx/dark.png; ');

};

main = room {
    pic = function()
        p (sky, w_l2, w_f_l, w_r1, dark);
    end;
    nam = 'тестовые переходы',
    dsc = [[Эта комната для проверки отображения переходов]],
    way = {vroom('', 'nord'), vroom('На север', 'nord'), vroom('^', 'nord'), vroom('На запад', 'west'), vroom('На восток', 'east'), vroom('^', 'east'), vroom('На юг', 'sud'), vroom('', 'sud')},
};

не работает?
Как соединить несколько спрайтов воедино и вывести в область картинки?

Re: спрайты

В док-ции написано, что спрайты нужно грузить и восстанавливать в init/start. Объяснять долго, но global = это переменная кот сохраняется. А спрайты - всегда создаются заново.

17 (edited by malcolm 2013-02-06 12:50:34)

Re: спрайты

Все равно не понимаю. Сделал вот так:

global {
    sky = sprite.load('gfx/sky.png; ');
    w_l2 = sprite.load('gfx/w_l2.png; ');
    w_f_l = sprite.load('gfx/w_f_l.png; ');
    w_r1 = sprite.load('gfx/w_r1.png; ');
    dark = sprite.load('gfx/dark.png; ');
    instpic = sprite.load('instead.png');
};

function init()
    sky = sprite.load('gfx/sky.png; ');
    w_l2 = sprite.load('gfx/w_l2.png; ');
    w_f_l = sprite.load('gfx/w_f_l.png; ');
    w_r1 = sprite.load('gfx/w_r1.png; ');
    dark = sprite.load('gfx/dark.png; ');
    instpic = sprite.load('instead.png');
end;

main = room {
    pic = function()
        p (sky, w_l2, w_f_l, w_r1, dark);
    end;
    nam = 'тестовые переходы',
    dsc = [[Эта комната для проверки отображения переходов]],
    way = {vroom('', 'nord'), vroom('На север', 'nord'), vroom('^', 'nord'), vroom('На запад', 'west'), vroom('На восток', 'east'), vroom('^', 'east'), vroom('На юг', 'sud'), vroom('', 'sud')},
};

Не работает. Картинка не отображается.


и почему же тогда нормально работает вариант:

global {
    instpic = sprite.load('instead.png');
};

nord = room {
    pic = instpic,
    nam = 'север',
    dsc = [[Это северная комната]],
    way = {'main'},
};

пробую по всякому... пока вывожу 1 спрайт - все нормально. Как только пытаюсь совместить несколько - картинка не отображается.

Re: спрайты

А в доке написано, что загружаться нужно в start. smile init выполнится ДО load

19 (edited by malcolm 2013-02-06 13:01:36)

Re: спрайты

А в доке написано:

В функции init можно загружать и создавать те спрайты, которые будут необходимы во время цикла всей игры, например:

поменял init на start - не помогло.

Re: спрайты

А, так ты составные спрайты делаешь? Гммм... Я не уверен вообще, что так можно. Если ты используешь спрайты, придется всю отрисовку делать спрайтами, в том числе и комбинации картинок.

Но можешь приаттачить последний main.lua я проверю.

21 (edited by malcolm 2013-02-06 13:14:30)

Re: спрайты

Я хочу свой лабиринт перевести с составного pic, который каждый раз грузит картинки с диска, на составные спрайты. Чтобы они висели в оперативке. Надеюсь это ускорит вывод. Экспериментирую сейчас вот в этом файле (аттач):

(и о том, что я хочу составные спрайты делать я несколько раз сказал, грррр! mad ) да и из кода, который я приводил, это ИМХО понятно.

Post's attachments

Attachment icon mcmtestgame.rar 28.96 kb, 135 downloads since 2013-02-06 

Re: спрайты

Да, спрайты не поддерживают классическое комбинирование. Наверное, они могли бы это делать, но не могут. Предполагалось, что раз ты используешь спрайты - придется отрабатывать все через спрайты. Те использовать draw/combine итд.

Комбинация через ';' - это для картинок, загружаемых извне. См, доку по спрайтам - функции draw/copy/combine. Это единственный путь комбинировать,

23 (edited by malcolm 2013-02-06 13:14:44)

Re: спрайты

z-Hunter вроде то же самое пытался сделать... я вот что подумал... если выставление ОДНОГО спрайта как pic - работает, то может сначала совместить все спрайты в один, а уже потом присвоить его к pic?

Я попробовал, но тоже что-то не получилось.

Re: спрайты

Он делает по другому, через спрайты. А ты попытался совместить 2 подхода. Интересно! Но инстед такое не поддерживает. См copy/draw/combine

25 (edited by malcolm 2013-02-06 13:19:05)

Re: спрайты

См copy/draw/combine

посмотрел... не понял sad
пойду у z-Hunter пример его способа поклянчу...

Интересно! Но инстед такое не поддерживает.

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