O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

MBS - Spritesheet

Iniciado por Brandt, 14/04/2014 às 23:26

[box2 class=titlebg]MBS - Spritesheet[/box2]

por Masked

[box2 class=titlebg title=Introdução]Fala pessoal, estou vindo aqui com mais um script MBS, (que é uma sigla que na verdade nem eu sei o que significa :hahaha!:, seria Masked Bdealgumacoisa Script), foi uma ideia dada pelo Shiroyasha no tópico do projeto Rise of Dragon Souls e que eu achei muito boa, já que serve de extra frame, muda o tamanho máximo do char e não precisa mudar nada pra usar sprites ripados de ragnarok economiza imagens, porque você pode por 20 poses de um personagem numa imagem só e o script carrega cada uma delas normalmente[/box2]

[box2 class=titlebg title=Características]O script faz com que você possa criar spritesheets, ou "folhas de sprites", isso significa que você não precisa organizar os chars em charsets com espaçamento certinho e com tudo calculado, e que cada frame do personagem pode ter um tamanho diferente, o char pode ter 812472 frames (se você tiver paciência para configurar tudo isso...) e um arquivo pode guardar mais que uma posição do personagem, para falar a verdade, você pode pegar todos os chars do jogo e jogar tudo no mesmo arquivo, aí é só ser criativo, aprender a usar o script e pronto, tudo certo.

Também é possível configurar diferentes 'poses' para cada spritesheet (vide script), aí para fazer o personagem ficar em uma pose, usa-se o script call seguinte:
game_character.pose = :pose


game_character pode ser um evento ($game_map.events[ID]) ou o jogador ($game_player), e a pose é a pose configurada no script (:default, por exemplo)

Outro recurso que o script tem é o 'forçamento de animação', usando o call:
game_character.force_animation([f1,f2,f3,f4],w)

ou esse:
game_character.force_animation([f1,f2,f3,f4],[w1,w2,w3])


dessa forma, o char vai passar pelas frames f1, seguida pela f2, f3 e f4, no primeiro caso, entre cada frame se esperará w frames, no segundo, na primeira frame se esperará w1 frames, na segunda w2, na terceira w3, e na quarta w1 frames denovo.[/box2]

[box2 class=titlebg title=Instuções]Esse script realmente requer maiores explicações para a sua configuração:

Para configurar os frames da animação, usa-se esse código:

"spritesheet[sprite]" => {
:pose => [
# Gráficos do personagem olhando abaixo
[[x,y,largura,altura]],
# Gráficos do personagem olhando a esquerda
[[x,y,largura,altura]],
# Gráficos do personagem olhando a direita
[[x,y,largura,altura]],
# Gráficos do personagem olhando acima
[[x,y,largura,altura]]
]
}


Então, quando o game_character com o gráfico "spritesheet[sprite]" estiver na pose :pose, e olhando para baixo, a animação dele terá um frame, com o gráfico do que estiver dentro do retângulo na posição x * y com tamanho altura * largura.

Uma observação: O gráfico normal do personagem (quando nenhuma pose é definida) é o gráfico da pose :default[/box2]

[box2 class=titlebg title=Screenshots]Não perceptível por imagens[/box2]

[box2 class=titlebg title=Script]
#==============================================================================
# MBS - SpriteSheet Characters
#------------------------------------------------------------------------------
# Script por Masked
# Ideia dada por Shiroyasha, no tópico do jogo 'Rise of Dragon Souls'
#------------------------------------------------------------------------------
# O script faz com que os gráficos dos personagens e eventos seja carregado de
# um único arquivo, com todas as poses e frames, é possível criar animações com
# mais de 3 frames, criar animações customizadas, como poses para um ABS, por
# exemplo.
#==============================================================================
module MBS_Spritesheet_Config
#==============================================================================
# Configurações:
#==============================================================================

# A tag que deverá aparecer no gráfico para este ser um Spritesheet
Spritesheet_tag = "[sprite]"

# Aqui são configurados os characters, seus frames e poses
Characters = {"player[sprite]" => {

# Padrão
:default => [
# Gráficos do personagem olhando abaixo
[[508,134,37,90],[556,132,36,92],[601,131,36,94],[648,131,35,92],[694,134,37,90],[743,133,35,91],[789,131,33,93],[834,131,34,93]],
# Gráficos do personagem olhando a esquerda
[[509,331,27,91],[545,332,34,91],[589,333,44,91],[645,332,36,91],[693,332,29,91],[730,333,32,91],[774,333,43,91],[828,333,39,90]],
# Gráficos do personagem olhando a direita
[[509,331,27,91,true],[545,332,34,91,true],[589,333,44,91,true],[645,332,36,91,true],[693,332,29,91,true],[730,333,32,91,true],[774,333,43,91,true],[828,333,39,90,true]],
# Gráficos do personagem olhando acima
[[508,533,36,90],[555,531,36,92],[602,531,34,93],[648,531,34,93],[694,534,36,89],[742,530,35,93],[789,531,33,94],[834,532,34,91]]
],
}}
#==============================================================================
# Fim das Configurações
#==============================================================================
end
#==============================================================================
# Sprite_Character
#==============================================================================
class Sprite_Character < Sprite_Base
  include MBS_Spritesheet_Config

  alias ms_upd update
  def update
    ms_upd
    force_animation(@character.anime_force_frames,@character.anime_force_wait) if @character.anime_force
  end
  #----------------------------------------------------------------------------
  # * Atualização do retângulo de origem
  #----------------------------------------------------------------------------
  def update_src_rect
    unless @character_name.nil?
    if @character_name.include?(Spritesheet_tag)
      index = @character.character_index
      direction = @character.direction/2-1
      direction = 0 if direction < 0
      unless Characters[@character.character_name].keys.include?(@character.pose)
        @character.pose = :default
      end
      @char = Characters[@character.character_name][@character.pose][direction]
      pattern = @character.pattern < @char.size ? @character.pattern : 1
      @char = Characters[@character.character_name][@character.pose][direction][pattern-1]
      self.mirror = @char[4]
      self.src_rect.set(@char[0],@char[1],@char[2],@char[3])
    elsif @tile_id == 0
      index = @character.character_index
      pattern = @character.pattern < 3 ? @character.pattern : 1
      sx = (index % 4 * 3 + pattern) * @cw
      sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
  end
end
end
alias ms_s_char_bit set_character_bitmap
  #--------------------------------------------------------------------------
  # * Definição de bitmap do personagem
  #--------------------------------------------------------------------------
  def set_character_bitmap
    ms_s_char_bit
    if @character_name.include?(Spritesheet_tag)
      unless Characters[@character.character_name].keys.include?(@character.pose)
        @character.pose = :default
      end
    direction = @character.direction/2-1
    direction = 0 if direction < 0 ||direction.nil?
    char = Characters[@character.character_name][@character.pose][direction]
    @character.pattern = 0 if char[@character.pattern].nil?
    self.ox = char[@character.pattern][2]/2
    self.oy = char[@character.pattern][3]
    end
  end
  #----------------------------------------------------------------------------
  # * Forçamento de animação
  #----------------------------------------------------------------------------
  def force_animation(frames,wait)
        if wait.is_a?(Integer)
                pr = ->(i) { Graphics.wait(wait) }
        elsif wait.is_a?(Array)
                pr = ->(i) { Graphics.wait(wait[i%wait.size]) }
        else
                pr = ->(i) { }
        end

        frames.each {|i|
                @character.pattern = i
                update_src_rect
                Graphics.update
                pr[i]
        }

        @character.anime_force = false
end
end
#==============================================================================
# Game_CharacterBase
#==============================================================================
class Game_CharacterBase
  include MBS_Spritesheet_Config
  attr_accessor :pose
  attr_accessor :anime_force
  attr_accessor :anime_force_frames
  attr_accessor :anime_force_wait
  attr_accessor :pattern

  alias ms_init initialize
  #----------------------------------------------------------------------------
  # * Inicialização do Processo
  #----------------------------------------------------------------------------
  def initialize
    @pose = :default
    @anime_force = false
    @anime_force_wait = 0
    @anime_force_frames = []
    ms_init
  end
  #----------------------------------------------------------------------------
  # * Atualização do padrão da animação
  #----------------------------------------------------------------------------
  def update_anime_pattern
  unless @character_name.nil? || @anime_force == true
    unless @character_name.include?(Spritesheet_tag)
    if !@step_anime && @stop_count > 0
      @pattern = @original_pattern
    else
      @pattern = (@pattern + 1) % 4
    end
  else
      dir = @direction/2-1
      dir = 0 if dir < 0
    if !@step_anime && @stop_count > 0
      @pattern = @original_pattern
    else
      @pattern = (@pattern + 1) % Characters[@character_name][Characters[@character_name].keys.include?(@pose) ? @pose : :default][dir].size
    end
  end
end
end
  #----------------------------------------------------------------------------
  # * Forçamento de animação
  #----------------------------------------------------------------------------
  def force_animation(frames,wait=6)
   @anime_force = true
   @anime_force_frames = frames
   @anime_force_wait = wait
  end
end


Obs.: O script está configurado para se poder usar com um char de 8 frames do pack High Fantasy resource pack, então quem quiser pode usar, não vou dar um exemplo de char desse pack porque isso seria pirataria (o pack é pago...) e seria contra as regras do fórum :descontente:[/box2]

[box2 class=titlebg title=Créditos e Agradecimentos]- ao Shiroyasha, pela ideia;
- ao sinchross, pelo projeto dele que fez o Shiroyasha ter a ideia;
- ao Gab!, por melhorar o método 'force animation'
- a mim, por criar e disponibilizar.[/box2]
~ Masked

Muito bom cara!! Parabéns pela criação, eu ainda não tive tempo de explorar o script pq estou preso em outro ponto da criação mas logo vou testar.

muito bom seu script  talvez usarei ele em meu projeto
parabems cara :ok:
:linha3:
01110111 01101001 01100011 01100011 01100001
:linha3:

Eta!

Muito bom cara!

Isso é muito, muito, muito útil para um projeto!

Não estou com acesso ao RPG Maker agora, mas pode ter certeza que está marcado pra eu testar essa belezura

aehiaheiuaheoi

Parabens cara!!


Facilitaria muitas vidas, huehuehueu, pixel artists teriam mais facilidade em fazer obras com mais movimentos
um ótimo trabalho mesmo  :XD:

Realmente essa é uma função bem interessante, principalmente para ABS e talz, parabéns pelo excelente trabalho :P, cara seu acervo de scripts está ficando grandinho não   :o:

Realmente ajudaria muito esse script, mas não entendi bem como usá-lo... teria como postar uma demo ou algo assim? ajudaria mto msm haha

e parabéns pelo trabalho ae!

Eu não consegui entender  :T.T:

Pode deixar uma demo masked?  :o:):

Eu entendi do que é mas  não como funciona, poderia deixar uma demo ai?

Ah, sim, eu estava fazendo uma DEMO, não sei porque, mas eu parei .-.
Vou terminar ela e já passo o link para download pra vocês.
~ Masked

Ola Masked, você pode disponibilizar uma DEMO  :)
Os scripts são como mulheres: são difíceis de entender e ao mínimo erro que você faça, ferra tudo.

Oi... Entao, será que podia me deixar uma DEMO ? eu realmente nao entendi isso kkk mas entendi a ideia. :shrug:

Citação de: aliffer online 25/02/2020 às 11:30
Oi... Entao, será que podia me deixar uma DEMO ? eu realmente nao entendi isso kkk mas entendi a ideia. :shrug:

/\ Super apoio a ideia
E pelo que vi pelos comentários acima não só somos nós que estamos pedindo por isso


Pois é, fiquei devendo essa demo aí faz tempo haha

O script é bem antigo, então prefiro dar um tapa nele antes. Outro problema é que ele é absolutamente sacal de configurar, tem que colocar tudo no mão e pá (péssimo).

Vou estudar alternativas para isso, e assim que der eu atualizo o tópico e faço uma demo ou um tutorialzinho ensinando a usar.
~ Masked