| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 17 |  
| 经验 | 0 |  
| 最后登录 | 2025-7-4 |  
| 在线时间 | 123 小时 |  
 Lv3.寻梦者 
	梦石0 星屑1737 在线时间123 小时注册时间2023-12-26帖子226 | 
| #============================================================================= # Σ Fullscreen
 #-----------------------------------------------------------------------------
 # @author  : Gabriel "Gab!" Teles
 # @date    : 2014-09-27
 # @version : 0.9.2
 #-----------------------------------------------------------------------------
 # TODO:
 #   - Transições por imagens
 #-----------------------------------------------------------------------------
 # Créditos:
 #   Scripter Desconhecido no Pastebin (http://pastebin.com/sM2MNJZj)
 #   Esrever : Map viewport/scroll fix
 #   Zeus81  : FPS Display
 #-----------------------------------------------------------------------------
 # Permite utilizar fullscreen real (sem redimensionamento de tela), e alterar
 # o limite da função Graphics.resize_screen para a resolução máxima do monitor
 # ou um valor próximo.
 #=============================================================================
 
 # Módulo Graphics
 class << Graphics
 # API
 User32   = DL.dlopen('user32')
 Kernel32 = DL.dlopen('kernel32')
 GetActiveWindow  = DL::CFunc.new(  User32['GetActiveWindow' ], DL::TYPE_LONG)
 GetSystemMetrics = DL::CFunc.new(  User32['GetSystemMetrics'], DL::TYPE_LONG)
 GetWindowRect    = DL::CFunc.new(  User32['GetWindowRect'   ], DL::TYPE_LONG)
 SetWindowLong    = DL::CFunc.new(  User32['SetWindowLong'   ], DL::TYPE_LONG)
 SetWindowPos     = DL::CFunc.new(  User32['SetWindowPos'    ], DL::TYPE_LONG)
 GetModuleHandle  = DL::CFunc.new(Kernel32['GetModuleHandle' ], DL::TYPE_LONG)
 
 # DLL sendo utilizada
 _DLLName = DL::CPtr.malloc(140)
 s = DL::CFunc.new(Kernel32['GetPrivateProfileString'], DL::TYPE_LONG).call([
 DL::CPtr["Game"].to_i,
 DL::CPtr["Library"].to_i,
 0,
 _DLLName.to_i,
 140,
 DL::CPtr["./Game.ini"].to_i
 ])
 
 @@DLLName = File.basename(_DLLName.to_s(s))
 
 # Verifica se é uma RGSS3xx.dll
 if @@DLLName.match(/^RGSS3(\d{2})\.dll$/)
 @@DLLVersion = $1.to_i
 
 # Verifica se a versão é 0 ou 1.
 if @@DLLVersion.between?(0, 1)
 # Flag de fullscreen
 @@inFullscreen = false
 
 # Instância da DLL. *Necessariamente* a RGSS300.dll ou RGSS301.dll, visto
 # que o trabalho com memória a seguir é específico.
 
 @@DLLHandle   = GetModuleHandle.call([DL::CPtr[@@DLLName].to_i])
 
 # Instância da janela de jogo
 @@hWnd       = GetActiveWindow.call([])
 
 # Tamanho da tela
 @@screenSize = [
 GetSystemMetrics.call([0]),
 GetSystemMetrics.call([1])
 ]
 
 # Calcula o próximo tamanho divisível por 32 para fazer a limitação
 width, height = @@screenSize
 width  += (32 - (width  % 32)) unless (width  % 32).zero?
 height += (32 - (height % 32)) unless (height % 32).zero?
 puts "Limitando para: #{width}x#{height}" if $TEST
 
 #-----------------------------------------------------------------------
 # Bruxaria de scripter desconhecido. Remove a limitação de tamanho para
 # o método Graphics.resize_screen (640x480)
 #
 # Base retirada de: http://pastebin.com/sM2MNJZj
 #
 # Adaptações para a RGSS300.dll e início do mapeamento dos endereços
 # utilizados por Gab!
 #-----------------------------------------------------------------------
 
 # Número para string
 wh = ->(w, h, off = 0){
 [w + off, h + off].pack('l2').scan(/..../)
 }
 
 # Altera um valor na memória relativa à DLL
 mod = ->(adr, val){
 adr += @@OFF if @@DLLVersion.zero?
 DL::CPtr.new(@@DLLHandle + adr)[0, val.size] = val
 }
 
 # Valores úteis
 wt,  ht  = width.divmod(32), height.divmod(32)
 w,   h   = wh.(width, height)
 ww,  hh  = wh.(width, height, 32)
 www, hhh = wh.(wt.first, ht.first, 1)
 zero     = [0].pack('l')
 
 # Faz as alterações na memória
 
 # Graphics
 @@OFF = 0
 mod.(0x195F, "\x90"*5) # ???
 mod.(0x19A4,   h     ) # ???
 mod.(0x19A9,   w     ) # ???
 mod.(0x1A56,   h     ) # ???
 mod.(0x1A5B,   w     ) # ???
 mod.(0x20F6,   w     ) # Max width  (?)
 mod.(0x20FF,   w     ) # Max width  (?)
 mod.(0x2106,   h     ) # Max height (?)
 mod.(0x210F,   h     ) # Max height (?)
 
 # Plane (?) Class
 @@OFF   = -0xC0
 Graphics::PlaneSpeedUp = true
 # Setando para false não é necessário reescrever classe Plane. No
 # entanto, o mapa fica MUITO lento.
 mod.(0x1C5E3,  Graphics::PlaneSpeedUp ? zero : h) # Max height
 mod.(0x1C5E8,  Graphics::PlaneSpeedUp ? zero : w) # Max width
 
 # ???
 @@OFF = 0x20
 mod.(0x1F477,  h     ) # ???
 mod.(0x1F47C,  w     ) # ???
 
 # Tilemap Class
 @@OFF = 0x1E0
 mod.(0x211FF,  hh    ) # Tilemap render height
 mod.(0x21204,  ww    ) # Tilemap render width
 mod.(0x21D7D,  hhh[0]) # Tilemap max tiles on screen height
 mod.(0x21E01,  www[0]) # Tilemap max tiles on screen width
 
 # ???
 @@OFF = 0x140
 mod.(0x10DEA8, h     ) # ???
 mod.(0x10DEAD, w     ) # ???
 mod.(0x10DEDF, h     ) # ???
 mod.(0x10DEE3, w     ) # ???
 mod.(0x10DF14, h     ) # ???
 mod.(0x10DF18, w     ) # ???
 mod.(0x10DF48, h     ) # ???
 mod.(0x10DF4C, w     ) # ???
 mod.(0x10E6A7, w     ) # ???
 mod.(0x10E6C3, h     ) # ???
 mod.(0x10EEA9, w     ) # ???
 mod.(0x10EEB9, h     ) # ???
 
 #-------------------------------------------------------------------------
 # Fim da bruxaria
 #-------------------------------------------------------------------------
 
 # Sprite de transição de tela
 @@TransitionSprite = Sprite.new
 @@TransitionSprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
 @@TransitionSprite.bitmap.fill_rect(@@TransitionSprite.bitmap.rect, Color.new(0, 0, 0))
 @@TransitionSprite.opacity = 0
 @@TransitionSprite.z = 0x7FFFFFFF
 
 # Bitmap da tela no momento do Graphics.freeze
 @@FrozenBitmap = Bitmap.new(Graphics.width, Graphics.height)
 @@FrozenBitmap.fill_rect(@@FrozenBitmap.rect, Color.new(0, 0, 0))
 
 # Realiza a transição de tela
 # Nota: Não é possível realizar transição de tela com imagens
 alias oldFullscreenResTransition transition
 def transition(time, image='', vague=40)
 @@TransitionSprite.bitmap.dispose
 @@TransitionSprite.dispose
 @@TransitionSprite = Sprite.new
 @@TransitionSprite.bitmap = @@FrozenBitmap
 @@TransitionSprite.opacity = 255
 @@TransitionSprite.z = 0x7FFFFFFF
 
 oldFullscreenResTransition(0)
 
 dec = (255.0 / time)
 time.times {
 @@TransitionSprite.opacity -= dec
 Graphics.update
 }
 end
 
 # Fadein
 def fadein(time)
 @@FrozenBitmap = Bitmap.new(Graphics.width, Graphics.height)
 @@FrozenBitmap.fill_rect(@@FrozenBitmap.rect, Color.new(0, 0, 0))
 
 transition(time)
 end
 
 # Fadeout
 def fadeout(time)
 inc = (255.0 / time)
 time.times {
 @@TransitionSprite.opacity += inc
 Graphics.update
 }
 end
 
 # Armazena a imagem da tela
 alias oldFullscreenResFreeze freeze
 def freeze(*a, &b)
 oldFullscreenResFreeze(*a, &b)
 @@FrozenBitmap = Graphics.snap_to_bitmap
 end
 
 # Realiza o redimensionamento de tela
 alias gabFullscreenOldResizeScreen resize_screen
 def resize_screen(*a, &b)
 # Redimensiona normalmente
 gabFullscreenOldResizeScreen(*a, &b)
 # Redimensiona o sprite de transição
 @@TransitionSprite.bitmap.dispose
 @@TransitionSprite.bitmap = Bitmap.new(*Graphics.size)
 @@TransitionSprite.bitmap.fill_rect(@@TransitionSprite.bitmap.rect, Color.new(0, 0, 0))
 
 if Graphics::PlaneSpeedUp
 # Manda o sinal de atualização para todas as instâncias da classe Plane
 ObjectSpace.each_object(Plane){|plane|
 plane.send(:recreateBitmap)
 }
 end
 end
 
 # Altera para fullscreen
 def fullscreen
 # Retorna se já estiver em fullscreen
 return if @@inFullscreen
 # Tamanho antes do fullscreen
 rect = DL::CPtr.malloc(16)
 rect[0, 16] = 0.chr * 16
 GetWindowRect.call([@@hWnd, rect])
 @@windowSize = rect[0, 16].unpack("l*")
 @@windowSize[2] -= @@windowSize[0]
 @@windowSize[3] -= @@windowSize[1]
 @@windowResolution = Graphics.size
 # Muda o tamanho da tela
 Graphics.resize_screen(*@@screenSize)
 # Remover bordas da janela
 SetWindowLong.call([@@hWnd, -16, 0x14000000])
 # Coloca a janela acima de todas as outras
 SetWindowPos.call([@@hWnd, -1, 0, 0, *@@screenSize, 0])
 # Modifica a flag de fullscreen
 @@inFullscreen = true
 # Espera alguns frames para terminar o processamento
 Graphics.wait(5)
 end
 
 # Altera para modo janela
 def windowed
 # Retorna se não estiver em fullscreen
 return unless @@inFullscreen
 # Muda o tamanho da tela
 Graphics.resize_screen(*@@windowResolution)
 # Recoloca bordas da janela
 SetWindowLong.call([@@hWnd, -16, 0x14CA0000])
 # Coloca a janela na posição x,y,z comum e ajusta seu tamanho
 SetWindowPos.call([@@hWnd, 0, *@@windowSize, 0])
 # Modifica a flag de fullscreen
 @@inFullscreen = false
 # Espera alguns frames para terminar o processamento
 Graphics.wait(5)
 end
 
 # Tamanho da tela
 def size
 [self.width, self.height]
 end
 
 # Verifica se a janela está no modo fullscreen
 def fullscreen?
 return @@inFullscreen
 end
 
 # Verifica se a janela está no modo janela
 def windowed?
 return !@@inFullscreen
 end
 
 # Alterna entre os modos fullscreen e janela
 def toggleFullscreen
 @@inFullscreen ? self.windowed : self.fullscreen
 end
 end
 end
 end
 
 if Graphics::PlaneSpeedUp
 # Remove a classe Plane Anterior
 Object.send(:remove_const, :Plane)
 # Redefinição da classe Plane
 class Plane
 attr_reader :viewport
 attr_reader :bitmap
 attr_reader :ox
 attr_reader :oy
 attr_reader :opacity
 attr_reader :blend_type
 attr_reader :color
 attr_reader :tone
 attr_reader :visible
 attr_reader :zoom_x
 attr_reader :zoom_y
 attr_reader :z
 
 # Inicialização do objeto
 def initialize(viewport = nil)
 # É necessário verificar se um viewport foi enviado. Desse modo, ao mudar a
 # resolução da tela, deve-se mudar também a rect do viewport para que o
 # Plane que ocupava a tela toda continue
 @defaultViewport = !viewport.is_a?(Viewport)
 @viewport = @defaultViewport ? Viewport.new(0, 0, *Graphics.size) : viewport
 
 @sprite        = Sprite.new(@viewport)
 @bitmap        = nil
 @ox            = @sprite.ox         # 0
 @oy            = @sprite.oy         # 0
 @opacity       = @sprite.opacity    # 255
 @blend_type    = @sprite.blend_type # 0
 @color         = @sprite.color      # Color.new(0, 0, 0, 0)
 @tone          = @sprite.tone       # Tone.new(0, 0, 0, 0)
 @visible       = @sprite.visible    # true
 @z             = @sprite.z          # 0
 @zoom_x        = @sprite.zoom_x     # 1.0
 @zoom_y        = @sprite.zoom_y     # 1.0
 end
 
 def bitmap=(bitmap)
 return unless bitmap.is_a?(Bitmap)
 @bitmap = bitmap
 self.recreateBitmap(true)
 end
 
 def ox=(value)
 @ox = value
 return unless @bitmap
 @sprite.ox = (value % @bitmap.width)
 end
 
 def oy=(value)
 @oy = value
 return unless @bitmap
 @sprite.oy = (value % @bitmap.height)
 end
 
 def opacity=(value)
 @sprite.opacity = value
 @opacity = @sprite.opacity
 end
 
 def blend_type=(value)
 @sprite.blend_type = value
 @blend_type = @sprite.blend_type
 end
 
 def color=(value)
 @sprite.color = value
 @color = @sprite.color
 end
 
 def tone=(value)
 @sprite.tone = value
 @tone = @sprite.tone
 end
 
 def viewport=(value)
 @defaultViewport &= (value == @sprite.viewport)
 @sprite.viewport = value
 @viewport = @sprite.viewport
 end
 
 def visible=(value)
 @sprite.visible = value
 @visible = sprite.visible
 end
 
 def z=(value)
 @sprite.z = value
 @z = @sprite.z
 end
 
 def zoom_x=(value)
 @sprite.zoom_x = value
 @zoom_x = @sprite.zoom_x
 self.recreateBitmap
 end
 
 def zoom_y=(value)
 @sprite.zoom_y = value
 @zoom_y = @sprite.zoom_y
 self.recreateBitmap
 end
 
 def disposed?
 return @sprite.disposed?
 end
 
 def dispose
 @sprite.dispose
 end
 
 protected
 
 def recreateBitmap(forceRefresh = false)
 cw, ch      = Graphics.width * (2.0/@zoom_x), Graphics.height * (2.0/@zoom_y)
 needRefresh = true
 
 if @defaultViewport
 @viewport.rect.width, @viewport.rect.height = *Graphics.size
 end
 
 if @sprite.bitmap.nil? or @sprite.bitmap.disposed?
 newBitmap = Bitmap.new(cw, ch)
 else
 if (cw == @sprite.bitmap.width) and (ch == @sprite.bitmap.height) and (!forceRefresh)
 return
 end
 
 newBitmap = Bitmap.new(cw, ch)
 if (cw < @sprite.bitmap.width) and (ch < @sprite.bitmap.height)
 newBitmap.blt(0, 0, @sprite.bitmap, @sprite.bitmap.rect)
 @sprite.bitmap.dispose
 needRefresh = false
 end
 end
 
 @sprite.bitmap = newBitmap
 self.refreshBitmap if needRefresh or forceRefresh
 end
 
 def refreshBitmap
 # Limpa o bitmap
 b = @sprite.bitmap
 b.clear
 
 return if @bitmap.nil?
 
 # Quantia de espaços para blt
 tx = (b.width  / @bitmap.width.to_f )
 ty = (b.height / @bitmap.height.to_f)
 
 b.blt(0, 0, @bitmap, @bitmap.rect)
 
 return if tx + ty == 2
 
 # Preenche 1 linha
 basePow = @bitmap.width
 baseRct = Rect.new(0, 0, @bitmap.width, @bitmap.height)
 
 Math.log2(tx).floor.times{
 b.blt(basePow, 0, b, baseRct)
 baseRct.width += basePow
 basePow *= 2
 }
 
 # Último bitmap da linha
 baseRct.width = (b.width - baseRct.width)
 b.blt(basePow, 0, b, baseRct)
 
 # Preenche o restante das linhas
 basePow = @bitmap.height
 baseRct = Rect.new(0, 0, b.width, @bitmap.height)
 
 Math.log2(ty).floor.times{
 b.blt(0, basePow, b, baseRct)
 baseRct.height += basePow
 basePow *= 2
 }
 
 # Última linha
 baseRct.height = b.height - baseRct.height
 b.blt(basePow, 0, b, baseRct)
 end
 end
 end
 
 class Game_Map
 # Número de tiles horizontais na tela
 def screen_tile_x
 (Graphics.width / 32.0).ceil
 end
 
 # Número de tiles verticais na tela
 def screen_tile_y
 (Graphics.height / 32.0).ceil
 end
 end
 
 # Contador de FPS para o modo Fullscreen
 if $TEST
 # FPS Display // Zeus81
 # http://forums.rpgmakerweb.com/in ... ccurate/#entry40350
 module Graphics
 @fps, @fps_tmp = 0, []
 
 class << self
 attr_reader :fps
 
 alias fps_update update unless method_defined?(:fps_update)
 def update
 t = Time.now
 fps_update
 @fps_tmp[frame_count % frame_rate] = Time.now != t
 @fps = 0
 frame_rate.times {|i| @fps += 1 if @fps_tmp}
 fps_sprite.src_rect.y = @fps * 16
 end
 
 def fps_sprite
 if !@fps_sprite or @fps_sprite.disposed?
 @fps_sprite = Sprite.new
 @fps_sprite.z = 0x7FFFFFFF
 @fps_sprite.bitmap = Bitmap.new(24, 16*120)
 @fps_sprite.bitmap.font.name = "Arial"
 @fps_sprite.bitmap.font.size = 16
 @fps_sprite.bitmap.font.color.set(255, 255, 255)
 @fps_sprite.bitmap.fill_rect(@fps_sprite.bitmap.rect, Color.new(0, 0, 0, 127))
 120.times {|i|
 @fps_sprite.bitmap.draw_text(0, i*16, 24, 16, "% 3d"%i, 1)
 }
 @fps_sprite.src_rect.height = 16
 end
 return @fps_sprite
 end
 end
 end
 end
 
 #==============================================================================
 # ▼ Viewports/Map Fix for Modified RGSS300.dll File
 #   Origin of Code: Yanfly Engine Ace - Ace Core Engine v1.06
 # -- Last Updated: 2011.12.26
 # -- Level: Easy, Normal
 # -- Requires: n/a
 #==============================================================================
 
 #==============================================================================
 # ■ Game_Map
 #==============================================================================
 
 class Game_Map
 
 #--------------------------------------------------------------------------
 # overwrite method: scroll_down
 #--------------------------------------------------------------------------
 def scroll_down(distance)
 if loop_vertical?
 @display_y += distance
 @display_y %= @map.height * 256
 @parallax_y += distance
 else
 last_y = @display_y
 dh = Graphics.height > height * 32 ? height : screen_tile_y
 @display_y = [@display_y + distance, height - dh].min
 @parallax_y += @display_y - last_y
 end
 end
 
 #--------------------------------------------------------------------------
 # overwrite method: scroll_right
 #--------------------------------------------------------------------------
 def scroll_right(distance)
 if loop_horizontal?
 @display_x += distance
 @display_x %= @map.width * 256
 @parallax_x += distance
 else
 last_x = @display_x
 dw = Graphics.width > width * 32 ? width : screen_tile_x
 @display_x = [@display_x + distance, width - dw].min
 @parallax_x += @display_x - last_x
 end
 end
 
 end # Game_Map
 
 #==============================================================================
 # ■ Spriteset_Map
 #==============================================================================
 
 class Spriteset_Map
 
 #--------------------------------------------------------------------------
 # overwrite method: create_viewports
 #--------------------------------------------------------------------------
 def create_viewports
 if Graphics.width > $game_map.width * 32 && !$game_map.loop_horizontal?
 dx = (Graphics.width - $game_map.width * 32) / 2
 else
 dx = 0
 end
 dw = [Graphics.width, $game_map.width * 32].min
 dw = Graphics.width if $game_map.loop_horizontal?
 if Graphics.height > $game_map.height * 32 && !$game_map.loop_vertical?
 dy = (Graphics.height - $game_map.height * 32) / 2
 else
 dy = 0
 end
 dh = [Graphics.height, $game_map.height * 32].min
 dh = Graphics.height if $game_map.loop_vertical?
 @viewport1 = Viewport.new(dx, dy, dw, dh)
 @viewport2 = Viewport.new(dx, dy, dw, dh)
 @viewport3 = Viewport.new(dx, dy, dw, dh)
 @viewport2.z = 50
 @viewport3.z = 100
 end
 
 #--------------------------------------------------------------------------
 # new method: update_viewport_sizes
 #--------------------------------------------------------------------------
 def update_viewport_sizes
 if Graphics.width > $game_map.width * 32 && !$game_map.loop_horizontal?
 dx = (Graphics.width - $game_map.width * 32) / 2
 else
 dx = 0
 end
 dw = [Graphics.width, $game_map.width * 32].min
 dw = Graphics.width if $game_map.loop_horizontal?
 if Graphics.height > $game_map.height * 32 && !$game_map.loop_vertical?
 dy = (Graphics.height - $game_map.height * 32) / 2
 else
 dy = 0
 end
 dh = [Graphics.height, $game_map.height * 32].min
 dh = Graphics.height if $game_map.loop_vertical?
 rect = Rect.new(dx, dy, dw, dh)
 for viewport in [@viewport1, @viewport2, @viewport3]
 viewport.rect = rect
 end
 end
 
 end # Spriteset_Map
 
 #==============================================================================
 # ■ Scene_Map
 #==============================================================================
 
 class Scene_Map < Scene_Base
 
 #--------------------------------------------------------------------------
 # alias method: post_transfer
 #--------------------------------------------------------------------------
 alias scene_map_post_transfer_ace post_transfer
 def post_transfer
 @spriteset.update_viewport_sizes
 scene_map_post_transfer_ace
 end
 
 end # Scene_Map
 
 #==============================================================================
 # ■ Game_Event
 #==============================================================================
 
 class Game_Event < Game_Character
 
 #--------------------------------------------------------------------------
 # overwrite method: near_the_screen?
 #--------------------------------------------------------------------------
 def near_the_screen?(dx = nil, dy = nil)
 dx = [Graphics.width, $game_map.width * 256].min/32 - 5 if dx.nil?
 dy = [Graphics.height, $game_map.height * 256].min/32 - 5 if dy.nil?
 ax = $game_map.adjust_x(@real_x) - Graphics.width / 2 / 32
 ay = $game_map.adjust_y(@real_y) - Graphics.height / 2 / 32
 ax >= -dx && ax <= dx && ay >= -dy && ay <= dy
 end
 
 end # Game_Event
 
 # Chama o método que realiza a mudança de tamanho
 # Graphics.fullscreen
 Graphics.resize_screen(800, 600)
 
 __END__
 # TESTES
 # Graphics.windowed
 x = Bitmap.new(50, 50)
 x.gradient_fill_rect(0,  0, 50, 25, Color.new(255, 0, 0), Color.new(0, 255, 0))
 x.gradient_fill_rect(0, 25, 50, 25, Color.new(0, 255, 0), Color.new(0, 0, 255))
 y = Plane.new
 y.bitmap = x
 y.zoom_x = 3
 y.zoom_y = 3
 #Graphics.fullscreen
 #Graphics.windowed
 loop do
 Graphics.update
 y.ox += 1
 y.oy += 1
 end
 | 
 |