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

Como substituir um script existente sem apaga-lo? apenas acrescentar comandos?

Iniciado por Riven, 12/02/2017 às 19:37

Olá pessoal, mudei a opacidade da janela da tela titulo (de entrada do jogo), funcionou perfeitamente,    @command_window.opacity = 0, só que coloquei comando dentro do script original, e queria saber se existe uma forma de ao invés de coloca-lo no original (de contamina-lo, com comandos customizados) se tem alguma forma de criar um script que utilize-todo o script do scene_title  e acrescente essa minha customização, mas SEM PRECISAR RECOPIAR O CODIGO INTEIRO do scene_title, ou seja, dá para criar  "script extensão" de um outro script sem que precise adicionar comandos no original?
RPG MAKER XP

Em ruby, existe um método chamado alias.

O alias serve basicamente, para você criar uma cópia de um objeto antes de substituir ele.

Em javascript, isso seria:
var metodoNovo = metodoAntigo;


Em ruby, isso seria:
alias metodo_novo metodo_antigo

ou:
alias :metodo_novo :metodo_antigo


Digamos que eu queira alterar o método start da classe Scene_Title em ruby sem reescrever o código todo:
class Scene_Title < Scene_Base

    alias :novo_start :start
    def start
        novo_start # Chamando o start antigo
        # Insira coisas aqui
        # Note que onde você usa o alias, é importante, visto que o método original será chamado antes
        # ou depois do seu código.
    end

end

Está dando erro, tentei com super e dá o mesmo erro também:
class Scene_Title  #tirei o < Scene_Base pq no rpg xp não tem.

    alias :main_n :main
    def main_n
        main # Chamando o start antigo
         @command_window.back_opacity = 0
 
    end

  end

test = Scene_Title.new
test.main_n


O erro é "disposed window"

com o super da o mesmo erro, criando uma classe com outro nome o erro persiste, tentei colocar dispose, continuou. E tentei colocar o super em baixo, mas ai fica com problema pois a inicialização da variavel tem que ser feita antes - pois é feita na classe original.

def main_n # O erro está aqui.
        main

Você não chama o main_n quando for definir o método, ao invés disso chama o método original e dentro dele chama o método novo.
Assim:
def main
        main_n # Chamando o método antigo

Está dando o mesmo erro.  Ao final do método main original o @comand_window chama o dispose, tem alguma maneira de colocar o comando entre a declaração da variavel mas ao mesmo tempo antes do dispose?

Obrigado.

Oh, sim. O Main do XP é a coisa mais horrível que eu já vi, ainda bem que corrigiram aquele código nas versões mais novas da engine :T

Ele cria um loop no main, um loop que dura até que você saia da tela de título.

Algo que resolveria teu problema, é o seguinte:
class Scene_Title

    alias :novo_main :main
    def main
        @finished_doing_my_stuff = false # Apenas como exemplo, tente não usar nomes muito longos para variáveis.
        novo_main
    end

    alias :novo_update :update
    def update
        run_my_stuff if @finished_doing_my_stuff == false
        novo_update
    end

    def run_my_stuff
        # Insira código aqui
        @finished_doing_my_stuff = true
    end

end


Isso é apenas uma gambiarra pra tentar resolver o problema. O código do RMXP é horrível mesmo.

Alisson, você resolveu brother!! Obrigado!!! Olha só, obs: antes da opacidade mudar para o valor que coloquei, parece que há uma especie de "delay" que mostra a opacidade da original (inicialmente na inicialização do game) então acrescentei Graphics.transition (não sei se isso é recomendável) e aparentemente "consertou" esse detalhe.
Citarclass Scene_Title

    alias :novo_main :main
    def main
        @finished_doing_my_stuff = false # Apenas como exemplo, tente não usar nomes muito longos para variáveis.
         Graphics.transition #para não mostrar a tela antes da opacidade ter sido mudada
        novo_main
    end

    alias :novo_update :update
    def update
        run_my_stuff if @finished_doing_my_stuff == false
        novo_update
    end

    def run_my_stuff
        @command_window.back_opacity = 0 #insira o codigo aqui
        @command_window.opacity = 0
       
        @finished_doing_my_stuff = true
    end

end

Interessante o que você escreveu sobre a engine XP, eu não sabia, agradeço pela ajuda Alisson, acho que entendi a lógica desse tal de alias e achei muito interessante a forma como você resolveu o problema do dispose com as condições de forma simples e clara. +++++ouro




Opa, fico feliz em saber que resolveu :D
Então, esse delay acontece pois nós alteramos a opacidade no update, e o update só é chamado depois do main.
Foi uma sábia ideia usar o Graphics.transition.
Daria pra resolver isso se estivéssemos trabalhando no Ace, mas como no XP ele cria um loop infinito no main, não tem muito o que possamos fazer xD
o/