Плохо! Плохо!:  0
Страница 1 из 4 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 31

Тема: Event MultiGraphic

  1. #1
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию Event MultiGraphic

    Caveman's event tuning
    Автор: caveman
    Версия: 1.4
    Тип: работа с событиями




    Описание:

    Это сборка из четырех скриптов для работы с событиями:
    1) Big Events
    2) Events Shift
    3) MultiGraphic
    4) Event features script

    С первыми двумя все ясно, а третий скрипт позволяет на событие навешивать сверху дополнительную графику из любых тайлсетов (вида B-E) из папки Tilesets в несколько слоев.
    Например, можно сделать сдвинутый (слава Events Shift) стол, а на него поставить бутылки и стаканы без дополнительного геморроя.
    Четвертый скрипт позволяет поворачивать и зумить графику события, а также вращать его с заданной скоростью относительно середины.
    Свойства событий рефрешатся постранично, кроме доп. графики.
    Использовать его немногим сложней, чем предыдущие два - пишите комменты в событии, и всё.

    Скрипт:
    Спойлер Код:

    Код:
    # Event shifts script VX ACE
    # автор: caveman
    # версия 1.1
    #
    # Скрипт позволяет:
    # - задавать сдвиги в px для отрисовки спрайта события
    # - задавать сдвиг по высоте z для определения, что будет отрисовано
    #   сверху при наложении спрайтов событий
    #
    # Просто напишите в комменте события нечто вроде
    # [es|-16|16|1]
    # для сдвига картинки события влево на 16 пикселей и вниз на 16, и 
    # сдвига 1 по оси z (даже +1 по z хватит, чтобы перекрыть события
    # без этого сдвига.
    #
    #
    # BIG events script VX ACE
    # автор: caveman
    # версия 1.1
    # Скрипт позволяет задать ограничивающий прямоугольник вокруг события
    # Он корректно подсчитывает коллизии, с учетом поворотов и движений
    # 
    # Можно пользовать скрипт для больших монстров или линий-телепортов на 
    # другую карту
    #
    # Просто напишите в комменте события нечто вроде
    # [bbox|1|1|2|0] (влево, вправо, вверх, вниз)
    #
    #
    # MultiGraphic script VX ACE
    # автор: caveman
    # версия 1.2
    #
    # Скрипт позволяет:
    # - комментарием навершивать сверху на событие графику из любого
    # доступного тайлсета, потенциально сколько угодно слоев
    # - делать то же самое из чарсета, с возможностью stop анимации
    # - задавать сдвиги этой графике, аналогично скрипту Event shifts
    #   сверху при наложении спрайтов событий
    # - проставлять событиям свойство counter
    #
    # Просто напишите в комменте события нечто вроде
    # [dop|Inside_C|t|1|3|8|-16|1]
    # на событие сверху наложится графика из тайлсета Inside_C в позиции
    # 1, 3 (отсчет по 32 пикселя тайл, от нуля сверху слева)
    # со сдвигом картинки вправо на 8 пикселей и вверх на 16, и 
    # сдвига 1 по оси z
    #
    # Режимы доп графики - это второй параметр
    #   t - тайлсет
    #   с - чарсет (мелкий, 3 на 4)
    #   a - анимация stop из чарсета (мелкий, 3 на 4). Скорость анимации зависит
    # от заданной frequency события
    # 
    # дополнительный тег <counter> в комментарии события позволяет взаимодействовать с другим событием
    # через это (работает как counter в тайлсете)
    # 
    # Event features script
    # автор: caveman
    # версия 1.0
    #
    # Скрипт позволяет:
    # - комментарием поворачивать или зумить графику события
    # - задавать вращение событию, регулируя скорость в комменте
    #
    # Просто напишите в комменте события нечто вроде
    # 1) [rot|10|0]
    # графика события повернется по часовой стрелке на 10 градусов
    # 2) [rot|0|5]
    # графика события будет вращаться по часовой стрелке со скоростью 5 градусов за фрейм
    # (важно: первый и второй параметры исключают друг друга)
    # 3) [zoom|50|50]
    # графика события будет сжата по х и у в 2 раза (значение - это проценты) 
    
    
    class Dop_Graphic
      attr_accessor :xs # сдвиг по х
      attr_accessor :ys # сдвиг по y
      attr_accessor :zs # сдвиг по z
      attr_accessor :rangle # угол поворота
      
      attr_accessor :tile_x  # x в тайлсете (В-Е)
      attr_accessor :tile_y  # y в тайлсете (В-Е)
      attr_accessor :tileset # тайлсет (В-Е)
      attr_accessor :mode # 0-тайлсет, 1-чарсет, 2-анимация чарсета
      
      def initialize(tileset, mode, tile_x, tile_y, xs, ys, zs)
        self.tileset=tileset
        self.mode=mode
        self.tile_x=tile_x
        self.tile_y=tile_y
        self.xs=xs
        self.ys=ys
        self.zs=zs
        self.rangle = 0
      end
    end
    
    class Sprite_Dop < Sprite_Base
      attr_accessor :character
      attr_accessor :dop
      
      def initialize(viewport, character, dop)
        super(viewport)
        self.character = character
        self.dop = dop
        @cur_x = self.dop.tile_x if self.dop.mode > 0
        @ani_count = 0
      end
     
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      def update
        super
        update_bitmap
        update_ani
        update_src_rect
        update_position
        update_other
      end
      
      #--------------------------------------------------------------------------
      # * Update Transfer Origin Bitmap
      #--------------------------------------------------------------------------
      def update_bitmap
        if self.dop.mode == 0
          set_tile_bitmap
        else
          set_character_bitmap
        end
      end
    
      #--------------------------------------------------------------------------
      # * Set Tile Bitmap
      #--------------------------------------------------------------------------
      def set_tile_bitmap
        sx = self.dop.tile_x * 32;
        sy = self.dop.tile_y * 32;
        self.bitmap =  Cache.tileset(self.dop.tileset)
        self.src_rect.set(sx, sy, 32, 32)
        self.ox = 16
        self.oy = 32
      end
      
      #--------------------------------------------------------------------------
      # * Set Character Bitmap
      #--------------------------------------------------------------------------
      def set_character_bitmap
        self.bitmap = Cache.character(self.dop.tileset)
        @cw = bitmap.width / 3
        @ch = bitmap.height / 4
        self.ox = @cw / 2
        self.oy = @ch
      end
      
      #--------------------------------------------------------------------------
      # * Update Position
      #--------------------------------------------------------------------------
      def update_position
        self.x = @character.screen_x + dop.xs
        self.y = @character.screen_y + dop.ys
        self.z = @character.screen_z + dop.zs
        self.angle = dop.rangle
      end
      
      def update_ani
        if self.dop.mode == 2
          @ani_count += 1
          if @ani_count > 18 - character.move_frequency * 2
            @ani_count = 0
            @cur_x += 1
            @cur_x = 0 if @cur_x > 2
          end
        end
      end
      
      def update_src_rect
        if self.dop.mode > 0
          sx = @cur_x * @cw;
          sy = self.dop.tile_y * @ch;
          self.src_rect.set(sx, sy, @cw, @ch)
        end
      end
      
      #--------------------------------------------------------------------------
      # * Update Other
      #--------------------------------------------------------------------------
      def update_other
        self.opacity = @character.opacity
        self.blend_type = @character.blend_type
        self.bush_depth = @character.bush_depth
        self.visible = !@character.transparent
      end
    end
    
    
    class Game_CharacterBase
      attr_accessor :xs # сдвиг по х
      attr_accessor :ys # сдвиг по y
      attr_accessor :zs # сдвиг по z
    
      attr_accessor :x_sub # shift to left
      attr_accessor :x_add # shift to right
      attr_accessor :y_sub # shift to up
      attr_accessor :y_add # shift to down
      
      attr_accessor :rangle # rotate angle
      attr_accessor :rotate_speed # rotate speed
      
      attr_accessor :zoom_x  # zoom (percents from 100)
      attr_accessor :zoom_y  # zoom (percents from 100)
      
      attr_accessor :dop_graphic # доп графика события
      
      attr_accessor :counter # событие работает как counter тайл
      
      alias es_initialize initialize
      def initialize
        clear_dops
        es_initialize
      end
      
      def clear_dops
        self.xs=0
        self.ys=0
        self.zs=0
        self.x_sub=0
        self.x_add=0
        self.y_sub=0
        self.y_add=0
        self.rangle=0
        self.rotate_speed = 0
        self.zoom_x = 100
        self.zoom_y = 100
        self.counter = false
        self.dop_graphic = []
      end
     
      def setup_shifts(dispose)
        clear_dops
        unless dispose && @list.nil?
          for command in @list
            if command.code == 108 && command.parameters[0].include?("[es")
              command.parameters[0].gsub(/\[[Ee][Ss]\|(.+?)\|(.+?)\|(.+?)\]/) do
                self.xs = $1.to_s.to_i
                self.ys = $2.to_s.to_i
                self.zs = $3.to_s.to_i
              end
            end
            if command.code == 108 && command.parameters[0].include?("[bbox")
              command.parameters[0].gsub(/\[[Bb][Bb][Oo][Xx]\|(.+?)\|(.+?)\|(.+?)\|(.+?)\]/) do
                self.x_sub = $1.to_s.to_i
                self.x_add = $2.to_s.to_i
                self.y_sub = $3.to_s.to_i
                self.y_add = $4.to_s.to_i
              end
            end
            if command.code == 108 && command.parameters[0].include?("[rot")
              command.parameters[0].gsub(/\[[Rr][Oo][Tt]\|(.+?)\|(.+?)\]/) do
                self.rangle = $1.to_s.to_i
                self.rotate_speed = $2.to_s.to_i
              end
            end
            if command.code == 108 && command.parameters[0].include?("[zoom")
              command.parameters[0].gsub(/\[[Zz][Oo][Oo][Mm]\|(.+?)\|(.+?)\]/) do
                self.zoom_x = $1.to_s.to_i
                self.zoom_y = $2.to_s.to_i
              end
            end
            if command.code == 108 && command.parameters[0].include?("[dop")
              command.parameters[0].gsub(/\[[Dd][Oo][Pp]\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\]/) do
                mode = 0  
                mode = 0 if $2.to_s == "t"
                mode = 1 if $2.to_s == "c"
                mode = 2 if $2.to_s == "a"
                dop = Dop_Graphic.new($1.to_s, mode, $3.to_s.to_i, $4.to_s.to_i, 
                  $5.to_s.to_i, $6.to_s.to_i, $7.to_s.to_i)
                self.dop_graphic.push(dop)
              end
            end
            if command.code == 108 && command.parameters[0] == "<counter>"
              self.counter = true
            end
          end
        end
      end
      
      # Столкновения для BigEvent
      def pos?(x, y)
        case @direction
        when 2
          x_s = x_sub
          x_a = x_add
          y_s = y_sub
          y_a = y_add
        when 4
          x_s = y_add
          x_a = y_sub
          y_s = x_sub
          y_a = x_add
        when 6
          x_s = y_sub
          x_a = y_add
          y_s = x_add
          y_a = x_sub
        when 8
          x_s = x_add
          x_a = x_sub
          y_s = y_add
          y_a = y_sub
        end
        
        for i in @x - x_s..@x + x_a
          for j in @y - y_s..@y + y_a
            if x == i && y == j
              return true
            end
          end
        end
        return false
      end
      
      def collide_with_events?(x, y)
        $game_map.events_xy_nt(x, y).any? do |event|
          event.id != @id && (event.normal_priority? || self.is_a?(Game_Event))
        end
      end
    end
     
    class Game_Event
      alias es_refresh refresh
      def refresh
        es_refresh
        setup_shifts(@page.nil?)
        #SceneManager.scene.update_dop(id) if SceneManager.scene_is?(Scene_Map)
      end
    end
    
    class Sprite_Character
      def update_position
        move_animation(@character.screen_x + @character.xs - x, 
          @character.screen_y + @character.ys - y)
        self.x = @character.screen_x + @character.xs
        self.y = @character.screen_y + @character.ys
        self.z = @character.screen_z + @character.zs
        rotate_update
        zoom_update
      end
      
      def rotate_update
        if @character.rotate_speed == 0
          self.angle = @character.rangle
        else
          self.ox = self.src_rect.width/2 if self.ox != self.src_rect.width/2
          self.oy = self.src_rect.height/2 if self.oy != self.src_rect.height/2
          self.angle += @character.rotate_speed
        end
      end
      
      def zoom_update
        self.zoom_y = @character.zoom_y / 100.0 if  @character.zoom_y != 100
        self.zoom_x = @character.zoom_x / 100.0 if  @character.zoom_x != 100
      end
    end
    
    
    class Spriteset_Map
      def create_characters
        @character_sprites = []
        $game_map.events.values.each do |event|
          @character_sprites.push(Sprite_Character.new(@viewport1, event))
        end
        create_dop
        
        $game_map.vehicles.each do |vehicle|
          @character_sprites.push(Sprite_Character.new(@viewport1, vehicle))
        end
        $game_player.followers.reverse_each do |follower|
          @character_sprites.push(Sprite_Character.new(@viewport1, follower))
        end
        @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
        @map_id = $game_map.map_id
        @init = true
      end
      
      def create_dop
        @dop_sprites = []
        $game_map.events.values.each do |event|
          event.dop_graphic.each do |dop|
            @dop_sprites.push(Sprite_Dop.new(@viewport1, event, dop))
          end  
        end
      end
      
      def clear_dop(event_id)
        return if @dop_sprites == nil 
        p @dop_sprites.length
        @dop_sprites.each do |dop|
          next if dop.character.id != event_id
          p 'aaaaaa'
          dop.dispose
          @dop_sprites.delete(dop)  
        end
        p @dop_sprites.length
      end
      
      def add_dop(event_id)
        @dop_sprites = [] if @dop_sprites == nil
        
        $game_map.events.values.each do |event|
          next if event.id != event_id
          if event.dop_graphic != nil && event.dop_graphic.length > 0
            event.dop_graphic.each do |dop|
              @dop_sprites.push(Sprite_Dop.new(@viewport1, event, dop))
            end
          end
        end  
      end
      
      def dispose_characters
        @character_sprites.each {|sprite| sprite.dispose }
        @dop_sprites.each {|sprite| sprite.dispose }
        @dop_sprites.clear 
        @dop_sprites = nil
      end
      
      def update_characters
        if (@flag == nil || @flag)
          refresh_characters if @map_id != $game_map.map_id
          @character_sprites.each {|sprite| sprite.update }
          @dop_sprites.each {|sprite| sprite.update }
        end
      end
      
      def set_flag(flag)
        @flag = flag
      end
    end
    
    class Scene_Map
      def update_dop(event_id)
        if @spriteset != nil
          @spriteset.set_flag(true)
          @spriteset.clear_dop(event_id) 
          @spriteset.add_dop(event_id) 
          @spriteset.set_flag(nil)
          @spriteset.update_characters
        end
      end
    end
    
    class Game_Player
      def start_map_event(x, y, triggers, normal)
        return if $game_map.interpreter.running?
        $game_map.events_xy(x, y).each do |event|
          if event.trigger_in?(triggers) && event.normal_priority? == normal && !event.counter
            event.start
          end
        end
      end
    end


    Скрин

    Демопример: https://yadi.sk/d/fO9vOXZIei24P
    Последний раз редактировалось caveman; 14.12.2015 в 13:50. Причина: 1.4 фикс
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

  2. #2
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    Во сподвиг я тебя на подвиг)



  3. #3
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию

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

    Думаю потом добавить туда еще и чарсеты с возможностью прокрутки анимации, как когда-то делал однослойно для ХП.
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

  4. #4
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    давай это тоже пригодиться а сейчас я протестирую демку посмотрю не бадают ли Fps от этого



  5. #5
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    Проверил скрипт. Фсп не падают значит использовать можно =)
    потом если можно давай переговорим в личке?



  6. #6
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию

    пиши, лимит есть еще
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

  7. #7
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    окей



  8. #8
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию

    По идее Темного обновил скрипт и дему.
    Теперь есть возможность задать в событии тег <counter>, чтобы "через него" взаимодействовать с событием за ним.
    Это как настройка counter в тайлсете, которую часто пользуют для прилавков.

    Здесь оказалось нужно, к примеру, когда вокруг стола понаставили евентами со сдвигом стульев, и гг со столом перестает взаимодействовать.

    Обновил код и дему, в деме есть пример этого counter и еще полезный пример раскладки графики "по слоям" с использованием последнего параметра zs.
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

  9. #9
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    Уже все проверил и работает как я хотел. репу уже тебе повысил) теперь спасибо скажу)



  10. #10
    Бывалый Аватар для caveman
    Информация о пользователе
    Регистрация
    15.02.2013
    Сообщений
    766
    Записей в дневнике
    47
    Репутация: 85 Добавить или отнять репутацию

    По умолчанию

    Выложил свежую версию скрипта, которая позволяет накладывать также графику из чарсетов (мелких, 3*4) и проигрывать их стоп-анимацию.

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


    # Режимы доп графики - это второй параметр (см. пример [dop|Inside_C|t|1|3|8|-16|1] )
    # t - тайлсет
    # с - чарсет (мелкий, 3 на 4)
    # a - анимация stop из чарсета (мелкий, 3 на 4). Скорость анимации зависит
    # от заданной frequency события


    А так, проще всего посмотреть обновленную демку и шапку скрипта.
    back to the primitive

    http://cavemangame.blogspot.ru/ - разные идеи и новости
    http://cavescripts.blogspot.ru/ - мои скрипты
    http://cavecrusader.blogspot.ru/ - текущий проект

Страница 1 из 4 123 ... ПоследняяПоследняя

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

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

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

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

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

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

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Event MultiGraphic