[RPG Maker VX] Editando os scripts sem sair do game
Olá pessoal! Tudo bem com vocês?
Hoje estou trazendo um Script chamado Scene_ResqueReload que criei para utilização nos meus projetos que estão no RPG Maker VX Ace.
O Motivo
Ao contrário de muitos Scripts que agregam novas funcionalidade ao jogo, esse script é usado como ferramenta que facilita o teste em tempo real da edição de código no RPG Maker VX Ace.
Muitas vezes é preciso ter uma resposta rápida se o código alterado está funcionando. Fica cada vez mais desgastante quando um erro acontece no script e você precisa de vários cliques na ferramenta para abrir o editor, editar o código, salvar as alterações e reiniciar o game.
Sempre achei limitante a utilização do editor de texto integrado que o RPG Maker disponibiliza para a alteração de código, pois existe uma grande variedade de editores de texto que proporcionam diversas ferramentas para nos ajudar nesses momento.
Eu gosto bastante de utilizar o Sublime Text para programar, ele tem diversos atalhos, mecanismos de busca e inúmeras ferramentas para edição de texto.
Outros editores de texto podem ser facilmente encontrados na Web, sejam eles pagos, gratuitos e até de código aberto. Utilizando esse Script, será possível que você utilize o editor de texto de sua preferência, seja ele Sublime, VIM, Atom, Notepad++, Visual Studio Code, etc...
A teoria
Basicamente, quando o game é iniciado, o script faz a leitura de um diretório dentro do seu projeto RPG Maker e faz o carregamento dos arquivos com extinção Ruby (.rb) para dentro do jogo.
Por padrão, o script está definido para ler a pasta "Scripts" do diretório raiz do seu projeto, essa pasta não existe por padrão, então você precisa criar manualmente e colocar os seus arquivos .rb dentro dela.
Já que estamos fazendo a leitura de um arquivo externo, é possível fazer um reload no código sem fechar o jogo, basta apertar a tecla "F5" do seu teclado quando estiver com o jogo aberto.
Isso permite que você altere o código no seu editor e veja a alteração no seu jogo sem precisar fechar o game!
A Prática
Para utilizar o script, basta criar a pasta "Scripts" dentro do diretório raiz do seu projeto Maker e criar os seus arquivos de script custom (.rb).
Após realizar o passo acima, você precisa abrir abrir o Editor de Texto padrão do RPG Maker e adicionar o Script Resque_Reload na ultima linha.
Pronto! Na próxima vez que você abrir o jogo, todos os arquivos .rb do diretório "Scripts" serão lidos automaticamente.
Os benefícios
Além da utilização de qualquer editor, o script permite que você utilize ferramentas de controle de versão como (Git, CVS, Subversion, Mercurial, etc...), para caso o seu computador exploda ou o seu jogo corrompa, você terá todo o seu código em um local seguro.
Além disso, sempre que você receber um erro de código, o seu jogo não vai mais ser fechado após aparecer essa mensagem:
Agora a mensagem de erro irá aparecer na tela de Debug, com muito mais informações sobre o erro, e o seu jogo irá automaticamente para a tela inicial (vocês poderão ver isso no vídeo abaixo)
O Código
O script permite algumas configurações sejam alteradas nas suas primeiras linhas:
- Nome da Pasta de leitura:
O nome padrão é "Scripts" mas pode ser mudado para qualquer outro (desde que a pasta esteja com o mesmo nome.)
- Tecla de Reload:
Por padrão o botão F5 faz o reload do jogo em tempo real, mas essa tecla pode ser mudada para outra de sua preferência.
Abaixo está o código fonte do script e a sua ultima versão no Github, além de um vídeo demonstrando o funcionamento do script, onde eu faço várias alterações em um script, mudando o nome exibido, o posicionamento e causando erros:
Em caso de dúvidas, estarei sempre por aqui, até mais pessoal!
https://github.com/rogesson/RGSSScripts/tree/ba0b7ef4fdfa8611645bdce2b419dc1d5e5565a2/Scene_ResqueReload
[youtube]https://youtu.be/0U8TE9uoQ1k[/youtube]
Código:
# Name: Resque Reload
# Autor: Resque
# Email: rogessonb@gmail.com
# Engine: RPG Maker VX
# Created At: 13/08/2019
class Scene_Base
RELOAD_BUTTON = :F5
SCRIPT_PATH = "Scripts"
FULL_PATH = "#{File.expand_path(Dir.pwd)}/#{SCRIPT_PATH}/*.rb"
DEBUG_MODE = true
def main
start
post_start
update until scene_changing?
pre_terminate
terminate
rescue Exception => e
reload_with_error(e)
end
def update
update_basic
reload if Input.trigger?(RELOAD_BUTTON)
end
def reload
puts "Reload Button [#{RELOAD_BUTTON}] was pressed"
puts "Reloading the Code..."
Scene_Base.load_files
call_current_scene
nil
end
def self.load_files
puts "Loading Files..."
dirs = Dir[Scene_Base::FULL_PATH]
failed = []
dirs.each do |dir|
Dir[dir].each do |file|
begin
class_name = file.split("/").last[0..-4]
autoload class_name, file
load(file)
puts "#{class_name} Loaded" if Scene_Base::DEBUG_MODE
rescue NameError => e
failed << { class_name: class_name, file: file }
next
end
end
end
self.retry_failed_files(failed)
puts "Load completed"
end
def reload_with_error(e)
error_message(e)
SceneManager.call(Scene_Title)
end
private
def self.retry_failed_files(failed_files)
failed_files.each do |f|
autoload f[:class_name], f[:file]
load(f[:file])
puts "#{f[:class_name]} Loaded" if Scene_Base::DEBUG_MODE
end
end
def error_message(e)
puts "-----------------------\nERROR: #{e} \n-> #{e.backtrace}\n-----------------------"
end
def call_current_scene
puts "#{self.class} Reloaded"
SceneManager.call(self.class)
end
end
Scene_Base.load_files