[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]
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:
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.
Ola Masked, você pode disponibilizar uma DEMO :)
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
(https://media.giphy.com/media/24xRxrDCLxhT2/giphy.gif)
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.