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

Aula Ativa de Javascript/Ruby/RGSS e outras linguagens de programação

Iniciado por Raizen, 22/11/2012 às 13:04

03/12/2014 às 10:54 #30 Última edição: 09/01/2015 às 14:37 por Alucard_2
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.:
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:
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:
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

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.

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!


09/01/2015 às 11:53 #32 Última edição: 09/01/2015 às 12:04 por Alucard_2
Well, comecemos então.

Primeiro:
  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:
  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:

  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:

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:
  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...
  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.

@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.

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

Citação de: Alucard_2 online 09/01/2015 às 11:53
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!


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.

Pergunta...Pra que serve o:
seiquela.each { |sql| seiquela}
?
Espaço RPG Maker
  (clique na imagem abaixo)

Do jeito como descreveu, acho que serve bem demais pra dar bug. Poréeeeeeem, por exemplo:
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:

a = [10, 20, 30]

Eu acho que é isso, não tenho absoluta certeza.

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:
a = [2, 3, 4]
a.each {|i| print i} #=> 234
p a.collect {|i| i * 5} #=> [10, 15, 20]
~ Masked

Então o collect tem a mesma função de:
for i in a
p i  * 5
end #=> ?
Espaço RPG Maker
  (clique na imagem abaixo)

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:
p $game_party.members.collect {|actor| actor.id}

Seria o equivalente a isso:
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.
~ Masked

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
@wait = 0
@wait += 1 if @wait <= Tempo
@wait   = 0 if @wait == Tempo

como faço?
Espaço RPG Maker
  (clique na imagem abaixo)

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).

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)

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.

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 ^^