Creatore di mappe (immagini) 1.0
Descrizione
Avete mai avuto l'esigenza di creare l'immagine di una mappa in modo fedele, tentando dispendiosi metodi che portano via tanto tempo, e non sempre con un buon risultato, ad esempio per creare un'immagine che mostri la mappa del mondo? Questo script è fatto per voi!
Questo script permette di creare con un solo comando un'immagine PNG stilizzata della mappa. In altre parole, trasforma una mappa come questa:
in questa.
Pensate a cosa può fare con world map ancora più grandi!
Lo script può creare anche un'immagine in bianco e nero della mappa, dove le parti in bianco sono quelle "calpestabili" dal giocatore, mentre quelle nere no.
Funzionalità
Questo script può:
- creare un'immagine PNG stilizzata della mappa (dove ogni tile è equivalente a 1 pixel;
- salvare l'immagine in PNG;
- 2 tipologie di visualizzazioni (a colori o in bianco e nero);
- Niente più creazione di immagini di mappe in modo manuale!.
Autore
Holy87
Allegati
Nessuna
Istruzioni per l'uso
Creare una nuova voce sopra Main ed inserire lo script.
Nel caso di incompatibilità, provare a spostarla più in alto.
Script
#=============================================================================== # MAP CREATOR #=============================================================================== # Autore: Holy87 # 10/12/2012 -> Versione 1.0 #=============================================================================== # Descrizione: # Questo script permette di creare un'immagine stilizzata della mappa corrente # e di salvarla in un PNG. Molto utile per chi vuol disegnare delle world map. #=============================================================================== # Installazione: # Installare lo script sotto Materials, prima del Main. Mettere poi il seguwente # script in un call script: "MapCreator.start" # Non dovrai fare nient'altro che aspettare che venga visualizzata la mappa # creata e poi salvata. # In alternativa, puoi fare in modo che la mappa generata sia in bianco e # nero, mostrando come bianchi i punti dove l'eroe può passare, in nero quelli # dove invece il giocatore non può camminare. Basta chiamare il comando in # questo modo: MapCreator.start(false) # Altre personalizzazioni sono: # MapCreator.start(bianconero/colori, salvare_in_png?, nome_immagine) #=============================================================================== # Il processo di salvataggio ci mette un pò, abbiate pazienza (script PNG # Saver di Woratana, ringraziamenti a lui) #=============================================================================== #=============================================================================== # ** PERSONALIZZAZIONI ** #=============================================================================== module MapCreator #Imposta i colori della mappa in bianco e nero: #----------------------------------------------------------------------------- #Colore della mappa non passabile: Non_Passabile = Color.new(0,0,0) #Colore della mappa passabile: Passabile = Color.new(255,255,255) #Imposta i colori della mappa per ogni tile (ho preparato questo per la mappa #del mondo, ma si possono aggiungere i colori degli altri tile, gli ID possono #essere facilmente recuperati su internet def self.get_type(id) case id #Tile A1 when 2048..2095 #Mare return "BluMare" #Colore che andrà ad usare (vedi in basso) when 2096..2143 #Oceano return "BluScuro" when 2144..2191 #Scogli return "BluMare" when 2192..2239 #Iceberg return "BluMare" when 2240..2287 #Fiume return "BluMare" when 2288..2335 #Cascata return "BluMare" when 2336..2383 #Vasca return "BluMare" when 2384..2431 #Ruscello return "BluMare" when 2432..2479 #Corso d'acqua return "BluMare" when 2480..2527 #Ruscello return "BluMare" when 2528..2575 #Vasca artificiale return "BluMare" when 2576..2623 #Ruscello return "BluMare" when 2624..2671 #Fogne return "BluMare" when 2672..2719 #Cascata fogne return "BluMare" when 2720..2767 #Lava return "Lava" when 2768..2815 #Cascata lavica return "Lava" #Tile A2 when 2816..2863 #Pianure mappa del mondo return "Erba" when 2864..2911 #Foreste return "Foresta" when 2912..2959 #Montagne return "Montagne" when 2960..3007 #Erba delle mappe chiuse return "Erba" when 3008..3055 #Erba alta return "ErbaAlta" when 3056..3103 #Recinto di legno return "Erba" when 3104..3151 #Mulattiere return "Erba" when 3152..3199 #Tavolo di legno return "Erba" when 3200..3247 #Terre aride return "Terra" when 3248..3295 #Alberi secchi return "Terra" when 3296..3343 #Montagne rocciose return "Montagne" when 3344..3391 #Terra interiore return "Terra" when 3392..3439 #Steppe aride return "Terra" when 3440..3487 #Recinto di pietra return "Terra" when 3488..3535 #Tappeto di stoffa return "Erba" when 3536..3583 #Tavolo di noce return "Erba" when 3584..3631 #Deserto return "Deserto" when 3632..3679 #Palme desertiche return "Deserto" when 3680..3727 #Montagne desertiche return "Montagne" when 3728..3775 #Sabbia return "Deserto" when 3776..3823 #Oasi return "Deserto" when 3824..3871 #Recinto del deserto return "Deserto" when 3872..3919 #Tappeto rosso return "Erba" when 3920..3967 #Tavolo di marmo return "Erba" when 3968..4015 #Neve return "Neve" when 4016..4063 #Foresta innevata return "ForestaNeve" when 4064..4111 #Monti innevati return "MontagneNeve" when 4112..4159 #Passaggio innevato return "Neve" when 4160..4207 #Steppa innevata return "Neve" when 4208..4255 #Recinto innevato return "Neve" when 4256..4303 #Pavimento di marmo return "Erba" when 157,163..165,170..175,204..206,292,233,237,238,248,251 return "Dungeon" when 184..191,200..203,208..214,216..222,226..228,234..236,242,250,252..255 return "Villaggi" when 100,101,77 #Personalizzazioni Overdrive return "Dungeon" when 69,70 return "Villaggi" else return nil end end #Colori #----------------------------------------------------------------------------- #Qui sono impostati i colori che verranno usati per disegnare la mappa. Colori = {#Nome R G B "Nero" => Color.new(0, 0, 0), "BluMare" => Color.new(31, 122, 173), "BluScuro" => Color.new(12, 75, 128), "Erba" => Color.new(150, 191, 100), "Foresta" => Color.new(41, 103, 16), "ErbaAlta" => Color.new(128, 161, 95), "Montagne" => Color.new(118, 92, 49), "Terra" => Color.new(200, 158, 98), "Deserto" => Color.new(226, 221, 162), "Neve" => Color.new(255, 255, 255), "ForestaNeve" => Color.new(194, 209, 195), "MontagneNeve"=> Color.new(147, 155, 162), "Dungeon" => Color.new(255, 0, 0), "Villaggi" => Color.new(0, 255, 0), } #=============================================================================== #----------------------------------------------------------------------------- # * Start # bianconero: imposta se la mappa è a colori o in bianco e nero # salva: imposta se salva in PNG dopo la creazione # nome: nome della mappa salvata in PNG #----------------------------------------------------------------------------- def self.start(bianconero = false,salva = true, extratile=false,nome="mappa") @finestra_creazione = Window_Creation.new mappa = $game_map lung = mappa.width larg = mappa.height bianconero ? color="(b/n)" : color="" if bianconero == true immagine = crea_immagine_bn(mappa,lung,larg) #Creazione in bianco e nero else immagine = crea_immagine_color(mappa,lung,larg,extratile) #Creazione a colori end @finestra_creazione.opacity = 0 @finestra_creazione.visible = false @finestra_creazione.dispose @immagine = Sprite.new @immagine.bitmap = immagine @immagine.x = ([email protected])/2 @immagine.y = Graphics.height/2 @immagine.opacity = 0 loop{ #Animazione mostra immagine @immagine.opacity += 20 @immagine.y-=4 if @immagine.y > 0 @immagine.y = 0 if @immagine.y < 0 Graphics.update break if @immagine.y<=0 } if salva mapname = sprintf("%s %3d %s",nome,id,color) immagine.make_png(mapname,'') @immagine.opacity = 0 @immagine.bitmap.dispose @immagine.dispose end end #----------------------------------------------------------------------------- # * Crea immagine in bianco e nero # mappa: oggetto mappa # lung: lunghezza della mappa # larg: larghezza della mappa #----------------------------------------------------------------------------- def self.crea_immagine_bn(mappa,lung,larg) bitmap = Bitmap.new(lung,larg) perc = 0 for i in 0..lung-1 for j in 0..larg-1 if mappa.passable?(i,j) bitmap.set_pixel(i,j,Passabile) else bitmap.set_pixel(i,j,Non_Passabile) end end @finestra_creazione.set(100.00*i.to_f/lung) Graphics.update end return bitmap end #----------------------------------------------------------------------------- # * Crea immagine a colori # mappa: oggetto mappa # lung: lunghezza della mappa # larg: larghezza della mappa #----------------------------------------------------------------------------- def self.crea_immagine_color(mappa,lung,larg,extratile) bitmap = Bitmap.new(lung,larg) perc = 0 for i in 0..lung-1 for j in 0..larg-1 tile = ottieni_tile(i,j,extratile) colore = ottieni_colore(tile) bitmap.set_pixel(i,j,colore) end @finestra_creazione.set(100.00*i.to_f/lung) Graphics.update end return bitmap end #----------------------------------------------------------------------------- # * Ottiene le informazioni sul tile corrente # x: coordinata X del tile # y: coordinata Y del tile #----------------------------------------------------------------------------- def self.ottieni_tile(x,y,extratile) if extratile == true tile = get_type($game_map.data[x,y,2]) tile = get_type($game_map.data[x,y,1]) if tile == nil else tile = get_type($game_map.data[x,y,1]) #prova con layer 1 end tile = get_type($game_map.data[x,y,0]) if tile == nil return tile end #----------------------------------------------------------------------------- # * Ottiene il colore impostato su quel tile #----------------------------------------------------------------------------- def self.ottieni_colore(tile) if Colori.include?(tile) return Colori[tile] else return Colori["Nero"] end end end #fine MapCreator #=============================================================================== # ** Classe Window_Creation #=============================================================================== class Window_Creation < Window_Base #----------------------------------------------------------------------------- # * inizializzazione #----------------------------------------------------------------------------- def initialize(salvataggio = false) super(0,0,Graphics.width,WLH*2+32) @perc = 0 refresh if salvataggio == true @text = "Salvataggio in corso..." else @text = "Creazione bitmap in corso..." end end #----------------------------------------------------------------------------- # * refresh #----------------------------------------------------------------------------- def refresh self.contents.clear self.contents.draw_text(4,0,self.width-32,WLH,@text) self.contents.fill_rect(4,WLH,self.width-32,5,gauge_back_color) larg = (self.width-32)*@perc/100.00 self.contents.gradient_fill_rect(4,WLH,larg,5,hp_gauge_color1,hp_gauge_color2) end #----------------------------------------------------------------------------- # * settaggio percentuale #----------------------------------------------------------------------------- def set(valore) @perc = valore refresh end end #Window_Creation # ============================================================================= # PNG Saver by Woratana. # ============================================================================= module Zlib class Png_File < GzipWriter def make_png(bitmap, mode = 0) @bitmap, @mode = bitmap, mode create_loader self.write(make_header) self.write(make_ihdr) self.write(make_idat) self.write(make_iend) end def create_loader w = @bitmap.width h = @bitmap.height @calculated = [0,nil] @calculated[1] = Float.induced_from(w*h) @window = Window_Creation.new(true) @update = ((@bitmap.width*@bitmap.height)/3000.0).floor.to_i refresh_loader end def refresh_loader Graphics.update @window.set(percent) Graphics.update end def percent return ((100/@calculated[1])*@calculated[0]).floor end def make_header return [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].pack('C*') end def make_ihdr ih_size = [13].pack('N') ih_sign = 'IHDR' ih_width = [@bitmap.width].pack('N') ih_height = [@bitmap.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 def make_idat header = "\x49\x44\x41\x54" data = @mode == 0 ? make_bitmap_data0 : make_bitmap_data1 data = Zlib::Deflate.deflate(data, 8) crc = [Zlib.crc32(header + data)].pack('N') size = [data.length].pack('N') return size + header + data + crc end def make_bitmap_data0 gz = Zlib::GzipWriter.open('png2.tmp') t_Fx = 0 w = @bitmap.width h = @bitmap.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 end color = @bitmap.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) @calculated[0] += 1 if @calculated[0] % @update == 0 refresh_loader end end end s = data.pack('C*') gz.write(s) gz.close data.clear gz = Zlib::GzipReader.open('png2.tmp') data = gz.read gz.close File.delete('png2.tmp') delete_window return data end def make_bitmap_data1 w = @bitmap.width h = @bitmap.height data = [] for y in 0...h data.push(0) for x in 0...w color = @bitmap.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) @calculated[0] += 1 if @calculated[0] % @update == 0 refresh_loader end end end delete_window return data.pack('C*') end 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 def delete_window @window.visible=false @window.dispose end end end #============================================================================= # ** Bitmap #============================================================================= class Bitmap def make_png(name = 'like', path = '', mode = 0) Zlib::Png_File.open('png.tmp') { |gz| gz.make_png(self, mode) } Zlib::GzipReader.open('png.tmp') { |gz| $read = gz.read } f = File.open(path + name + '.png', 'wb') f.write($read) f.close File.delete('png.tmp') end end
Bugs e Conflitti Noti
Nel caso vi dia errore il salvataggio della mappa in PNG, provate a disattivare il salvataggio seguendo le istruzioni nello script, quindi fate uno screenshot dell'immagine con il tasto Stamp ed incollatelo in un programma di grafica.
Per la mappa a colori, ho inserito solo i colori strettamente necessari per creare una worldmap, ma è facile aggiungere i tag per gli altri tile e usare la funzione per tutte le mappe.
Per trovare tutti gli ID potreste dare un'occhiata a questo indirizzo:
http://forums.rpgmak...otile-tile-ids/
Altri Dettagli
Non mi assumo colpe per problemi di funzionamento del PNG Saver.
Woratana per il PNG Saver
Template compilato con Script Templater.
Modificato da Holy87, 23 March 2013 - 15:37 PM.