Visitante!
Faça seu Login ou Registre-se!

Galeria de Jogos

Aula Ativa de Ruby/RGSS e outras linguagens de programação 47 Respostas | 6823 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Alucard_2

  • *
  • Mensagens: 112 Ouro: 75
  • Confesso que estou tendo um caso com o Nandik
    • RPG Maker XP
    • Facebook
    • Youtube
    • Ver perfil
    • E-mail
Re: Aula Ativa de Ruby/RGSS
Resposta 30 Online: 03 Dez 2014, 10:54
Well, como posso dizer...
A questão do que o $ vai alterar se refere mais a, em palavras simples, "onde a variável existe". I.e.:
Código: [Selecionar]
class Classe
  def initialize
    $var = 5
    @var = 10
    var = 15
  end
  def algo
    p $var # => 5
    p @var # => 10
    p var # => nil
  end
end
p $var # => 5
p @var # => nil
p var # => nil

Perceba que $var existe em todo lugar, dentro ou fora de classes ou métodos (mesmo que declarada dentro da classe), e alterando ela, essa alteração acontece em todos os $var. Chamamos esse tipo de variável de "global".
Agora @var foi declarada na classe "Classe". Logo ela vai existir apenas dentro dessa classe, e não fora dela. E alterando o valor de @var, essa alteração acontece para todos os @var dentro da classe "Classe". Chamamos esse tipo de variável de "atributo".
E por fim var foi declarada dentro de um método, e portanto só vai existir dentro dele. Alterando o valor de var vai alterar apenas dentro do método, mas não fora. Chamamos esse tipo de variável de "local".

No caso, usando soma($variavel_a, $variavel_b) irá enviar os valores de $variavel_a e $variavel_b para serem usados como x e y em "soma". Porém elas precisam ser já declaradas antes, do contrário você vai enviar "nil" como x e y, e logo dará erro em "soma = x + y" por conta de tentar somar dois "nil"s.

Se você quiser utilizar o resultado da soma, por exemplo, precisaria de um "return soma" no final do método, e assumir a uma variável. E.g:
Código: [Selecionar]
def soma(x, y)
  soma = x + y
  p soma
  return soma
end
var = soma(3, 2)
p var # => 5
val1 = 10
val2 = 4
var = soma(val1, val2)
p var # => 14
p val1 # => 10
p val2 # => 4
$val1 = 1
$val2 = 2
$var = soma($val1, $val2)
p $var # => 3
p $val1 # => 1
p $val2 # => 2

Tente testar cada um dos {code}{/code} que deixei nesta e na outra mensagem e ver as diferentes "reações" que o script possui. Se você quiser, no caso, utilizar os valores de x e y globalmente, pode fazer algo como:
Código: [Selecionar]
def soma(x, y)
  soma = x + y
  $x = x
  $y = y
  p soma
end

p $x # => nil
p $y # => nil

soma(3, 2)

p $x # => 3
p $y # => 2

Sugestão de leitura: https://www.youtube.com/watch?v=Gah8FnYSypk&list=TLO-4ET0PK3ck&index=5
« Última modificação: 09 Jan 2015, 14:37 por Alucard_2 »
RPG Maker Brasil.net Está de Volta!!! > http://www.rpgmakerbrasil.net/forum

Avatar by: Driko

http://i.imgur.com/cHNwiLZ.png

Lincoln

  • *
  • Mensagens: 168 Ouro: 203
  • Só tem o direito de criticar quem pretende ajudar.
    • Facebook
    • Ver perfil
  • Escudo CRM
Re: Aula Ativa de Ruby/RGSS
Resposta 31 Online: 09 Jan 2015, 11:15
Como o Raizen não quer que eu encha o saco dele no Facebook, vou postar aqui.

Queria saber porquê a HUD não aparece na tela.

Código: [Selecionar]
class Lincoln < Scene_Base
  include LINCOLN_HUD
  alias lincoln_update update
  alias lincoln_update dispose
  def initialize
    @hud_hp = Bitmap.new(HUD_WIDTH - 10, HP_Y - HUD_Y)
    @hud_mp = Bitmap.new(HUD_WIDTH - 10, HUD_Y - MP_Y)
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    @hud_hp = Viewport.new(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y)
    @hud_mp = Viewport.new(MP_X, MP_Y, HUD_WIDTH - 10, MP_Y - HUD_Y)
    @hud_hp = Sprite.new(@hud_hp)
    @hud_hp.z = 999
    @hud_mp.z = 999
  end
  def lincoln_update
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    super
  end
end
"Pode-se enganar a todos por algum tempo; pode-se enganar alguns por todo o tempo; mas não se pode enganar a todos todo o tempo."

Ei, você, você mesmo! Tá afim de ver um projeto legal? Clica embaixo!


Alucard_2

  • *
  • Mensagens: 112 Ouro: 75
  • Confesso que estou tendo um caso com o Nandik
    • RPG Maker XP
    • Facebook
    • Youtube
    • Ver perfil
    • E-mail
Re: Aula Ativa de Ruby/RGSS
Resposta 32 Online: 09 Jan 2015, 11:53
Well, comecemos então.

Primeiro:
Código: [Selecionar]
  alias lincoln_update update
  #[...]
  def lincoln_update
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    super
  end

Aqui você copiou o método "update" para "lincoln_update", e depois reescreveu o lincoln_update, ou seja...é como se não tivesse feito nada, o "update" continua intacto. A ideia é fazer:
Código: [Selecionar]
  alias lincoln_update update
  #[...]
  def update # reescrever o "update", não o "lincoln_update"
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    lincoln_update # chamar o lincoln_update, que seria o "update" original
  end

Outro detalhe é que para uma Sprite ser exibida (e atualizada), precisa chamar o método "update" delas. Portanto o def update fica:

Código: [Selecionar]
  def update # reescrever o "update", não o "lincoln_update"
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    @hud_hp.update
    lincoln_update # chamar o lincoln_update, que seria o "update" original
  end

Agora, se pensarmos bem, você está criando a classe Lincoln, certo? No sentido de que não existia uma outra classe de mesmo nome antes, logo, não faz sentido dar um alias, já que não está substituindo algo que já havia sido criado numa classe Lincoln, só está sobrescrevendo algo da classe-Pai (Scene_Base) dela, certo? Então, em vez de criar aliases, pode só chamar "super" no final do método. O "super" vai chamar o mesmo método na classe-Pai. Assim:

Código: [Selecionar]
class Lincoln < Scene_Base
  include LINCOLN_HUD
  def initialize
    @hud_hp = Bitmap.new(HUD_WIDTH - 10, HP_Y - HUD_Y)
    @hud_mp = Bitmap.new(HUD_WIDTH - 10, HUD_Y - MP_Y)
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    @hud_hp = Viewport.new(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y)
    @hud_mp = Viewport.new(MP_X, MP_Y, HUD_WIDTH - 10, MP_Y - HUD_Y)
    @hud_hp = Sprite.new(@hud_hp)
    @hud_hp.z = 999
    @hud_mp.z = 999
    super # chama o initialize da Scene_Base
  end
  def update
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    @hud_hp.update
    super # chama o update da Scene_Base
  end

  def dispose
    super # chama o dispose da Scene_Base
  end
end

Creio que agora deva funcionar.



Complemento 1: Lembre-se de sempre limpar o bitmap, para que ele não fique com o conteúdo da última atualização (no caso, em um frame o HP do herói era 18, um frame depois ele ficou com 6, e em seguida 9. Assim, a sua janela escreveria o 18, e, com ele ainda ali, escreveria um 6 e um 9 em cima). Ou seja, seu método update deve ser:
Código: [Selecionar]
  def update
    @hud_hp.bitmap.clear
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    @hud_hp.update
    super # chama o update da Scene_Base
  end

Complemento 2: evite escrever textos a cada frame. Faça alguma comparação, como...
Código: [Selecionar]
  def update
    if @ultimo_hp != $game_party.members[1].hp # mudou o HP?
      @hud_hp.bitmap.clear
      @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"{$game_party_members[1].hp}")
      @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"{$game_party_members[1].mp}")
    end
    @ultimo_hp = $game_party.members[1].hp # Atualiza o último valor do HP
    @hud_hp.update
    super # chama o update da Scene_Base
  end

Complemento 3: É $game_party.members, não $game_party_members ;) No caso, $game_party é a variável da classe Game_Party, e nessa variável existe um grupo chamado "members".

Perguntinha: você chamou SceneManager.call(Lincoln) para testar a sua Scene?



Off: eu me pergunto se o Van viu (hah, "vanviu") meu post :v Ah, deve ter sido ele quem deu ouro.
« Última modificação: 09 Jan 2015, 12:04 por Alucard_2 »
RPG Maker Brasil.net Está de Volta!!! > http://www.rpgmakerbrasil.net/forum

Avatar by: Driko

http://i.imgur.com/cHNwiLZ.png

Lincoln

  • *
  • Mensagens: 168 Ouro: 203
  • Só tem o direito de criticar quem pretende ajudar.
    • Facebook
    • Ver perfil
  • Escudo CRM
Re:  Aula Ativa de Ruby/RGSS
Resposta 33 Online: 09 Jan 2015, 13:03
@Alucard_2

Pior que não deu certo não, a hud continua sem aparecer. Eu já tentei chamar usando Lincoln.new, e usando SceneManager.call(Lincoln), nenhum dos dois funciona.

Código: [Selecionar]
module LINCOLN_HUD
  # Posição X da Hud
  HUD_X = 200
  # Posição Y da Hud
  HUD_Y = 50
  # Largura da Hud
  HUD_WIDTH = 110
  # Altura da Hud
  HUD_HEIGHT = 110
  # Posição do X do HP
  HP_X = 210
  # Posição do Y do HP
  HP_Y = 60
  # Posição X do MP
  MP_X = 110
  # Posição Y do MP
  MP_Y = 100


end

#==============================================================================
# ** Lincoln
#------------------------------------------------------------------------------
#  Esta classe gerencia a criação, atualização e disposição da Hud.
#==============================================================================
class Lincoln < Scene_Base
  include LINCOLN_HUD
  def initialize
    @hud_hp = Bitmap.new(HUD_WIDTH - 10, HP_Y - HUD_Y)
    @hud_mp = Bitmap.new(HUD_WIDTH - 10, HUD_Y - MP_Y)
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"#{$game_party.members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"#{$game_party.members[1].mp}")
    @hud_hp = Viewport.new(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y)
    @hud_mp = Viewport.new(MP_X, MP_Y, HUD_WIDTH - 10, MP_Y - HUD_Y)
    @hud_hp = Sprite.new(@hud_hp)
    @hud_mp = Sprite.new(@hud_mp)
    @hud_hp.z = 999
    @hud_mp.z = 999
    super # chama o initialize da Scene_Base
  end
  def update
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HP_Y - HUD_Y,"#{$game_party_members[1].hp}")
    @hud_hp.draw_text(HP_X, HP_Y, HUD_WIDTH - 10, HUD_Y - MP_Y,"#{$game_party.members[1].mp}")
    @hud_hp.update
    super # chama o update da Scene_Base
  end

  def dispose
    super # chama o dispose da Scene_Base
  end
end

Lincoln.new

Te enviei o script por completo.

E o script agora está dando erro, $game_party.members[1].hp não é correto, vou ver se encontro a variável correta xD

Off: eu me pergunto se o Van viu (hah, "vanviu") meu post :v Ah, deve ter sido ele quem deu ouro.

Fui eu. :V
"Pode-se enganar a todos por algum tempo; pode-se enganar alguns por todo o tempo; mas não se pode enganar a todos todo o tempo."

Ei, você, você mesmo! Tá afim de ver um projeto legal? Clica embaixo!


Alucard_2

  • *
  • Mensagens: 112 Ouro: 75
  • Confesso que estou tendo um caso com o Nandik
    • RPG Maker XP
    • Facebook
    • Youtube
    • Ver perfil
    • E-mail
Re: Aula Ativa de Ruby/RGSS
Resposta 34 Online: 09 Jan 2015, 13:22
well, essa classe nao pode ser chamada logo depois de ser criada, pois os dados ainda nao foram criados ($game_party, por exemplo), chame o SceneManager.call por um evento no mapa.
RPG Maker Brasil.net Está de Volta!!! > http://www.rpgmakerbrasil.net/forum

Avatar by: Driko

http://i.imgur.com/cHNwiLZ.png

mrMiojo

  • *
  • Mensagens: 12 Ouro: 0
  • Projeto de Scripter
    • Unity
    • Ver perfil
Re: Aula Ativa de Ruby/RGSS
Resposta 35 Online: 01 Mai 2015, 18:56
Pergunta...Pra que serve o:
Código: [Selecionar]
seiquela.each { |sql| seiquela} ?
Espaço RPG Maker
  (clique na imagem abaixo)

King Gerar

  • *
  • Mensagens: 3420 Ouro: 2522

    Vencedores do Protótipo Premiado Participantes do Maps Together 2

  • I am with the Force and the Force is with me
    • RPG Maker MV
    • Facebook
    • Steam
    • DeviantArt
    • Pinterest
    • Ver perfil
Re: Aula Ativa de Ruby/RGSS
Resposta 36 Online: 01 Mai 2015, 20:03
Do jeito como descreveu, acho que serve bem demais pra dar bug. Poréeeeeeem, por exemplo:
Código: [Selecionar]
números = [ 2, 4, 6]
a = números.each { |n| 5 * n}
O método each faz com que cada valor da array números seja executado na expressão entre as chaves.
Ou seja, todos os valores contidos em números ocupará o lugar de n e será multiplicado por 5, sendo assim:

Código: [Selecionar]
a = [10, 20, 30]Eu acho que é isso, não tenho absoluta certeza.

Conheça meu projeto! :)


Masked

  • *
  • Mensagens: 606 Ouro: 609

    Vencedor CRM Awards - Melhor Scripter

    • RPG Maker VX/Ace
    • Ver perfil
  • Anel de RubiSpiked MailColossusHeimhelmNightwalker
Re: Aula Ativa de Ruby/RGSS
Resposta 37 Online: 01 Mai 2015, 20:54
Tá mais ou menos certo, king, isso aí é o .collect quem faz, o .each executa um bloco de código pra cada elemento de uma coleção e o .collect transforma eles de acordo com o retorno do bloco:
Código: [Selecionar]
a = [2, 3, 4]
a.each {|i| print i} #=> 234
p a.collect {|i| i * 5} #=> [10, 15, 20]

mrMiojo

  • *
  • Mensagens: 12 Ouro: 0
  • Projeto de Scripter
    • Unity
    • Ver perfil
Re: Aula Ativa de Ruby/RGSS
Resposta 38 Online: 06 Mai 2015, 10:27
Então o collect tem a mesma função de:
Código: [Selecionar]

for i in a
p i  * 5
end #=> ?
Espaço RPG Maker
  (clique na imagem abaixo)

Masked

  • *
  • Mensagens: 606 Ouro: 609

    Vencedor CRM Awards - Melhor Scripter

    • RPG Maker VX/Ace
    • Ver perfil
  • Anel de RubiSpiked MailColossusHeimhelmNightwalker
Re: Aula Ativa de Ruby/RGSS
Resposta 39 Online: 06 Mai 2015, 11:25
Não. O .collect retorna uma nova array com os valores retornados pelo bloco para cada elemento antigo, serve para pegar os ids de todos os personagens numa array de personagens, tente chamar um script call assim, por exemplo:
Código: [Selecionar]
p $game_party.members.collect {|actor| actor.id}Seria o equivalente a isso:
Código: [Selecionar]
a = []
for actor in $game_party.members
  a.push(actor.id)
end
p a

O que você fez aí é o .each, na verdade o que o for faz é chamar o .each internamente mesmo.

mrMiojo

  • *
  • Mensagens: 12 Ouro: 0
  • Projeto de Scripter
    • Unity
    • Ver perfil
Re: Aula Ativa de Ruby/RGSS
Resposta 40 Online: 16 Mai 2015, 18:27
Pergunta: Quero que quando o herói fique parado por certo tempo aconteça certa coisa... Mas não sei como fazer-lo esperar...? Já tentei o
Código: [Selecionar]
@wait = 0
@wait += 1 if @wait <= Tempo
@wait   = 0 if @wait == Tempo
como faço?
Espaço RPG Maker
  (clique na imagem abaixo)

Raizen

  • *
  • Mensagens: 2471 Ouro: 1834

    Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!

    • Ver perfil
    • E-mail
Re: Aula Ativa de Ruby/RGSS
Resposta 41 Online: 17 Mai 2015, 17:26
Um dos jeitos para se fazer isso, é basicamente o que você está fazendo mesmo, mas você não pode deixar o @wait = 0 acima do @wait += 1, é meio redundante você ficar zerando a variável antes de somar ela x).


E depende de onde está colocando esse código, se tiver como mostrar o trecho do código com um pouco mais do que você colocou x).

mrMiojo

  • *
  • Mensagens: 12 Ouro: 0
  • Projeto de Scripter
    • Unity
    • Ver perfil
Re: Aula Ativa de Ruby/RGSS
Resposta 42 Online: 17 Mai 2015, 20:05
Vlw, mas já consegui: Zerei o @wait logo no initialize, então não precisa mais de zera-lo toda hora xD...
Espaço RPG Maker
  (clique na imagem abaixo)

Watanukiz

  • *
  • Mensagens: 5 Ouro: 1
    • Ver perfil
    • E-mail
Re: Aula Ativa de Ruby/RGSS
Resposta 43 Online: 02 Jun 2015, 07:18
Gente, alguém pode me explicar para o que serve o comando "attr_acessor" e por quê ele não funciona no meu IR de maneira nenhuma? Todos os tutoriais que vi citam que é esse o comando que deve ser usado para se atribuir caracteristicas as classes, mas acho que talvez ele tenha sido retirado/substituído nas versões mais recentes do Ruby (?)

É uma questão idiota, de quem não entende nada de programação, mas se alguém pudesse me explicar ficaria agradecido.

Raizen

  • *
  • Mensagens: 2471 Ouro: 1834

    Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!

    • Ver perfil
    • E-mail
Re: Aula Ativa de Ruby/RGSS
Resposta 44 Online: 02 Jun 2015, 09:26
deveria funcionar x).

mande um trecho de como está fazendo essa parte do código ai a gente vê o que pode estar faltando...

E outra, você tá usando isso em que programa xD? RPG Maker...? já que você disse IR e eu mesmo desconheço o que seja ^^

 

Versão Mobile