Показано с 1 по 5 из 5

Тема: Как сделать инструмент "Тень" поверх всего

  1. #1

    По умолчанию Как сделать инструмент "Тень" поверх всего

    Перерыл гугл, сам пытался лазить в скриптах, но так и не нашел способа сделать так, что бы тени добавляемые инструментом "Тень" отображались поверх всех тайлов, а не только поверх тайлов "A". Кто-нибудь знает как это можно сделать?

  2. #2
    Хранитель Аватар для Paranoid
    Информация о пользователе
    Регистрация
    22.12.2014
    Сообщений
    2,776
    Записей в дневнике
    34
    Репутация: 28 Добавить или отнять репутацию

    По умолчанию

    Никак
    Лицензионный VX Ace. Спасибо Петр.
    2 года мукеризма в пустую.

  3. #3
    Познающий Аватар для Deme
    Информация о пользователе
    Регистрация
    16.05.2014
    Сообщений
    317
    Записей в дневнике
    16
    Репутация: 4 Добавить или отнять репутацию

    По умолчанию

    Это сложно. Если я ничего не путаю, за отображение карты отвечает класс Tilemap, который является встроенным и не подлежит редактированию, и потому простого способа поменять поведение тени нет.

    Видимо, нужно заменить это поведение своим кодом:
    • написать код, который читает тень из $game_map.data и отображает её поверх других клеток,
    • а первоначальный код отображения тени отключить (путём установки всей тени в 0, или ещё как-нибудь).


    Сама тень хранится в первых четырёх байтах четвёртого слоя $game_map.data[x, y, 3] (биты по порядку дают ЛВ ПВ ЛН ПН, где Л — левый, П — правый, В — верхний, Н — нижний углы клеток соответственно), так что в собственном скрипте это наверняка возможно. Т.е. 1 = тень в левом верхнем полуквадрате, 2 = тень в правом верхнем полуквадрате, 4 — в левом нижнем, 8 — в правом нижнем. Соответственно, тень слева закодируется как 1+4=5. (Учитывайте, что другие биты в $game_map.data[x, y, 3] используются для записи регионов, так что нужно читать именно нужные биты побитовые операторы в Руби: a & 1 будет равно 1, если левая верхняя полуклетка содержит тень, и 0, если она не содержит тени.)

    Возможные подводные камни:
    • Нужно знать Руби, чтобы это сделать.
    • Скорость. Класс Tilemap сделали встроенным, чтобы карта рисовалась быстрее. Если вы заменяете часть его функциональность своим кодом для рисования тени, Ваша игра будет работать медленнее.


    N.B. Я не работаю с VX Ace и пост выше написан по результатам краткого подсматривания в код его скриптов. Возможно, существует более простой вариант, о котором я не знаю.
    Последний раз редактировалось Deme; 29.05.2017 в 12:53.
    «quī legis ista, tuam reprehendō, mea laudās // omnia, stultitiam; / nihil, invidiam» (Jōhannis Audoenī)
    'Ты, кто читает это: я порицаю, если ты хвалишь у меня // всё, твою глупость; / если ничего — твою злобу.' (Джон Оуэн)

  4. #4
    Познающий Аватар для Deme
    Информация о пользователе
    Регистрация
    16.05.2014
    Сообщений
    317
    Записей в дневнике
    16
    Репутация: 4 Добавить или отнять репутацию

    По умолчанию

    Основная проблема такого подхода не техническая, а графическая: неясно, что делать с клетками, которые расположены над героем.

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

    Не рисовать на них тень? Тогда двухуровневые объекты (скажем, деревья) будут с заметным переходом. То есть половина дерева затемнена, а другая половина — нет. Этот переход будет выглядеть довольно неестественно.

    В конечном итоге стандартная графика всё равно не подойдёт для такого режима, её придётся редактировать. А раз графику всё равно придётся редактировать — возможно, проще с самого начала добавить в графику два вида объектов («в тени» и «вне тени») и не усложнять код?
    «quī legis ista, tuam reprehendō, mea laudās // omnia, stultitiam; / nihil, invidiam» (Jōhannis Audoenī)
    'Ты, кто читает это: я порицаю, если ты хвалишь у меня // всё, твою глупость; / если ничего — твою злобу.' (Джон Оуэн)

  5. #5

    По умолчанию

    Нашел скрипт убирающий эти тени. Теперь думаю как из этого можно сделать то что необходимо.
    Спойлер код:
    Код:
    class Game_Map
      attr_reader :auto_shadows
    
      def setup(map_id)
        @map_id = map_id
        @map = load_data(sprintf("Data/Map%03d.rvdata2", @map_id))
        @tileset_id = @map.tileset_id
        @display_x = 0
        @display_y = 0
        referesh_vehicles
        setup_events
        setup_scroll
        setup_parallax
        setup_battleback
        init_auto_shadows
        @need_refresh = false
      end
    
      def init_auto_shadows
        @auto_shadows ||= []
        @auto_shadows.clear
        data.xsize.times do |x|
          data.ysize.times do |y|
            shadow_id = data[x, y, 3] & 0b1111
            data[x, y, 3] -= shadow_id
            next if shadow_id == 0
            case shadow_id
            when  3; @auto_shadows << [x*32, y*32, 32, 16]
            when  5; @auto_shadows << [x*32, y*32, 16, 32]
            when 10; @auto_shadows << [x*32+16, y*32, 16, 32]
            when 12; @auto_shadows << [x*32, y*32+16, 32, 16]
            when 15; @auto_shadows << [x*32, y*32, 32, 32]
            else
              4.times do |i|
                if shadow_id[i] == 1
                  @auto_shadows << [x*32 + i%2*16, y*32 + i/2*16, 16, 16]
                end
              end
            end
          end
        end
      end
    end

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Как сделать инструмент &quot;Тень&quot; поверх всего