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

MBS - Screenshot In-Game

Iniciado por Brandt, 04/03/2015 às 11:02

04/03/2015 às 11:02 Última edição: 04/03/2015 às 11:42 por King Gerar
[box2 class=titlebg]
MBS - Screenshot In-Game
[/box2]

por Masked

[box2 class=titlebg]Características[/box2]
O script adiciona um sistema de print screen in-game (dur) ao apertar uma tecla configurada e salva em um arquivo .png.
O print funciona em qualquer cena.
O script também traz um módulo PNG, que pode ser incluído em qualquer classe que redefina os métodos 'width', 'height' e 'get_rgba(x, y)' para salvar o objeto em um PNG.

[box2 class=titlebg]Instruções[/box2]
Nada especial, só configure o script

[box2 class=titlebg]Script[/box2]
#==============================================================================
# MBS - Printscreen
#------------------------------------------------------------------------------
# por Masked
#==============================================================================
($imported ||= {})[:mbs_printscreen] = true
#==============================================================================
# >> MBS
#==============================================================================
module MBS
  #============================================================================
  # >> Screenshot
  #============================================================================
  module Screenshot
    #==========================================================================
    # Configurações
    #==========================================================================
    
    # Tecla que chama o print
    KEY = :F2
    
    # Nome da pasta onde ficam os printscreen (pode estar vazio, nesse caso 
    # os prints serão salvos na pasta raíz do jogo)
    FOLDER = 'Screenshots'
    
    # Nome padrão dos arquivos (o nome dos arquivos será nome + n + .png)
    BASENAME = 'print' # O nome dos arquivos será "printX.png"
    
    # SE a ser tocada quando uma screenshot é tirada (pode ser vazio)
    SE = 'Audio/SE/Chime2'
    
    #==========================================================================
    # Fim das configurações
    #==========================================================================
  end
end
#==============================================================================
# >> PNG
#------------------------------------------------------------------------------
# Qualquer classe que inclua este módulo deve redefinir o método 'get_rgba', 
# 'width' e 'height', assim obtendo um método 'save_png', que quando chamado
# exporta o objeto como uma imagem PNG
#==============================================================================
module PNG
  private
  #----------------------------------------------------------------------------
  # * Criação do header do arquivo
  #----------------------------------------------------------------------------
  def make_header(file)
    # Número mágico
    file.write([0x89].pack('C'))
    
    # PNG
    file.write([0x50, 0x4E, 0x47].pack('CCC'))
    
    # Fim de linha estilo DOS para verificação de conversão DOS - UNIX
    file.write([0x0D, 0x0A].pack('CC'))
    
    # Caractere de fim de linha (DOS)
    file.write([0x1A].pack('C'))
    
    # Caractere de fim de linha (UNIX)
    file.write([0x0A].pack('C'))
  end
  
  #----------------------------------------------------------------------------
  # * Aquisição da soma mágica
  #----------------------------------------------------------------------------
  def checksum(string)
    Zlib.crc32(string)
  end
  
  #----------------------------------------------------------------------------
  # * Criação do chunk de cabeçalho
  #----------------------------------------------------------------------------
  def make_ihdr(file)  
    data = ''
    
    # Largura
    data += [self.width, self.height].pack('NN')
    
    # Bit depth (???)
    data += [0x8].pack('C')
    
    # Tipo de cor
    data += [0x6].pack('C')
    
    data += [0x0, 0x0, 0x0].pack('CCC')
    
    # Tamanho do chunk
    file.write([data.size].pack('N'))
    
    # Tipo de chunk
    file.write('IHDR')
    
    file.write(data)
    
    # Soma mágica
    file.write([checksum('IHDR' + data)].pack('N'))
  end
  
  #----------------------------------------------------------------------------
  # * Criação do chunk de dados
  #----------------------------------------------------------------------------
  def make_idat(file)    
    data = ''
    
    for y in 0...height
      data << "\0"
      for x in 0...width
        color = self.get_rgba(x, y)
        data << [color.red, color.green, color.blue, color.alpha].pack('C*')
      end
    end
    
    # Desinflamento (jeito legal de dizer compressão...) dos dados
    data = Zlib::Deflate.deflate(data)
    
    # Tamanho do chunk
    file.write([data.size].pack('N'))
    
    # Tipo de chunk
    file.write('IDAT')
    
    # Dados (a imagem)
    file.write(data)
    
    # Soma mágica
    file.write([checksum('IDAT' + data)].pack('N'))
  end
  
  #----------------------------------------------------------------------------
  # * Criação do chunk final
  #----------------------------------------------------------------------------
  def make_iend(file)
    # Tamanho do chunk
    file.write([0].pack('N'))
    
    # Tipo de chunk
    file.write('IEND')
    
    # Soma mágica
    file.write([checksum('IEND')].pack('N'))
  end
  
  public
  
  #----------------------------------------------------------------------------
  # * Aquisição do largura da imagem
  #----------------------------------------------------------------------------
  def width
    1
  end
  
  #----------------------------------------------------------------------------
  # * Aquisição da altura da imagem
  #----------------------------------------------------------------------------
  def height
    1
  end
  
  #----------------------------------------------------------------------------
  # * Aquisição da cor RGBA na coordenada XY
  #----------------------------------------------------------------------------
  def get_rgba
    Color.new(0,0,0,0)
  end
  
  #----------------------------------------------------------------------------
  # * Conversão do bitmap em um arquivo .png
  #----------------------------------------------------------------------------
  def save_png(filename)
    file = File.open(filename, 'wb')
    
    # Criação do cabeçalho
    make_header(file)
    
    # Criação do primeiro chunk
    make_ihdr(file)
    
    # Criação dos dados
    make_idat(file)
    
    # Criação do final
    make_iend(file)
    file.close
  end
end

#==============================================================================
# ** Bitmap
#==============================================================================
class Bitmap
  
  alias mbswdht width
  alias mbshght height
  
  #----------------------------------------------------------------------------
  # Inclusão do módulo PNG na classe Bitmap
  #----------------------------------------------------------------------------
  include PNG
  
  #----------------------------------------------------------------------------
  # * Aquisição da largura do bitmap
  #----------------------------------------------------------------------------
  def width
    mbswdht
  end
  
  #----------------------------------------------------------------------------
  # * Aquisição da altura do bitmap
  #----------------------------------------------------------------------------
  def height
    mbshght
  end
  
  #----------------------------------------------------------------------------
  # * Aquisição da cor RGBA na coordenada XY
  #----------------------------------------------------------------------------
  def get_rgba(x, y)
    get_pixel(x, y)
  end
end

#==============================================================================
# ** Scene_Base
#==============================================================================
class Scene_Base
  
  alias mbsscnbsupdt update
  
  #----------------------------------------------------------------------------
  # * Atualização do processo
  #----------------------------------------------------------------------------
  def update
    mbsscnbsupdt
    save_screenshot if Input.trigger?(MBS::Screenshot::KEY)
  end
  
  #----------------------------------------------------------------------------
  # * Salvamento de uma screenshot
  #----------------------------------------------------------------------------
  def save_screenshot
    folder = MBS::Screenshot::FOLDER
    basename = MBS::Screenshot::BASENAME
    
    Dir.mkdir(folder) unless FileTest.directory?(folder)
    n = Dir.entries(folder).inject(1) do |r, v| 
      v =~ /^#{basename}\d+\.png$/ ? r + 1 : r
    end
    bitmap = Graphics.snap_to_bitmap
    Graphics.brightness = 0
    until Graphics.brightness == 255
      Graphics.brightness += 10
      Graphics.update
    end
    bitmap.save_png("#{folder}/#{basename}#{n}.png")
    Audio.se_play(MBS::Screenshot::SE)
  end
end

Cole acima do main.

[box2 class=titlebg]Créditos e Agradecimentos[/box2]
- a mim, por criar
- ao [user]CDCyoshi[/user], pela ideia
~ Masked

04/03/2015 às 11:07 #1 Última edição: 04/03/2015 às 11:11 por Raizen
Opa iae Masked, script interessante esse, parabéns pelo trabalho que fez.

Agora, vou ser sincero, na hora que vi o pedido dele e vi o seu script, na mesma hora pensei em fazer algo no estilo pokemon FireRed, aonde ele mostra as últimas ações através de imagens feitas in-game. Provavelmente quando eu tiver um tempo(fds), eu monto algo assim, bom espero mais coisas de ti, boa sorte, xD.

Fiz um desse em C#, vou ver se é muito diferente em Ruby k >_>

Valeu Raizen =D

Boa ideia essa, vi alguma coisa parecida em algum lugar, mas acho que era só uma foto pro arquivo de Save.

Oxe, eu tentei fazer um em C (pra usar a DLL no maker), mas acabei desistindo porque fiquei com raiva dos bugs ;-;
Não deve ser tão diferente não, acho que só muda que em Ruby tem um lag desgraçado xP
~ Masked

Ossa era o que eu precisava e não sabia ... Quando li na hora pensei que iria ficar muito foda no meu projeto. Vlw


Um bom lugar se constrói
com humildade é bom lembrar