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

[Ruby] Removendo Incompatibilidade entre scripts

Iniciado por Raizen, 17/01/2013 às 18:23

17/01/2013 às 18:23 Última edição: 16/12/2015 às 10:33 por Raizen
Removendo incompatibilidade entre scripts

Nível: Iniciante

[box class=titlebg]
Introdução
[/box]
   Eu já pretendia escrever uma aula, porém escrever aulas de coisas que já foram passadas e repassadas fica muito cansativo e repetitivo... e com isso lembrei de algo que pode ser de extrema utilidade e que mesmo pessoas, com pouco conhecimento de Ruby ou de RGSS conseguem entender e resolver o maior problema entre scripts a incompatibilidade. Primeira coisa, com certeza vão faltar alguns modos de remover incompatibilidade, ou porque eu esqueci ou porque acabei deixando de lado por ocorrer menos vezes, então aqueles que conhecem outras coisas que trazem incompatibilidade entre scripts, eu gostaria que me mandassem mensagens para eu adicionar ao tópico.

   Lembre-se, esses modos de remover incompatibilidade entre scripts não são 100% eficazes, porque existem outras razões para incompatibilidade que vão além desses, porém da para resolver 80% dos casos de incompatibilidade entre scripts.

[box class=titlebg]
Qual conhecimento necessário para remover a incompatibilidade
[/box]

  No caso são poucas coisas em geral, sem me aprofundar, porque esse é um tutorial para pessoas com pouco conhecimento em RGSS ou Ruby conseguirem remover incompatibilidades, já que os scripters mais avançados conseguem entender o porque está acontecendo e como resolver.
  Apenas um conhecimento básico de variáveis, métodos e classes que vou dar uma breve explicação será necessário para entender o tutorial/aula.

[box class=titlebg]
Importante antes de tentar remover conflito entre os scripts
[/box]

  Antes de tentar qualquer coisa, tenha em mente os scripts que dão conflito para facilitar e muito o seu trabalho, abra um projeto novo e adicione script por script até ver quais estão dando conflito, assim você facilitará e muito corrigir o erro entre eles. Preste atenção também nos erros causados, recomendo essa aula para saberem os erros que podem acontecer entre os scripts.
http://www.mundorpgmaker.com/forum/index.php?topic=84788.0
Sabendo os erros, facilita muito corrigi-los.

[box class=titlebg]
Incompatibilidades
[/box]

[box class=errorbox]
classes iguais
[/box]
[box class=catbg3]   Talvez o mais facil e mais visível erro que pode acontecer, apesar de parecer incomum quando falamos que 2 scripters criaram uma classe e coincidentemente os 2 deram o mesmo nome para a classe, isso acontece e com uma boa frequencia. Porque?
Simplesmente porque o scripter busca a classe do qual ele vai lembrar e do qual facilita busca-lo. No caso coisas como
class Scene_Quest
ou
class Scene_Level
, são nomes de classes muito utilizados, logo... 2 scripts que apesar de não fazerem a mesma coisa podem dar conflito com isso, então a primeira coisa a ver é o nome das classes já que pode ser facilmente corrigido por exemplo colocando
Scene_Quest2
. Após mudar o nome da classe, utilize o famoso comando
Ctrl+F
para buscar o nome antigo da classe
Scene_Quest
e troca-los pelo novo nome. Isso ocorre bastante em scripts que mexem com coisas semelhantes como, skills, quests, e coisas do tipo, e é muito facil de corrigi-lo.[/box]

[box class=errorbox]
métodos iguais
[/box]
   [box class=catbg3]Quando 2 scripts ou mais mexem com o mesmo método da mesma classe pode gerar incompatibilidades.
Vou mostrar um exemplo.
class Scene_Map < Scene_Base
  def start
    super
    $game_map.refresh
    @spriteset = Spriteset_Map.new
    @message_window = Window_Message.new
    $Mini_hud = Luna_Hud.new
  end
end

Com outro script como esse
class Scene_Map < Scene_Base
  def start
    super
    $game_map.refresh
    @spriteset = Spriteset_Map.new
    @message_window = Window_Message.new
    $Mini_hud = Mini_Hud.new
  end
end

  Perceba que ambos os scripts não usam alias, para o que serviria o alias. O alias adiciona novas funções dentro do método sem ter que reescreve-lo, como ambos não utilizam essa ferramenta, eles reescrevem o método. Reescrevendo o método, apenas o ultimo adicionado que terá efeito, logo o $Mini_hud = Luna_Hud.new não funcionará,  já que o mesmo método foi reescrito pelo script adicionado, o que gera o famoso conflito entre os scripts. Erros como método não definido, ou variáveis não inicializadas são comuns. Como resolver esse erro,
para resolve-lo é bem simples, já que ele reescreve o método, no ultimo método apenas adicionar as linhas de comando que estavam faltando entre os 2 ou mais métodos iguais, e verificar se há outros scripts que usam métodos iguais.
  As vezes a reescrita do método, serviu para mudar a funcionalidade dele, então sempre deve ficar atento ao que foi retirado e adicionado do método. Existem scripts que não adianta apenas adicionar novas funções, elas tem que modificar as já existentes, ai no caso, quando um novo script baseado na função anterior é colocada, pode haver incompatibilidades.[/box]

[box class=errorbox]
Erros com variáveis
[/box]

[box class=catbg3]   Variáveis também causam erros principalmente as variáveis globais, as variáveis globais são aquelas precedidas por $, e elas como o nome diz podem ser acessadas por qualquer classe ou método. Muitos scripters, principalmente os iniciantes fazem um uso abusivo desse tipo de variável, porque? porque pelo fato de poder ser acessado de qualquer ponto facilita o trabalho, porém além de gerar possibilidade de conflitos, também não são recomendados por outras razões.
Oque acontece, como um exemplo, o script inicia a variável com uma String, para quem não sabe, é quando se armazena um texto na variável, ai o outro script trabalha com a mesma variável porém em números, Integer ou Float, logo a chance de dar um erro do tipo

é grande, existem inúmeros erros por isso fica difícil detectar se foi ou não causado por essa mesma variável. Como fica mais fácil de identificar, scripts com muitas variáveis globais tipo
$text $text2 $screen
nomes bem comuns, tem uma tendência a darem conflito com outros scripts. Obviamente não são apenas esses tipos de variáveis que podem dar problemas, por isso vou colocar uma lista entre as variáveis que tem maior impacto no sistema para o de menor.

Variáveis globais - precedidas por $, a variável é acessível dentro de qualquer estrutura do código.
Exemplo
$variavel

Constantes - precedidas por uma letra maiúscula, a costante é acessível globalmente caso não esteja ligado a uma classe ou um modulo, e por isso uma das funções do modulo, para que não seja acessível dentro de todas as classes e métodos.
Exemplo
Variavel
ou
VARIAVEL

Variáveis de classe - precedidas por @@, a variável é acessível dentro de uma mesma classe.
Exemplo
@@variavel

Variáveis de Instância - precedidas por @, a variável é acessível dentro de um mesmo objeto.
Exemplo
@variavel

Variáveis locais - precedidas por uma letra minuscula ou "_", ela é acessível dentro de um mesmo método.
Exemplo
variavel
ou
_variavel


Seguindo essa ordem de lógica da para descobrir se foi por causa de uma variável, lembre-se a tela de erros que o rpg maker retorna, é de extrema importancia para saber se foi causado por uma variável. Como resolver? descobrindo variáveis iguais, apenas troque o nome delas dentro de todo o script, usando a função Ctrl+F para encontrar e mudar todas as variáveis de um mesmo script.
  Esse erro pode não necessariamente retornar como um erro, as vezes ele pode retornar variáveis com valores errados, que causam "bugs" nos scripts. Então se houver algum erro de um retorno de uma variável, por exemplo, em um script de quest aparece um número bizarro para a quantidade de itens, pode-se imaginar que foi algo a ver com a variável. [/box]

[box class=errorbox]
métodos errados
[/box]

[box class=catbg3]   Para facilitar a vida do scripter, muitos obviamente pegam scripts já inclusos no rpg maker e modificam, isso causa muitas vezes alguns "bugs" quando múltiplos scripts forem usados, e é necessário um pouco mais de conhecimento de quem pretende corrigi-lo. Vamos supor, eu utilizo o método
draw_face
dentro do meu script, supondo que esse método seja apenas utilizavel no Menu, o scripter para facilitar a vida dele quer que apareça chars ao invés de faces, então ele edita esse próprio método. Utilizando outro script, que busca esse mesmo método pode acontecer erros de posições das imagens, e coisas do tipo, o que na realidade não é muito incomum, claro que dei apenas um exemplo, mas é frequente erros com métodos. Como corrigi-los:
   Dependendo do que foi modificado, o Rpg maker pode ou não retornar como um erro, sabendo o que está dando errado, textos, imagens... basta utilizar a função
Ctrl+Shift+F
, isso busca dentro de todos os scripts que tem, assim se der erro em algo a ver com a imagem das faces, da para buscar "face", e dar uma olhada no método original do rpg maker e no modificado. Esse erro já está mais para o intermediário, porque é necessário um pouco de conhecimento em RGSS para conseguir arrumar o método ou outro tipo de erro que não retorna uma janela de erro.
   Isso não são necessariamente métodos errados, mas um script baseado em um método que tem diferentes linhas de comando, pode acontecer erros. [/box]

[box class=errorbox]
Conclusão
[/box]
   Com certeza tem mais erros que são no minimo frequentes, eu gostaria se possivel de quem souber, lista-los aqui para eu adicionar a Aula, talvez esteja um pouco fraco ainda, porque tenho que ver os erros para explicar como arruma-los. Bom, mas é isso, espero que isso ajude principalmente aqueles que sabem pouco de RGSS, para corrigirem os scripts sem ter que ficar pedindo ajuda toda hora, espero ter ajudado, se for de grande ajuda, pretendo fazer uma aulinha para ensinar a converter scripts entre engines.