Rpg˛S Forum uses cookies. Read the Privacy Policy for more info. To remove this message, please click the button to the right:    I accept the use of cookies

Vai al contenuto

Rpg˛S Forum uses cookies. Read the Privacy Policy for more info. To remove this message, please click the button to the right:    I accept the use of cookies


  • Si prega di effettuare il log in prima di rispondere
Salva Schermata in png

    Keroro
  • Animatore

  • Utenti
  • Rens: 34
  • 0
  • StellettaStellettaStellettaStelletta
  • 664 messaggi
  • Sesso:Maschio
  • Provenienza:Atlantide
  • Abilitā:Maestro

#1 Inviato 03 April 2012 - 14:06 PM

Salva Schermata


Descrizione
E' un semplice sistema per salvare la schermata di gioco in un file png.
Il sistema è basato su uno script che salva un RGSS Bitmap in un file png, senza bisogno di dll.
Questo script era parte di uno script enorme (e poco utile) di XP, non mi stupisco sia passato inosservato ^^

Istruzioni
Mettere lo script in una nuova scheda sotto Materiali
Per salvare la schermata basta usare questo codice in un evento:
salva_schermata("Meraviglia")
=> Salva l'immagine in Screens/Meraviglia,png
(Se la cartella Screens non esiste, verrà creata)
Nello script potete specificare la cartella in cui le immagini saranno salvate.

Versione 2.0:
Aggiunta la possibilità di un suffisso composto da data ed orario attuali.
salva_schermata("Meraviglia",true)
=> Salva l'immagine in Screens/Meraviglia2012-04-03_17-20-01.png
Per modifiche guardare la documentazione dell'oggetto Time - metodo strftime
(Presto in italiano :) )


Script
#==============================================================================
# Salva Schermata
# Autore: Keroro - [email protected]
# Versione 2.0
# Ultimo aggiornamento 03.04.2012
#==============================================================================
# Salva la schermata in un'immagine png nella cartella specificata
#
# Esempio d'uso da evento:
# salva_schermata("Meraviglia")
# Se si desiderano giorno ed orario come suffisso:
# salva_schermata("Meraviglia",true)
#
#==============================================================================
module Schermata
  #Ricordati di lasciare / alla fine
  CARTELLA = "Screens/"

  #Formato Orario
  #Guarda documentazione oggetto Time - metodo strftime
  FORMATO = "%Y-%m-%d_%H-%M-%S"

  def self.salva(nome,tempo)
    bitmap = Graphics.snap_to_bitmap
    unless tempo
      bitmap.make_png(nome,CARTELLA)
    else
      bitmap.make_png(nome+Time.now.strftime(FORMATO),CARTELLA)
    end
    bitmap.dispose
  end
end

class Game_Interpreter
  def salva_schermata(nome,tempo=false)
    Schermata::salva(nome,tempo)
  end
end

#==============================================================================
#                        Bitmap to PNG By Cycleby
#==============================================================================
#
# Direct use of the Bitmap object.
#    bitmap_obj.make_png(name[, path])
# 
# Name: Save the file name
# Path: path to save the
#
# Thanks 66, Shana, gold Guizi reminder and help!
#==============================================================================
module Zlib
  class Png_File < GzipWriter
    #--------------------------------------------------------------------------
    # ? Main
    #-------------------------------------------------------------------------- 
    def make_png(bitmap_Fx,mode)
      @mode = mode
      @bitmap_Fx = bitmap_Fx
      self.write(make_header)
      self.write(make_ihdr)
      self.write(make_idat)
      self.write(make_iend)
    end
    #--------------------------------------------------------------------------
    # ? PNG file header block
    #--------------------------------------------------------------------------
    def make_header
      return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
    end
    #--------------------------------------------------------------------------
    # ? PNG file data block header information (IHDR)
    #-------------------------------------------------------------------------- 
    def make_ihdr
      ih_size = [13].pack("N")
      ih_sign = "IHDR"
      ih_width = [@bitmap_Fx.width].pack("N")
      ih_height = [@bitmap_Fx.height].pack("N")
      ih_bit_depth = [8].pack("C")
      ih_color_type = [6].pack("C")
      ih_compression_method = [0].pack("C")
      ih_filter_method = [0].pack("C")
      ih_interlace_method = [0].pack("C")
      string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
              ih_compression_method + ih_filter_method + ih_interlace_method
      ih_crc = [Zlib.crc32(string)].pack("N")
      return ih_size + string + ih_crc
    end
    #--------------------------------------------------------------------------
    # ? Generated image data (IDAT)
    #-------------------------------------------------------------------------- 
    def make_idat
      header = "\x49\x44\x41\x54"
      case @mode # please 54 ~
      when 1
        data = make_bitmap_data # 1
      else
        data = make_bitmap_data
      end
      data = Zlib::Deflate.deflate(data, 8)
      crc = [Zlib.crc32(header + data)].pack("N")
      size = [data.length].pack("N")
      return size + header + data + crc
    end
    #--------------------------------------------------------------------------
    # ? Requests from the Bitmap object 54 to generate image data in mode 1 
    # (please 54 ~)
    #-------------------------------------------------------------------------- 
    def make_bitmap_data1
      w = @bitmap_Fx.width
      h = @bitmap_Fx.height
      data = []
      for y in 0...h
        data.push(0)
        for x in 0...w
          color = @bitmap_Fx.get_pixel(x, y)
          red = color.red
          green = color.green
          blue = color.blue
          alpha = color.alpha
          data.push(red)
          data.push(green)
          data.push(blue)
          data.push(alpha)
        end
      end
      return data.pack("C*")
    end
    #--------------------------------------------------------------------------
    # ? Bitmap object from the image data generated in mode 0
    #-------------------------------------------------------------------------- 
    def make_bitmap_data
      gz = Zlib::GzipWriter.open('hoge.gz')
      t_Fx = 0
      w = @bitmap_Fx.width
      h = @bitmap_Fx.height
      data = []
      for y in 0...h
        data.push(0)
        for x in 0...w
          t_Fx += 1
          if t_Fx % 10000 == 0
            Graphics.update
          end
          if t_Fx % 100000 == 0
            s = data.pack("C*")
            gz.write(s)
            data.clear
            #GC.start
          end
          color = @bitmap_Fx.get_pixel(x, y)
          red = color.red
          green = color.green
          blue = color.blue
          alpha = color.alpha
          data.push(red)
          data.push(green)
          data.push(blue)
          data.push(alpha)
        end
      end
      s = data.pack("C*")
      gz.write(s)
      gz.close    
      data.clear
      gz = Zlib::GzipReader.open('hoge.gz')
      data = gz.read
      gz.close
      File.delete('hoge.gz') 
      return data
    end
    #--------------------------------------------------------------------------
    # ? PNG end of the file data blocks (IEND)
    #-------------------------------------------------------------------------- 
    def make_iend
      ie_size = [0].pack("N")
      ie_sign = "IEND"
      ie_crc = [Zlib.crc32(ie_sign)].pack("N")
      return ie_size + ie_sign + ie_crc
    end
  end
end
#==============================================================================
# ¦ Bitmap
#------------------------------------------------------------------------------
# Related to the Bitmap.
#==============================================================================
class Bitmap
  #--------------------------------------------------------------------------
  # ? Related
  #-------------------------------------------------------------------------- 
  def make_png(name="like", path="",mode=0)
    make_dir(path) if path != ""
    Zlib::Png_File.open("temp.gz") {|gz|
      gz.make_png(self,mode)
    }
    Zlib::GzipReader.open("temp.gz") {|gz|
      $read = gz.read
    }
    f = File.open(path + name + ".png","wb")
    f.write($read)
    f.close
    File.delete('temp.gz') 
    end
  #--------------------------------------------------------------------------
  # ? Save the path generated
  #-------------------------------------------------------------------------- 
  def make_dir(path)
    dir = path.split("/")
    for i in 0...dir.size
      unless dir == "."
        add_dir = dir[0..i].join("/")
        begin
          Dir.mkdir(add_dir)
        rescue
        end
      end
    end
  end
end

Modificato da Keroro, 03 April 2012 - 16:27 PM.

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...


    tiauz
  • Utente occasionale

  • Utenti
  • Rens: 0
  • 0
  • StellettaStelletta
  • 143 messaggi
  • Sesso:Maschio
  • Provenienza:Vigliano Biellese
  • Abilitā:Adepto

#2 Inviato 03 April 2012 - 15:29 PM

Ottimo!
Pero il salvataggio dello screen avviene solo con il chiama script? Non si potrebbe fare anche alla pressione di una combinazione di tasti, e che il nome dello screen venga generato in automatico, magari in base alla data e all'ora? Un po come avviene per gli altri giochi. :)

PS: Magari si potrebbe integrare nella patch di Holy, con adeguati crediti :) E' un'idea.

Modificato da tiauz, 03 April 2012 - 15:32 PM.


    Keroro
  • Animatore

  • Utenti
  • Rens: 34
  • 0
  • StellettaStellettaStellettaStelletta
  • 664 messaggi
  • Sesso:Maschio
  • Provenienza:Atlantide
  • Abilitā:Maestro

#3 Inviato 03 April 2012 - 16:30 PM

Aggiunta la possibilità di salvare con data e ora
Per usarlo su pressione di un tasto basta mettere questo codice in un processo parallelo

if Input.trigger?(:F5)
  salva_schermata("Prova",true)
end

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...


    Guardian of Irael
  • Coniglietto Rosso

  • Rpg˛S Admin
  • Rens: 198
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 57693 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilitā:Apprendista


#4 Inviato 03 April 2012 - 17:12 PM

Appena uscito e già la versione 2 abbiamo! XD
Ottimo soprattutto se semplifica quello in cui era immerso ed ancor più soprasoprattutto se converte in png! :D Testament sarà contento! ^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!     
(> <)

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^  
 
REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

Spoiler

    tiauz
  • Utente occasionale

  • Utenti
  • Rens: 0
  • 0
  • StellettaStelletta
  • 143 messaggi
  • Sesso:Maschio
  • Provenienza:Vigliano Biellese
  • Abilitā:Adepto

#5 Inviato 03 April 2012 - 17:18 PM

Secondo me era meglio un jpg al 100% di compressione :) si risparmia spazio alla stessa qualità. ma vabbe.

    Keroro
  • Animatore

  • Utenti
  • Rens: 34
  • 0
  • StellettaStellettaStellettaStelletta
  • 664 messaggi
  • Sesso:Maschio
  • Provenienza:Atlantide
  • Abilitā:Maestro

#6 Inviato 03 April 2012 - 18:24 PM

Il formato jpg è visto con disgusto dai pixel artist quindi evitiamo ^^
In che senso Testament sarà contento? Non pensavo usasse il VX Ace!

PS: Mettendo il codice che ho scritto nel messaggio precedente in un Evento Comune (sempre in processo parallelo), con la pressione di F5 si può catturare la schermata in tutte le fasi di gioco ;)

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...


    Guardian of Irael
  • Coniglietto Rosso

  • Rpg˛S Admin
  • Rens: 198
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 57693 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilitā:Apprendista


#7 Inviato 03 April 2012 - 19:40 PM

In che senso Testament sarà contento? Non pensavo usasse il VX Ace!

Odia il jpeg adora il png! XD

PS: Mettendo il codice che ho scritto nel messaggio precedente in un Evento Comune (sempre in processo parallelo), con la pressione di F5 si può catturare la schermata in tutte le fasi di gioco ;)

Ci stavo pensando ai frame fattibili... solo che continuiamo a parlare di png se non si sta attenti si brucia la cartella con i TB! XD
^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!     
(> <)

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^  
 
REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

Spoiler

    Maxy
  • Utente occasionale

  • Utenti
  • Rens: 22
  • 0
  • StellettaStelletta
  • 135 messaggi
  • Sesso:Maschio
  • Provenienza:Torino
  • Abilitā:Adepto

#8 Inviato 04 April 2012 - 09:00 AM

Sarebbe possibile pensare ad uno script che fa lo stesso lavoro anche in xp? dove non c'è il bellissimo "Graphics.snap_to_bitmap"?

    giver
  • Alex (Rm2k)

  • Utenti
  • Rens: 121
  • 0
  • StellettaStellettaStellettaStellettaStelletta
  • 1291 messaggi
  • Sesso:Maschio
  • Provenienza:The Creept - Room for Strangeness
  • Abilitā:Esperto

#9 Inviato 04 April 2012 - 12:09 PM

Esiste uno script del genere per XP, ma fa uso di una DLL che purtroppo crea problemi con Window Vista . . . Questo script è nato da una discussione legata al fatto che certi script per VX, la usavano ancora senza che ce ne fosse reale bisogno . . .

Magari per XP, si potrebbe creare una nuova versione di tale DLL, che faccia screen e li salvi secondo criteri indicati in uno script ruby, ma aggiornata per supportare meglio le nuove versioni di Windows . . .

Spoiler

    Keroro
  • Animatore

  • Utenti
  • Rens: 34
  • 0
  • StellettaStellettaStellettaStelletta
  • 664 messaggi
  • Sesso:Maschio
  • Provenienza:Atlantide
  • Abilitā:Maestro

#10 Inviato 04 April 2012 - 13:46 PM

Maxy se aggiungi questo codice in cima dovrebbe funzionare anche con rpg maker xp :)
(l'ho provato con l'ace e funziona come alternativa al metodo predefinito)
Fammi sapere!
module Graphics
  RtlMoveMemory		  = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  BitBlt				 = Win32API.new('gdi32', 'BitBlt', 'iiiiiiiii', 'i')
  CreateCompatibleBitmap = Win32API.new('gdi32', 'CreateCompatibleBitmap', 'iii', 'i')
  CreateCompatibleDC	 = Win32API.new('gdi32', 'CreateCompatibleDC', 'i', 'i')
  DeleteObject		   = Win32API.new('gdi32', 'DeleteObject', 'i', 'i')
  GetDIBits			  = Win32API.new('gdi32', 'GetDIBits', 'iiiiipi', 'i')
  SelectObject		   = Win32API.new('gdi32', 'SelectObject', 'ii', 'i')
  SetDIBits			  = Win32API.new('gdi32', 'SetDIBits', 'iiiiipi', 'i')
  hWnd = Win32API.new('user32', 'FindWindow', 'pp', 'i').call('RGSS Player', 0)
  DC   = Win32API.new('user32', 'GetDC', 'i', 'i').call(hWnd)
  def self.snap_to_bitmap
	bitmap = Bitmap.new(width=640, height=480)
	RtlMoveMemory.call(address="\0"*4, bitmap.__id__*2+16, 4)
	RtlMoveMemory.call(address, address.unpack('L')[0]+8, 4)
	RtlMoveMemory.call(address, address.unpack('L')[0]+16, 4)
	address = address.unpack('L')[0]
	info = [40,width,height,1,32,0,0,0,0,0,0].pack('LllSSLLllLL')
	hDC = CreateCompatibleDC.call(DC)
	hBM = CreateCompatibleBitmap.call(DC, width, height)
	DeleteObject.call(SelectObject.call(hDC, hBM))
	SetDIBits.call(hDC, hBM, 0, height, address, info, 0)
	BitBlt.call(hDC, 0, 0, width, height, DC, 0, 0, 0xCC0020)
	GetDIBits.call(hDC, hBM, 0, height, address, info, 0)
	DeleteObject.call(hBM)
	DeleteObject.call(hDC)
	bitmap
  end
end

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...


    Maxy
  • Utente occasionale

  • Utenti
  • Rens: 22
  • 0
  • StellettaStelletta
  • 135 messaggi
  • Sesso:Maschio
  • Provenienza:Torino
  • Abilitā:Adepto

#11 Inviato 04 April 2012 - 18:31 PM

Apparte il fatto che in xp l'interprete è Interpreter, ma quello ho cambiato subito, non mi funge... crea il png, ma è un file vuoto.
Potrebbe essere che lo sto usando su ubuntu?
E se mi accontentassi di un bmp?

    Guardian of Irael
  • Coniglietto Rosso

  • Rpg˛S Admin
  • Rens: 198
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 57693 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilitā:Apprendista


#12 Inviato 04 April 2012 - 18:38 PM

Potrebbe essere che lo sto usando su ubuntu?

:sisi:
La win32 è un'API di windows! ^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!     
(> <)

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^  
 
REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

Spoiler

    Keroro
  • Animatore

  • Utenti
  • Rens: 34
  • 0
  • StellettaStellettaStellettaStelletta
  • 664 messaggi
  • Sesso:Maschio
  • Provenienza:Atlantide
  • Abilitā:Maestro

#13 Inviato 04 April 2012 - 19:32 PM

Non conosco come è fatto l'xp, pensavo mancasse solo snap_to_bitmap u_u
Passa a vx ace!

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...


    Maxy
  • Utente occasionale

  • Utenti
  • Rens: 22
  • 0
  • StellettaStelletta
  • 135 messaggi
  • Sesso:Maschio
  • Provenienza:Torino
  • Abilitā:Adepto

#14 Inviato 05 April 2012 - 09:00 AM

In realtà wine ha alcune API, e mi sembrava che win32 funzionasse perchè avevo già altri script che la usavano...
Più probabilmente non ci sarà win32, ma una API simile che si prende le sue chiamate e fa più o meno le stesse cose.

L'ace è ancora un po' troppo costosetto per le mie tasche, in fondo snap_to_bitmap non è così essenziale al gioco, potrò farne a meno...
grazie mille per l'aiuto comunque!

    tiauz
  • Utente occasionale

  • Utenti
  • Rens: 0
  • 0
  • StellettaStelletta
  • 143 messaggi
  • Sesso:Maschio
  • Provenienza:Vigliano Biellese
  • Abilitā:Adepto

#15 Inviato 05 April 2012 - 09:43 AM

SI ok ma che centra qua la pixel art? :D uno crea uno screen per catturare una scena che ne so. E poi se la qualità si lascia al 100% (ovvero nessuna compressione) i pixel rimangono al loro posto e non compare l'artefatto :) Ma non so se tramite script si possa definire tale cosa. Era solo per non avere screen di 2 mb XD

    Keroro
  • Animatore

  • Utenti
  • Rens: 34
  • 0
  • StellettaStellettaStellettaStelletta
  • 664 messaggi
  • Sesso:Maschio
  • Provenienza:Atlantide
  • Abilitā:Maestro

#16 Inviato 05 April 2012 - 12:58 PM

A me i png occupano 200kb l'uno, non mi sembra eccessivo per un desktop (c'erano giochi che creavano bitmap da 2 mb), anche considerando che dovrebbero immortalare i momenti più belli (e non essere generati in continuazione).
Inoltre è l'unico formato accettato dallo screen contest :3

I Miei Script:
Salva Schermata (3 Aprile 2012)
Attacco Personalizzabile (2 Aprile 2012)
Keyboard Input (Porting) (17 Marzo 2012)
Continua...


    tiauz
  • Utente occasionale

  • Utenti
  • Rens: 0
  • 0
  • StellettaStelletta
  • 143 messaggi
  • Sesso:Maschio
  • Provenienza:Vigliano Biellese
  • Abilitā:Adepto

#17 Inviato 05 April 2012 - 13:20 PM

Vero dimenticavo... di solito li catturavo a mano :D

    Astro86
  • Animatore

  • Utenti
  • Rens: 15
  • 0
  • StellettaStellettaStellettaStelletta
  • 536 messaggi
  • Sesso:Maschio
  • Abilitā:Novizio

#18 Inviato 29 April 2012 - 15:50 PM

Prima di provare la script... vorrei capire una cosa... le screen che fa le salva per tutta la lunghezza della mappa o solo per la grandezza della finestra di gioco?

tipo
faccio una mappa 200x200, la screen mi salva tutta la mappa o mi salva solo ciò che vedo?

no perché se si potrebbe salvare per tutta la grandezza della mappa mi farebbe comodo per le varie mappa che farò :tongue:

    Guardian of Irael
  • Coniglietto Rosso

  • Rpg˛S Admin
  • Rens: 198
  • 19
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 57693 messaggi
  • Sesso:Maschio
  • Provenienza:Bagnaia (Viterbo)
  • Abilitā:Apprendista


#19 Inviato 29 April 2012 - 16:44 PM

La schermata di gioco è la schermata di gioco! :sisi:
^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!     
(> <)

 
Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^
 
KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^
 
FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^  
 
REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

Spoiler

    Astro86
  • Animatore

  • Utenti
  • Rens: 15
  • 0
  • StellettaStellettaStellettaStelletta
  • 536 messaggi
  • Sesso:Maschio
  • Abilitā:Novizio

#20 Inviato 14 May 2012 - 12:21 PM

bhe se era tutta la mappa era utile per le screen :tongue:


  • Feed RSS