Вопросы и ответы (STEAD2)

  1. ‹ Older
  2. 3 weeks ago

    kolobod

    Oct 29 User since 2014
    Edited 3 weeks ago by kolobod

    Добрый день всем!
    Как-то показали мне, как делать для иллюстрации сцены - композиционную картинку, из фона и нескольких слоев - каждому из которых задано своё место.

    Spoiler!
    pic = function(s)
    if УСЛОВИЕ-1 then return sprite.load ('PIC/КАРТИНКА-1.png; PIC/СЛОЙ-1a.png@0,0; PIC/СЛОЙ-2с.png@62,0');end;
    end;   


    Восторгу моему не было предела. Решил я, что легко «разобью» эту конструкцию на отдельные части – и буду управлять напрямую каждым слоем картинки. Для каждого задавать отдельные условия! Например: сделаю куклу героя, а вокруг будет интерактивно отображаться все его оружие, вещи, их состояние и тд, и тп. Но криворукость моя триумфально восторжествовала. Пытался так:

    Spoiler!
    pic = function(s)
    if УСЛОВИЕ-1 then return sprite.load ('PIC/КАРТИНКА-1.png);end;
    if УСЛОВИЕ-2 then return sprite.load ('
    PIC/СЛОЙ-2a.png@0,0');end;
    if УСЛОВИЕ-3 then return sprite.load ('
    PIC/СЛОЙ-3a.png@0,0');end;
    if УСЛОВИЕ-4 then return sprite.load ('
    PIC/СЛОЙ-4a.png@0,0');end;
    --и так далее…
    end;   


    Не вышло. Читал док по спрайтам – там в основном про то, как спрайтами рисовать, заливать цвет и прочее. Так что - разбился я об задачу, казавшуюся вполне реализуемой. В прикрепленном файле простенький пример. Комната после выбора игроком персонажа и оружия. В идеале хочется сделать, чтобы отображалось всё, указанное в любой комбинации условий. Если у нас TRUE комбинация «силач» с «топором» и «щитом» - значит, именно это и отобразиться.
    Ну и совсем изумительно, если можно будет на части экипировки нажимать, переносясь в «комнаты» с информацией об этом оружии и тд. То есть – если у игрока есть щит, можно кликнуть на него и зайти на другой экран: где подробно осмотришь этот щит, почитаешь всю инфу о нем, и советы по применению.
    Может кто подскажет, как быть, в какую сторону рулить?

  3. peter

    Oct 29 Administrator Земля(Москва) User since 2014
    Edited 3 weeks ago by peter

    Если речь про stead2 (не stead3). То спрайт возвращать так нельзя, будет постоянно создаваться спрайт и утекать память. В stead3 так можно делать, но не в stead2.

    Далее, самый простой способ - составные картинки.
    Цитирую доку по stead2:

    INSTEAD может обрабатывать составные картинки, например:

    pic = 'gfx/mycat.png;gfx/milk.png@120,25;gfx/fish.png@32,32';

    Таким образом, составная картинка представляет собой набор путей к изображениям, разделенных символом ;. Вторая и последующие компоненты могут содержать постфикс в виде @x_координата,y_координата, где координате 0,0 соответствует левый верхний угол всего изображения. Общий размер картинки считается равным общему размеру первой компоненте составной картинки, то есть, первый компонент (в нашем примере – gfx/mycat.png) играет роль холста, а последующие компоненты накладываются на этот холст.

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

    pic = 'gfx/galaxy.png;gfx/star.png@c128,132';

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

    То есть:

    pic = function(s)
          pr 'gfx/galaxy.png'  -- фон
          if условие1 then -- объект 1
              pr ';star.png@c128,132'
          end
          if условие2 then -- объект 2
              pr ';planet.png@12,12'
          end
    end

    pr - формирование вывода без пробела на конце.
    Если нужно чтоб координаты были из переменных:

    pic = function(s)
          pr 'gfx/galaxy.png'  -- фон
          if условие1 then -- объект 1
              pr (string.format (';star.png@%d,%d', obj_x, obj_y)) -- obj_x/obj_y позиция
              pr (";star.png@",tostring(obj_x), ",", tostring(obj_y)) -- или так
          end
    end

    Со спрайтами проще работать в STEAD3, не буду про них писать, они сложнее в использовании чем то что я выше описал.

  4. kerber

    Oct 29 User since 2014

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

  5. peter

    Oct 29 Administrator Земля(Москва) User since 2014

    kerber только sprite.load надо убрать =) просто return "и вся эта строка"
    В stead2 спрайты сами собой не освобождаются

  6. kerber

    Oct 29 User since 2014

    Тащемто надо всё это безобразие переписать на человеческий инстед. Т.е. на объекты. Чтобы вместо выставления флагов в global просто дать воину меч, щит или что-то там.

  7. peter

    Oct 29 Administrator Земля(Москва) User since 2014

    И на stead3 =)

  8. kolobod

    Oct 29 User since 2014

    peter, kerber - спасибо! Это прям то что надо)))
    Тогда сразу спрошу еще, пользуясь случаем.

    1. Возможно ли часть кусков картинки и их "регулирование" (через условия "если/то") - перенести из pic в какую-то общую функцию? Например в function init()? Задать там интерфейсные штуки, нужные для всей игры, а не только в конкретной комнате - например отображение где-нибудь в углу, картинкой - здоровья игрока? Если он здоров - улыбающаяся мордочка, если ранен - грустная и тд.

    2. Возможно ли сделать часть кусков картинки "активной"? Например, кликнул на всё ту же "грустную мордочку" в интерфейсе - и перешел в комнату с отдельным описанием физического состояния героя: сколько у него здоровья, есть ли раны или травмы, наложены ли защитные руны и тд?

  9. peter

    Oct 29 Administrator Земля(Москва) User since 2014

    1. ну просто объявляй переменные и все заранее:

    hand = ';star.png@c128,132'

    Или оформляй в функции и вызывай их. У kerber в примере нечто похожее.

    2. да - изучай модуль click, он позволяет отслеживать клики на картинке

  10. kerber

    Oct 29 User since 2014

    kolobod, если тебе нужна помощь, загляни в чятик.

  11. kolobod

    Oct 29 User since 2014

    kerber kolobod, если тебе нужна помощь, загляни в чятик.

    Обращусь непременно!))
    Пока осваиваю выданные подсказки

or Sign Up to reply!