Dicas de RUBY para RGSS
- Para acompanhar e entender estas dicas, será necessário um conhecimento, no mínimo, básico, sobre RGSS.
Capítulo 1 – Do Ruby para o RGSS: Uma BREVE introdução
Sendo RGSS um acrônimo para Ruby Game Scripting System, torna-se óbvio de que muito do Ruby tem que estar presente, também, no RGSS. E isso, além de ser bom para quem já sabe a linguagem, é bom para quem não sabe.
Por que, você deve me perguntar. De cara, posso dar uma resposta: o suporte. Enquanto dúvidas com classes como Scene_Map ou módulos como RPG::Cache só podem ser respondidas por alguém que entenda do RGSS, dúvidas baseadas em tipos de dados e funções nativas do Ruby podem ser respondidas por qualquer pessoa que conheça a linguagem original – que mesmo que não seja uma linguagem tão utilizada, tem de longe mais usuários que o RGSS. Outro fator positivo para o sistema de scripts do Rpg Maker XP ser baseado em Ruby é que esta é uma linguagem muito mais simples do que outras como C++ ou Java, e embora seja bem menos poderosa em questões de baixo nível, ela é bastante eficiente para o que o Rpg Maker propõe.
Sempre que surgir alguma dúvida em códigos mais baixo nível, tente resolver seus problemas usando ohttp://www.ruby-doc.org.
Capítulo 2 – Códigos úteis do Ruby, por tipos de Dados
.:Vetores (ou Arrays):.
Para criar um vetor unidimensional, o método mais prático é usando o código:
my_array = []
Para adicionar elementos, pode-se utilizar várias maneiras :
my_array[0] = “eu”
my_array[1] = “me”
my_array[2] = “chamo”
my_array[3] = “thersus”
my_array[5] = “pulei”
Desta forma, teremos um vetor de seis posições, sendo que a posição [4] estará sem valor (nil). Atribuir valor por valor assim não faz muito sentido e é cansativo, por isso seria melhor fazer desta forma, na necessidade de definir todos os elementos logo na criação do vetor:
my_array = [“eu”, “me”, “chamo”, “thersus”, nil, “pulei”]
Nos dois códigos, o vetor final será o mesmo.
Mas então, para que serve a primeira forma? Em primeiro lugar, para quando se precisa mudar uma posição exata. Por exemplo, depois de já ter o vetor determinado, preciso que a terceira posição seja zerada. Então, o mais prático seria usar:
my_array[2] = 0
Outra utilidade de determinar o valor pela posição do vetor é que a posição pode ser uma variável. Então, dessa forma, podemos, por exemplo, ter um vetor onde guardaremos o nome de um personagem, de acordo com o nível dele. Desta forma, poderíamos ter uma lista que mostrasse qual personagem do jogo está em cada nível. Para fazer isso, poder-se-ia usar algo como :
vetor_nivel[personagem.nivel] = personagem.nome
Veja que a posição não é mais um numero exato, e sim o nível do personagem. Não precisamos primeiro verificar o nível e depois criar inúmeras condições para poder atribuir os valores.
Mas agora, digamos que nós precisamos verificar personagem por personagem da lista do database, mas adicionar num vetor apenas os que tem o nível maior que 50? Vamos por partes...
Primeiro, para percorrermos toda a lista, podemos usar o nosso velho amigo for. O for serve, basicamente, para duas coisas: A primeira, para repetir ações que sigam uma ordem direta entre um número e outro, como calcular a raiz quadrada de todos os números entre 10 e 50. A outra, para executar uma mesma ação para todos os elementos de um vetor (o que em outras linguagens seria o comando foreach).
for actor in $data_actors
end
ou
for i in 1..$data_actors.size
end
Os códigos acima servem apenas para executar uma mesma ação para cada elemento do vetor $data_actors, ou seja, cada personagem no database. Na segunda forma, para adicionarmos o nome de cada personagem para um vetor, poderíamos usar simplesmente :
my_array = $data_actors.name
Note que i sempre irá mudar, indo de 1 até o último personagem do database. Então, para o quinto personagem, i será 5, e o elemento número 5 do vetor será o nome do personagem.
Porém, um problema que está presente tanto na primeira forma, quanto na segunda, é o fato de não podermos nos basear pela posição. Na primeira forma, o código executa a ação para cada elemento do vetor, mas não há como informar a posição que o for está para o vetor. Na segunda forma, irá tudo muito bem, mas como queremos incluir somente os personagens com nível maior que 50, no momento que um deles for menor, irá ficar um buraco no vetor. Se ele for novo, poderemos apagar esses buracos, mas se precisarmos mudar o mesmo vetor, fazendo essa verificação novamente, os valores poderão mudar, e apagar os valores inexistentes poderá não ser mais eficiente.
my_array.clear
for actor in $data_actors
if actor.level > 50
my_array.push(actor.name)
end
end
O primeiro comando,.clear, irá apagar o vetor, por que como iremos adicionar valores no final do vetor, se executarmos o código várias vezes durante o programa, o vetor estará sempre maior, apenas se repetindo.
O comando if actor.level > 50 verifica se o nível do personagem é maior que 50. Note que usamos apenas actor. Quando usamos o for com o sentido de foreach, o nome que colocamos logo após o for vai ser usado no lugar do vetor de teste. Ou seja, seria o mesmo que $data_actors.level , no outro código.
O comando my_array.push(actor.name) está adicionando o nome do personagem, que está dentro dos parênteses, para o último elemento do vetor my_array.
Até aqui, está tudo bem. Mas, e digamos que precisamos fazer algo bem parecido, só que somente com os personagens que tenham imunidade a fogo?
Bom, sabemos que no RGSS, as imunidades estão dentro de um vetor chamado element_set, para os personagens, itens e armas, e guard_element_set para armaduras e escudos. Mas como esses vetores podem variar conforme as imunidades do personagem, como saber se o fogo está incluído nelas? Primeiro, vamos supor que na lista de atributos do database, a imunidade ao fogo seja a de id 15.
actor = $game_party.actors[0]
if actor.element_set.include?(15)
my_array.push(actor.name)
end
Na primeira linha, estou definindo o personagem. $game_party é um objeto que guarda todas as informações do grupo, e dentro dele o vetor actors[] guarda os personagens. Ou seja, $game_party.actors[0] aponta para o personagem que você estiver controlando no momento.
Mas o ponto que queríamos chegar é na linha abaixo: o comando .include?(15) verifica se dentro do vetor, há pelo menos um elemento igual ao que está inserido nos parênteses. Da mesma forma, no exemplo anterior, onde tínhamos um vetor apenas com personagens acima do nível 50, podemos verificar se o personagem Duaen está entre esses personagens com o código:
if my_array.include?(“Duaen”)
do_something
end
Tudo bem. Mas e se quisermos ir mais longe? Queremos fazer alguma espécie de estatística, e para isso, queremos um vetor onde estejam incluídos todos os atributos de cada personagem, exceto a imunidade ao fogo, e queremos que o vetor tenha apenas um elemento para cada atributo que possa vir a se repetir.
De início, podemos adicionar os vetores dos atributos dos personagens inteiros dentro do vetor principal. Por exemplo, temos 3 personagens, cujas imunidades pelos IDs seriam:
a = [1, 3, 15, 4]
b = [1,2,6]
c = [13, 15]
Poderíamos usar o .push() para inserir os vetores dentro do vetor, que daria como resultado:
my_array = [[1,3,15,4],[1,2,6],[13,15]]
O problema é que ter vetores dentro de vetores não é bom para trabalhar do modo como queremos. Então, o melhor a fazer é usar um comando que pegue esses vetores e jogue os elementos direto para o vetor principal. Podemos usar dois comandos, cada um para um fim diferente:
array2 = my_array.flatten
ou
my_array.flatten!
O primeiro comando é útil para o caso de que seja necessário manter o vetor original. Dessa forma, teremos dois vetores:
my_array = [[1,3,15,4],[1,2,6],[13,15]]
array2 = [1,3,15,4,1,2,6,13,15]
Dessa forma, se for necessário apagar os atributos de um personagem, pode-se deletar um dos vetores internos por completo. Para fazer isso, pode-se usar o comando .delete_at(pos), onde pos é o numero da posição que será apagada.
my_array.delete_at(0)
print my_array # [1,2,6][13,15]
O segundo caso, .flatten!, irá modificar o próprio vetor, por isso não será mais possível ter acesso aos grupos separados de atributos.
Porém, ainda temos o atributo 15, imunidade ao fogo, e os elementos repetidos (1). Para apagar um elemento, podemos usar o seguinte código:
my_array.delete(15)
Enquanto o delete_at apagava uma posição, o delete irá apagar todos os elementos iguais ao que estiver dentro dos parênteses.
Por final, para tirar todos os elementos repetidos, podemos usar o comando .uniq, ou .uniq!. A lógica é a mesma do flatten, sem exclamação serve para manter a original, com serve para modificar ela mesma.
my_array.uniq!
print my_array #[1,3,4,2,6,13]
Para nossas estatísticas, nós ainda queremos saber quantos atributos diferentes temos no vetor, e deixá-los em ordem para caso seja necessário. Para isso, podemos usar as seguintes linhas:
quantidade = my_array.size
my_array.sort!
A primeira linha define o tamanho do vetor para uma variável, a segunda organiza o vetor em ordem numérica crescente.
Outros comandos interessantes que podem ser usados com vetores, são os comandos .max e .min. Com eles, você pode ver qual o maior elemento e o menor elemento de um vetor, sem ter que organizar com o sort.
maior = my_array.max # 13
menor = my_array.min # 1
valor = [my_array.max, 150].min # [13, 150].min >> 13
Uma brincadeira interessante pode ser feita usando vetores, os comandos de min e max, e o comando rand(). O comando rand(n) irá gerar um valor aleatório, entre 0 e um número menos que n.
Vamos agora fazer uma brincadeira com dados. O jogador irá jogar 6 dados, que terão seus valores guardados num vetor. Depois, serão escolhidos o menor e o maior valor tirados, e a se a soma dos dois der 7, o jogador vence.
Primeiro, crie um evento qualquer no Rpg Maker XP. Vá na terceira aba, e clique em Chamar Script. Digite o código abaixo:
print ("Iremos jogar dados agora")
dados = []
for i in 0...6
dados = rand(6)+1
print ("o dado ", i, " deu o valor " ,dados)
end
print ("o maior valor tirado foi ", dados.max)
print ("e o menor foi ", dados.min)
print ("sua pontuação foi ", dados.max+dados.min, " e você")
if dados.max+dados.min == 7
print ("ganhou!")
else
print ("perdeu =[")
end
Os comandos print() escrevem textos em janelinhas splash.
O comando rand(6) gera um numero entre 0 e 5, por isso que é adicionado 1 logo após, porque queremos dados que vão de 1 até 6.
Os outros comandos são todos simples e conhecidos. O jogo é bastante simples, não usa nenhum grande recurso do Rpg Maker XP, mas serve para fixar o conteúdo aprendido nesse tutorial, e após pouco estudo, pode ser facilmente implementado com gráficos e interação maior com eventos e etc.
Therefore, the screw oil press has always been the most used. Many new factories have seen the market prospects of screw presses and have joined the ranks of production and sales. Some users buy screw oil presses and have insufficient power. Insufficient power will not only affect the use effect but also cause damage to the machine.
The performance of insufficient power of the screw oil press is mainly due to the frequent problems of the machine, such as the frequent jamming of the machine. If in the case of production, encounter such a situation, the output is reduced, the maintenance of equipment and other situations, the waste of time and money is a big loss. Such machines are often of substandard quality. Screw oil press equipment with lack of power, and also caused a serious oil spill.
In the calculation, if 100 kg of oil is used, it will cause 15 kg of oil to pass, and the possible loss will be about 15%. Every loss caused by oil manufacturers cannot be underestimated. Power shortage equipment, it will lead to a significant reduction in output. The lack of power also leads to the wear and tear of equipment components. Rapeseed screw oil press bearings, squeezing, will cause a certain impact.
Generally speaking, the power of the new oil press machine is lower than that of the old oil press. Compared with the old 95 machine, it uses an 11kw motor. The new type is equipped with a 7.5kw motor. But the output has not decreased. There will be no lack of motivation. The new screw oil press designs and transforms the machine, and produces and updates equipment to adapt to social development.
Thanks for sharing this information. I really like your blog post very much. You have really shared a informative and interesting blog post with people.. Slot pg
Recently, I have commenced a blog the info you give on this site has encouraged and benefited me hugely. Thanks for all of your time & work. तुर्की वीजा ऑनलाइन आवेदन
pg The latest with a game system designed for direct pg slot players because the game format is very advanced, can play pg slot auto via ios and android systems, supports playing pg slots via mobile Deposit-withdraw automatically in just 8 seconds
ฝาก50รับ150 No need to turn or call each other easily understood is a promotion, deposit 50, get 150 wallet, is another promotion that many people like and think that it is a worthwhile promotion.
เครดิตฟรี No deposit required is something that online gambling sites. free credit slots pg There is a reward for the members of the web. free credit slots no deposit will be able to play free slots all within the web
joker game Direct web slots, not through agents online gambling games The most legendary casino game Stuck in one of the 5 most popular slot game camps. With more than 150 games to choose from, Joker Slot
โจ๊กเกอร์ Direct web slots, not through agents online gambling games The most legendary casino game Stuck in one of the 5 most popular slot game camps. With more than 150 games to choose from, Joker Slot
โรม่า Direct web slots, not through agents online gambling games The most legendary casino game Stuck in one of the 5 most popular slot game camps. With more than 150 games to choose from, Joker Slot
ฝาก20รับ100 A promotion that many people like and think that it is a worthwhile promotion.
19รับ100 Slot deposit 19 get the latest 100 2021 is a new pro slot and the strongest of the year Appealing to slot spinners with low budget who want to take money 19 baht to exchange money in the amount of 100 baht, which is considered very worthwhile because the promotion deposit 19 receives 100 unlimited withdrawals
Slot 888 The number 1 online slot game in Thailand, slot 888 online that includes the 888 slot game camp to play more than 300 games.
สล็อต 888 The number 1 online slot game in Thailand, slot 888 online that includes the 888 slot game camp to play more than 300 games.
ทดลองเล่นสล็อต Slots Free Trial Playable Withdrawable Free Trial Playable Withdraw Real Money Free credit to play slots Terms and conditions are as specified by the website.
pg game online slot games Which is popular as No. 1 now, deposit-withdraw via the auto system.
Wow, What a Excellent post. I really found this to much informatics. It is what i was searching for.I would like to suggest you that please keep sharing such type of info.Thanks ผลบอลสด888
According to an experiment conducted by the National Institute of Disaster and Safety by reproducing road conditions at Gangnam Station in Seoul in the past, it took only 41 seconds for a 40kg manhole lid to rise 26cm above the heavy rain of 50mm per hour. However, at the time of the accident in Seocho-dong, more than 120mm of heavy rain fell per hour. You can guess that all the manholes on the road have turned into "mining fields."코인사다리