O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[RPG Maker VX] Editando scripts sem sair do game

Iniciado por Resque, 13/08/2019 às 23:30

[RPG Maker VX] Editando 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




# 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



Isso é bem bom!

Dá uma ajuda ridiculamente alta para a edição do código, ainda mais com esse editor do rpg maker  :=|:

Como muita gente ainda usa o Ace acho que vai ser uma adição legal, bom trabalho mesmo!

14/08/2019 às 07:17 #2 Última edição: 14/08/2019 às 07:41 por Corvo
Esse foi um dos motivos para crucificarem o MV no início - fui um deles  :ded: - mas é realmente bastante útil. Acho até que seja uma boa prática, facilita pra fazer backup também. Obrigado por postar. o/