====================
魔法开始窗口脚本
==============
#==============================================================================
# +++ MOG - Animated Title A (v1.1) +++
#==============================================================================
# By Moghunter
# http://www.atelier-rgss.com/
#==============================================================================
# Tela de titulo animado, com logo, imagens aleatórias e outros efeitos visuais.
#==============================================================================
# Nota - Serão necessários as seguintes imagens na pasta Graphics/Titles2/
#
#
# Firefly.png
# Logo.jpg (Opcional - Caso for usar o efeito logo.)
#
#==============================================================================
# Para definir a imagem de texto basta selecionar no banco de dados
# a imagem do titulo numero 2 (Segunda camada)
#
#==============================================================================
# 1.1 - Opção de pular o logo ao apertar alguma tecla.
# - Adição de comandos em pictures.
# - Adição de cursor de comando.
#==============================================================================
module MOG_SCENE_TITLE_A
#Definição das pictures.
RANDOM_PICTURES = ["画面1","画面2","画面3","画面4","画面5","画面6","画面7"]#,"liubei","攻城","guanyu","zhangfei","赵云","马超","黄忠","诸葛亮"]
#Tempo de duração para ativar a troca de imagens.
RANDOM_PICTURES_DURATION = 6#(sec)
#Seleção aleatória.
RAMDOM_SELECTION = true
#Posição do comando.
COMMANDS_POS =[220+10 , 280+105] #[220+150 , 280+50]
#Ativar Particulas.
FIREFLY = true
#Definição da posição do cursor.(Para ajustes)
CURSOR_POS = [-42+23,-5]
end
#==============================================================================
# ■ Window TitleCommand
#==============================================================================
class Window_TitleCommand < Window_Command
attr_reader :list
end
#==============================================================================
# ■ FireFly
#==============================================================================
class Firefly < Sprite
#--------------------------------------------------------------------------
# ● Dispose
#--------------------------------------------------------------------------
def dispose
super
self.bitmap.dispose
end
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
def update
super
self.x += @speed_x
self.y -= @speed_y
self.angle += @speed_a
self.opacity += 5
reset_setting if self.y < 0
end
end
#==============================================================================
# ■ Scene Title
#==============================================================================
class Scene_Title < Scene_Base
include MOG_SCENE_TITLE_A
#--------------------------------------------------------------------------
# ● Dispose Background2
#--------------------------------------------------------------------------
def dispose_background2
if @sprite2.bitmap != nil
@sprite2.bitmap.dispose
@sprite2.bitmap = nil
@sprite2.dispose
@sprite2 = nil
end
end
#--------------------------------------------------------------------------
# ● Dispose Light
#--------------------------------------------------------------------------
def dispose_light
return unless FIREFLY
if @light_bitmap != nil
for i in @light_bitmap
i.dispose
end
@light_viewport.dispose
@light_bitmap = nil
end
end
#--------------------------------------------------------------------------
# ● Terminate
#--------------------------------------------------------------------------
def terminate
super
dispose_background1
dispose_background2
dispose_light
@cursor.bitmap.dispose
@cursor.dispose
for com in @commands
com.bitmap.dispose
com.dispose
end
end
#--------------------------------------------------------------------------
# ● Update
#--------------------------------------------------------------------------
def update
super
update_initial_animation # 第一阶段update,第一阶段结束后不会再执行
update_command # 上面第一阶段结束后就会进行此第二阶段update
update_background
update_light
end
#--------------------------------------------------------------------------
# ● Update Cursor Position
#--------------------------------------------------------------------------
def update_cursor_position
@cursor.opacity += 5
execute_animation_s
execute_cursor_move(0,@cursor.x,@cursor_position[0] + @mx[1])
execute_cursor_move(1,@cursor.y,@cursor_position[1])
end
#--------------------------------------------------------------------------
# ● Execute Animation S
#--------------------------------------------------------------------------
def execute_animation_s
@mx[2] += 1
return if @mx[2] < 4
@mx[2] = 0
@mx[0] += 1
case @mx[0]
when 1..7; @mx[1] += 1
when 8..14; @mx[1] -= 1
else
@mx[0] = 0
@mx[1] = 0
end
end
#--------------------------------------------------------------------------
# ● Execute Cursor Move
#--------------------------------------------------------------------------
def execute_cursor_move(type,cp,np)
sp = 5 + ((cp - np).abs / 5)
if cp > np
cp -= sp
cp = np if cp < np
elsif cp < np
cp += sp
cp = np if cp > np
end
@cursor.x = cp if type == 0
@cursor.y = cp if type == 1
end
#--------------------------------------------------------------------------
# ● Update Background
#--------------------------------------------------------------------------
def update_background
@sprite2.opacity += 1
return if RANDOM_PICTURES.size == 1
@rand_title_duration -= 1
if @rand_title_duration <= 0
@sprite1.opacity -= 1
else
@sprite1.opacity += 1
end
return if @sprite1.opacity != 0
execute_random_picture
end
#--------------------------------------------------------------------------
# ● Execute Random Picture
#--------------------------------------------------------------------------
def execute_random_picture(initial = false)
@rand_title_duration = [[60 * RANDOM_PICTURES_DURATION, 9999].min, 60].max
if @sprite1.bitmap != nil
@sprite1.bitmap.dispose
@sprite1.bitmap = nil
end
if RAMDOM_SELECTION
rand_pic = rand(RANDOM_PICTURES.size)
if rand_pic == @old_back_index
rand_pic += 1
rand_pic = 0 if rand_pic >= RANDOM_PICTURES.size
end
@old_back_index = rand_pic
else
@old_back_index += 1 unless initial
@old_back_index = 0 if @old_back_index >= RANDOM_PICTURES.size
end
pic = RANDOM_PICTURES[@old_back_index]
@sprite1.bitmap = Cache.title1(pic)
end
#--------------------------------------------------------------------------
# ● Update Light
#--------------------------------------------------------------------------
def update_light
return unless FIREFLY
if @light_bitmap != nil
for i in @light_bitmap
i.update
end
end
end
#--------------------------------------------------------------------------
# ● Update Initial Animation
#--------------------------------------------------------------------------
def update_initial_animation
return if @phase != 1
# 判断是否初始阶段,初始阶段需要把菜单从左往右移动显示在窗口中间
# 如果不是初始阶段,那么以下的这一段把菜单从左往右移动的命令就不需要再执行
@phase_time -= 1 if @phase_time > 0 # 如果@phase_time>0,就会-1以计时此阶段
if @phase_time == 0 # 直到@phase_time==0,就是此阶段结束进入
@phase = 2 # 进入@phase = 2阶段
@phase_time = 30 # 同时@phase_time 重新计时
end
for i in @commands
index = 0
if i.x < COMMANDS_POS[0] # 判断命令是否在设定的X坐标的左边
i.x += 5 + (2 * index) # 如果是则会以+5的速度往右移动
i.opacity += 10 # 同时透明度会增加
if i.x >= COMMANDS_POS[0] # 如果命令移动到设定的坐标或右边
i.x = COMMANDS_POS[0] # 则把命令固定
i.opacity = 255 # 同时透明度提到最高
if @phase_time < 15 / 2 # 如果阶段时间小于15/2,就重置@phase_time
@phase_time = 15 # 即重新定义,或说是设置第一阶段持续的时间
end
end
end
index += 1 #索引+?然后循环的时候又置0?没懂
end
end
# 以上这个update做完一帧之后,就会接行下面这个 update_command
# 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
}
# 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
# 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
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)
# Ú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/index.php?/topic/3738-fps-display-isnt-very-accurate/#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[i]}
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
#==============================================================================
#--------------------------------------------------------------------------
# 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