Sujet: [Brouillon] Screen IG Jeu 17 Juin 2010 - 14:09
Marre des screens pris dans l'éditeur de jeu pour de grande map ?
Bon j'ai un bout de solution pour ça J'ai bidouillé un gadget permettant de prendre un screen complet d'une map IG
Petit HIC : - Ne cherchez pas à faire fonctionner le script pour une map de plus de 65 * 65 (au delà de ces valeurs le script plante lamentablement) - Temps de réalisation abominable >.< ( enfin c'est quand même plus rapide que si c'était fait à la main) Exemple : Sur mon ordi 30 sec pour le screen d'une map de 70*39 ... - Y'a des résultats bizarres quand la map a un frog ou/et un panorama
script :
Code:
class Bitmap def make_png(name = 'like', path = '', mode = 0) Dir.mkdir(path) if path != '' and !FileTest.directory?(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 end
class Png_File < GzipWriter #-------------------------------------------------------------------------- # * Make PNG #-------------------------------------------------------------------------- def make_png(bitmap, mode = 0) # Save Bitmap & Mode @bitmap, @mode = bitmap, mode # Create & Save PNG self.write(make_header) self.write(make_ihdr) self.write(make_idat) self.write(make_iend) end #-------------------------------------------------------------------------- # * Make Header #-------------------------------------------------------------------------- def make_header return [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].pack('C*') end #-------------------------------------------------------------------------- # * Make IHDR #-------------------------------------------------------------------------- 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 #-------------------------------------------------------------------------- # * Make IDAT #-------------------------------------------------------------------------- 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 #-------------------------------------------------------------------------- # * Make Bitmap Data 0 #-------------------------------------------------------------------------- def make_bitmap_data0 gz = Zlib::GzipWriter.open('hoge.gz') 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) 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 #-------------------------------------------------------------------------- # * Make Bitmap Data Mode 1 #-------------------------------------------------------------------------- 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) end end return data.pack("C*") end #-------------------------------------------------------------------------- # * Make 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
module Screen gamename = open("Game.ini").readlines[4] gamename = gamename[6, gamename.size - 7] Window = Win32API.new('user32', 'FindWindow', %w(p p), 'l').call('RGSS Player', gamename) Screenshot = Win32API.new('screenshot.dll', 'Screenshot', %w(l l l l p l l), '') module_function def shot(filename = "Screenshot", type = 2) case type when 1 ; filename += ".jpg" when 2 ; filename += ".png" else ; filename += ".bmp" end Screenshot.call(0, 0, 544, 416, filename, Window, type) end end
class Scene_Map < Scene_Base alias add_update update def update add_update if Input.trigger?(Input::X) Sound.play_decision width = ($game_map.width / 17.0) height = ($game_map.height / 13.0) - 1 w = 0 h = 0 nbr = 0 loop do nbr += 1 $game_map.set_position_bitmap(17 * w, 13 * h) @spriteset.update wait(5) path = "Temp/" Dir.mkdir(path) if path != '' and !FileTest.directory?(path) Screen.shot("Temp/ScreenShot#{nbr}") w += 1 break if w >= width and h >= height if w >= width h += 1 w = 0 end end bitmap = Bitmap.new($game_map.width * 32, $game_map.height * 32) w = 0 h = 0 for i in 1..nbr bitmap.blt((w * 17 * 32), (h * 13 * 32), Cache.load_bitmap("Temp/", "ScreenShot#{i}"), Rect.new(0, 0, 544, 416)) w += 1 if w >= width h += 1 w = 0 end end bitmap.make_png("ScreenMap", "") print "Finis" $scene = nil end end def wait(duration) for i in 0...duration update_basic end end end
class Game_Map def set_position_bitmap(x, y) @display_x = x * 256 @display_y = y * 256 @parallax_x = x @parallax_y = y end end
Pensez à ajouter cette DLL (Screenshot.dll) à votre dossier pour faire fonctionner le code.
Comment ça marche : Une fois votre héro sur la bonne map à shooter appuyez sur A Vous verrez alors plein de bouts de maps défilées, ne touchez plus à rien !! (Toute façon même si vous touchiez ça ferrez rien..) Attendez d'avoir un message avec inscrit Finis cliquez ensuite sur Ok, votre jeu se fermera automatiquement. Rendez vous dans le dossier de votre jeu Un dossier Temp est apparu (vous pourrez le supprimer) et une image ScreenMap.png C'est cette dernière qui est le screen complet de votre map IG =)
Voilà et bon making !
Sylfurion
Mage Lv.11
Age : 27 Inscrit le : 02/03/2009 Messages : 513
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 15:39
Merci à toi !!!
Biward
Age : 28 Inscrit le : 30/12/2009 Messages : 1067
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 15:41
Ah ! Enfin un script de screen de big map ! C'est super utile pour faire les maps mondes !
Encore merci ! Biward
Milow
Habitant Lv.6
Age : 30 Inscrit le : 28/02/2010 Messages : 124
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 15:47
Citation :
C'est super utile pour faire les maps mondes !
Sa dépend leur taille ^^'
On peut pas prendre un screen d'une map qui a plus de 4 225 cases soit 65*65 cases... Le bitmap n'arrive pas a se créer...
Bref faudrait que je trouve un moyen pour optimiser ça mais bon plus tard
Blockade
Ex-Admin Cruelle
Age : 32 Inscrit le : 03/07/2008 Messages : 2441
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 15:49
YanflY avait expliqué ce bug je crois.
Citation :
# If any selectable window has more than 341 rows for whatever reason, the game # will crash with a "failed to create bitmap error" leaving the player curious # as to what just happened. This essentially means that you cannot have more # than 682 items in your item menu, skill menu, or equip menu at all without # risking a crash. This is because RGSS2, by default, can only create bitmaps # in size of up to 8192 pixels in width or height.
Donc si ton image dépasse 8192 pixels, le jeu plante xD Bon script sinon +3 points en script (Le truc du png est pas de toi j'immagine xD)
Milow
Habitant Lv.6
Age : 30 Inscrit le : 28/02/2010 Messages : 124
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 15:50
Ah ok... C*n de limite de RGSS2 >.> On peut pas le changer ?
EDIT : Non non il est pas de moi, C'est berka qui m'a passé le code mais il ne souhaitez pas de crédit alors je n'ai rien mit...
Blockade
Ex-Admin Cruelle
Age : 32 Inscrit le : 03/07/2008 Messages : 2441
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 15:53
Euh Yanfly à pas fait ou pas réussi apparemment, fraudais voir ca avec berka ou ASHKA.
Citation :
EDIT : Non non il est pas de moi, C'est berka qui m'a passé le code mais il ne souhaitez pas de crédit alors je n'ai rien mit...
Tant que tu dis pas que t'en es l'auteur, moi je m'en fiche après !
Zangther
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 16:16
Essaye de voir avec le script de YanFly qui répertorie les icons. Je sais que ca permet de créer un bitmap très grand.
Voila le code :
Code:
#=============================================================================== # # Yanfly Engine Melody - Iconview Melody # Last Date Updated: 2010.05.24 # Level: Easy # # Don't know how to use Photoshop's X and Y coordinates to count your icons or # just too lazy to do it? Well, you can use this tool to make your life easier # by loading up the icons on a static sheet and figuring out what those icons # are indexed as. This script will mark 256 icons per page and allows you to # scroll through those pages as lagless as possible. The icons are displayed # in columns of 16 icons each, following exactly the way your IconSet is made # (or should be made). # #=============================================================================== # Updates # ----------------------------------------------------------------------------- # o 2010.05.24 - Started script and Finished. #=============================================================================== # Instructions # ----------------------------------------------------------------------------- # To install this script, open up your script editor and copy/paste this script # to an open slot below ▼ Materials but above ▼ Main. Remember to save. # # Iconview only appears in testplay mode. If for some reason your game does not # use the command window in the title screen, there is an alternative way of # entering the Iconview scene by pressing F9 at the title screen. #===============================================================================
$imported = {} if $imported == nil $imported["IconviewMelody"] = true
module YEM module ICONVIEW
# If for some reason you wish to change the name of the command that # appears on the title screen, edit this constant. COMMAND_NAME = "IconView"
end # ICONVIEW end # YEM
#=============================================================================== # Editting anything past this point may potentially result in causing computer # damage, incontinence, explosion of user's head, coma, death, and/or halitosis. # Therefore, edit at your own risk. #===============================================================================
#-------------------------------------------------------------------------- # dispose #-------------------------------------------------------------------------- def dispose @icon_sprite.bitmap.dispose @icon_sprite.dispose super end
#-------------------------------------------------------------------------- # update #-------------------------------------------------------------------------- def update super return unless @max_pages > 1 if Input.repeat?(Input::L) Sound.play_cursor image_page_up elsif Input.repeat?(Input::R) Sound.play_cursor image_page_down end end
#-------------------------------------------------------------------------- # refresh #-------------------------------------------------------------------------- def refresh @item_max = @icon_window.max_pages create_contents for i in 0...@item_max; draw_item(i); end end
#-------------------------------------------------------------------------- # draw_item #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) self.contents.clear_rect(rect) text = sprintf("Page%d", index+1) self.contents.draw_text(rect, text, 1) end
#-------------------------------------------------------------------------- # update #-------------------------------------------------------------------------- def update super if self.index != @icon_window.page self.index = @icon_window.page end end
#-------------------------------------------------------------------------- # refresh #-------------------------------------------------------------------------- def refresh self.contents.clear text = 256 * @iconview_window.page + @iconview_window.index text = sprintf("ID:%d", text) self.contents.draw_text(0, WLH*0, contents.width, WLH, text, 1) text = @iconview_window.image.height / 24 * 16 text = sprintf("Total:%d", text) self.contents.draw_text(0, WLH*1, contents.width, WLH, text, 1) text = "L:PageUp" self.contents.draw_text(0, WLH*2, contents.width, WLH, text, 1) text = "R:PageDn" self.contents.draw_text(0, WLH*3, contents.width, WLH, text, 1) end
#-------------------------------------------------------------------------- # update #-------------------------------------------------------------------------- def update super if @last_index != @iconview_window.index or @last_page != @iconview_window.page @last_index = @iconview_window.index @last_page = @iconview_window.page refresh end end
#-------------------------------------------------------------------------- # alias method: create_command_window #-------------------------------------------------------------------------- alias create_command_window_iconview create_command_window unless $@ def create_command_window create_command_window_iconview return unless $TEST return if @command_window == nil @command_window.commands.push(YEM::ICONVIEW::COMMAND_NAME) @command_window.item_max += 1 @command_window.create_contents @command_window.height += 24 @command_window.y -= 24 @command_window.refresh x = @command_window.commands.index(Vocab.continue) @command_window.draw_item(x, false) unless @continue_enabled end
#-------------------------------------------------------------------------- # alias method: update #-------------------------------------------------------------------------- alias update_iconview update unless $@ def update text = YEM::ICONVIEW::COMMAND_NAME if (Input.trigger?(Input::C) and @command_window != nil and @command_window.commands[@command_window.index] == text) or Input.press?(Input::F9) command_iconview else update_iconview end end
#-------------------------------------------------------------------------- # new method: command_iconview #-------------------------------------------------------------------------- def command_iconview return unless $TEST Sound.play_decision $scene = Scene_Iconview.new end
#-------------------------------------------------------------------------- # terminate #-------------------------------------------------------------------------- def terminate super dispose_menu_background @iconview_window.dispose @dummy_window.dispose @data_window.dispose @page_window.dispose end
#-------------------------------------------------------------------------- # update #-------------------------------------------------------------------------- def update super update_menu_background @iconview_window.update @data_window.update @page_window.update if Input.trigger?(Input::B) Sound.play_cancel $scene = Scene_Title.new end end
end # Scene_Iconview
#=============================================================================== # # END OF FILE # #===============================================================================
Blockade
Ex-Admin Cruelle
Age : 32 Inscrit le : 03/07/2008 Messages : 2441
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 16:33
Nope c'page par page, donc le bitmap ne sera pas très grand !
Milow
Habitant Lv.6
Age : 30 Inscrit le : 28/02/2010 Messages : 124
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 17:10
Ah dommage =/ Je demanderais à berka ou a ASHKA un de ces quatre !
Zangther
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
Sujet: Re: [Brouillon] Screen IG Jeu 17 Juin 2010 - 19:10
Ah ouais, bah pourquoi pas faire pareil ? Images par images ! Un screen en plusieurs morceaux.
Milow
Habitant Lv.6
Age : 30 Inscrit le : 28/02/2010 Messages : 124
Sujet: Re: [Brouillon] Screen IG Ven 18 Juin 2010 - 10:41
Ouais aussi Je m'y pencherais un peu plus tard
Zangther
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
Sujet: Re: [Brouillon] Screen IG Ven 18 Juin 2010 - 11:46