Mal uso do "case"?

6 Respostas   222 Visualizações

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

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Tópico criado em: 03/10/2016 às 20:10 - Última modificação por Skyloftian em 03/10/2016 às 20:47

Então, eu estou montando um script, basicamente quando eu apertar uma tecla, os seguidores (followers) vão reunir "dentro" do jogador e vão entrar em uma formação dependendo da direção que o jogador esteja.

Mas não está dando certo, creio que seja por causa do "case", mas eu tentei mudar pra "if" e "elsif", também não deu muito certo, preciso da ajuda de vocês:

Código: [Selecionar]
class Game_Followers

  alias prev_update update
  def update
    prev_update
    newfollow if Input.trigger?(:X)
  end
 
  def newfollow
    gather
    case @direction
    when 2
      self[0].move_straight(4)
      self[0].set_direction(2)

      self[1].move_straight(6)
      self[1].set_direction(2)
     
      self[2].move_straight(8)
      self[2].set_direction(2)

    when 4
      self[0].move_straight(8)
      self[0].set_direction(4)
     
      self[1].move_straight(2)
      self[1].set_direction(4)
     
      self[2].move_straight(6)
      self[2].set_direction(4)

    when 6
      self[0].move_straight(8)
      self[0].set_direction(6)
     
      self[1].move_straight(2)
      self[1].set_direction(6)
     
      self[2].move_straight(4)
      self[2].set_direction(6)

    when 8
      self[0].move_straight(4)
      self[0].set_direction(8)
     
      self[1].move_straight(6)
      self[1].set_direction(8)

      self[2].move_straight(2)
      self[2].set_direction(8)
    end
  end
end
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

TonyHart

  • *
  • Posts: 144
  • Ouros: 126
  • Born in 95 to die
Resposta 1: 03/10/2016 às 22:09

Seu when está certo, só a maneira que vc está pegando a direção do jogador que está errado.

Código: [Selecionar]
$game_player.direction

Aí você vai verificar outros probleminhas, mas é só ir ajustando...
Born in 95 to die

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 2: 03/10/2016 às 22:20

@tonyhart

Deu um erro de argumentos, mas eu me viro aqui.

Muito obrigado!
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

TonyHart

  • *
  • Posts: 144
  • Ouros: 126
  • Born in 95 to die
Resposta 3: 03/10/2016 às 22:49

Vê se esse código aqui faz o que vc precisa...

Código: [Selecionar]

class Game_Followers
 
  alias prev_init initialize
  def initialize(leader)
    prev_init(leader)
    @pressed = false
  end

  alias prev_update update
  def update
    prev_update
    if Input.trigger?(:X)
      gather
      @pressed = true
    end
    if !gathering? && !moving? && @pressed
      newfollow
    end
  end
 
  def newfollow
    case $game_player.direction
    when 2
      self[0].move_straight(4)
      self[0].set_direction(2)

      self[1].move_straight(6)
      self[1].set_direction(2)
     
      self[2].move_straight(8)
      self[2].set_direction(2)

    when 4
      self[0].move_straight(8)
      self[0].set_direction(4)
     
      self[1].move_straight(2)
      self[1].set_direction(4)
     
      self[2].move_straight(6)
      self[2].set_direction(4)

    when 6
      self[0].move_straight(8)
      self[0].set_direction(6)
     
      self[1].move_straight(2)
      self[1].set_direction(6)
     
      self[2].move_straight(4)
      self[2].set_direction(6)

    when 8
      self[0].move_straight(4)
      self[0].set_direction(8)
     
      self[1].move_straight(6)
      self[1].set_direction(8)

      self[2].move_straight(2)
      self[2].set_direction(8)
    end
    @pressed = false
  end
 
end

Born in 95 to die

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 4: 03/10/2016 às 23:03

@tonyhart

Deu certo mesmo, eu entendi seu código e tudo mais, mas de onde vem esse "@pressed"?

Ah, e obrigado por ter solucionado o problema.
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

TonyHart

  • *
  • Posts: 144
  • Ouros: 126
  • Born in 95 to die
Resposta 5: 03/10/2016 às 23:40

Então, o pressed é uma variavel que eu acrescentei pra controlar o fluxo. Acontece o seguinte: O comando gather e o comando move_straight não sao totalmente sequenciais. Cada comando, é executado um pouquinho de cada vez no metodo update. Entao, quando vc chama gather e move_straight ao mesmo tempo, a engine vai tentar executar os dois ao mesmo: O gather só finaliza quando todos os followers estao na mesma posicao que o player, enquanto que o move_straight só verifica que o follower foi para aquela direcao. Entao o que acontece: O follower vai para a direita (por exemplo), e quando chega la essa funçao é dada como finalizada, mas como o follower ainda nao esta na mesma posicao que o player a funcao gather continuar executando, ate os followers voltarem.

Ai eu declarei a variavel 'pressed' como um controle para saber que o botao foi apertado. O ponto é so chamar a sua funcao new_follow quando o gather estiver finalizado. Entao, na linha 16, tem um if que garante isso: a funcao newfollow so sera chamada quando o gather estiver terminado (!gathering? == not gathering), ele estiver parado, significa que terminou a rota (!moving == not moving) e botao tiver sido pressionado (@pressed).

No final da funcao newfollow, eu seto o valor de pressed para false, porque quando o metodo update executar mais uma vez, ele nao vai repetir a funcao.
Born in 95 to die

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 6: 04/10/2016 às 00:37

@tonyhart

Entendi, até então eu imaginava que colocar uma função em baixo da outra anulava isso, por exemplo, como coloquei o gather acima do case, pensei que apenas quando o gather de fato terminasse o case iria ser executado.

Mas parece que depende da função, nesse caso, os seguidores a partir do momento que saíssem em direção ao jogador, já teriam cumprido sua função de gather.

Bom, muito obrigado pela ajuda, seria bom se eu reparasse nessas coisas antes, agora faz todo o sentido pra mim.

Até mais.
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)