Pedindo ajuda!

2 Respostas   157 Visualizações

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

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Tópico criado em: 28/07/2016 às 23:45

Então, estou tentando fazer algo simples, quero que com um botão os "followers" (personagens que seguem o principal) se posicionem de um jeito, como se entrassem em uma nova formação, aqui está o que tentei fazer (apontem todos os meus erros e me corrijam por favor):
Código: [Selecionar]
class Game_Follower < Game_Character
  def follow
    if Input.press?(:X)
      $game_party.battle_members[1]; move_diagonal(4, 2)
      $game_party.battle_members[2]; move_diagonal(4, 8)
      $game_party.battle_members[3]; move_diagonal(6, 8)
    end
  end
end

Acho que já comecei errando na classe, mas tudo bem.
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)

Brandt

Resposta 1: 29/07/2016 às 13:46

Não entendi como seria a nova formação, então só vou corrigir os erros xP

Primeiro, você não deveria modificar a Game_Follower, e sim a Game_Followers (no plural), já que você quer mover cada seguidor de maneira diferente.
Depois, não tem método follow, e criar ele não faz nada a menos que você o chame de um método já existente. Como não usaremos a Game_Follower eu prefiro deixar o follow de lado (até porque não faz sentido o nome pra situação >_<).

Dentro da Game_Followers, precisamos modificar um método que seja chamado toda vez que o mapa atualiza, pra que a qualquer momento em que a tecla for pressionada a formação seja feita. Geralmente esse método é o update. Também precisamos guardar o método antigo em algum lugar, pra isso serve o alias. Então:
Código: [Selecionar]
#==============================================================================
# ** Game_Followers
#==============================================================================
class Game_Followers
  #--------------------------------------------------------------------------
  # * Atualização dos seguidores
  #--------------------------------------------------------------------------
  alias _old_update update
  def update
    _old_update
    # Verificar se a tecla foi pressionada
  end
end

Agora, pra verificar se a tecla foi pressionada, usamos o Input.trigger?, não o press, porque o press retorna verdadeiro sempre que a tecla estiver pressionada (ou seja, se você segurar a tecla, ele dispara a condição todo frame), e o trigger retorna verdadeiro uma vez apenas, até que a tecla seja solta e pressionada de novo.

Se a tecla for pressionada, devemos posicionar os seguidores como você quer, e pra isso é melhor usar um método que codificar tudo direto no update, porque assim a formação pode ser chamada por qualquer outro meio que você queira. Fica assim:
Código: [Selecionar]
#==============================================================================
# ** Game_Followers
#==============================================================================
class Game_Followers
  #--------------------------------------------------------------------------
  # * Atualização dos seguidores
  #--------------------------------------------------------------------------
  alias _old_update update
  def update
    _old_update
    nice_formation if Input.trigger?(:X)
  end
  #--------------------------------------------------------------------------
  # * Posiciona os seguidores de um jeito legal
  #--------------------------------------------------------------------------
  def nice_formation
    # Posicionar os seguidores
  end
end

Na hora de posicionar os seguidores tem dois erros no seu código, o primeiro é esse ponto e vírgula aí. Ponto e vírgula serve para separar linhas, funciona do mesmo jeito que se você tivesse escrito assim:
Código: [Selecionar]
  $game_party.battle_members[1]
  move_diagonal(4, 2)
  $game_party.battle_members[2]
  move_diagonal(4, 8)
  $game_party.battle_members[3]
  move_diagonal(6, 8)

Ou seja, você chama variáveis aleatórias, que não fazem efeito nenhum, e depois move o seguidor atual (porque você está na Game_Follower, isso irá acontecer com todos os seguidores da fila) nas diagonais que você especificou aí. Imagino que não seja isso que você queira...

O segundo erro é que $game_party.battle_members[x] retorna um Game_Battler (Game_Actor), não um Game_Character, e Game_Battler não tem método move_diagonal xP

Para mover um membro da fila, você pega o Game_Character (Game_Follower) correspondente a ele e chama o método move_diagonal desse objeto, para chamar um método de um objeto você usa o ponto, não ponto e vírgula. Por exemplo, para mover o primeiro seguidor na diagonal superior esquerda:
Código: [Selecionar]
$game_player.followers[0].move_diagonal(4, 8)
De dentro da Game_Followers não é necessário o $game_player.followers[x], usamos self[x] no lugar:
Código: [Selecionar]
#==============================================================================
# ** Game_Followers
#==============================================================================
class Game_Followers
  #--------------------------------------------------------------------------
  # * Atualização dos seguidores
  #--------------------------------------------------------------------------
  alias _old_update update
  def update
    _old_update
    nice_formation if Input.trigger?(:X)
  end
  #--------------------------------------------------------------------------
  # * Posiciona os seguidores de um jeito legal
  #--------------------------------------------------------------------------
  def nice_formation
    self[0].move_diagonal(4, 2)
    self[1].move_diagonal(4, 8)
    self[2].move_diagonal(6, 8)
  end
end

Essa seria uma versão funcional do código que você escreveu, se funcionar do jeito que queria, ótimo, se não vou precisar que você me diga como que exatamente a formação.
~ Masked

Nunnu

  • *
  • Posts: 39
  • Ouros: 2
  • cala boca
Resposta 2: 29/07/2016 às 14:02

Rapaz, muito obrigado, era isso mesmo, a formação não vai ser exatamente essa, mas quis que tu entendesse assim, porque o resto eu quero fazer. Preciso aprender, então só coloquei as principais dúvidas no código.

Foi muito útil pra mim. Tu deu tanta explicação que fico até sem graça de deixar uma resposta pequena como essa, mas não quero encher linguiça, é basicamente isso. Deixei uns erros de propósito porque eu costumo usar isso e não saber realmente o significado, por exemplo o ponto.

É isso, tu fez exatamente o que eu queria, não gostaria de alguém fazendo o código pra mim, gosto quando explicam do jeito que tu explica, esta me fazendo muito bem respondendo meus posts, muito obrigado!
Feito por:   King Gerar          ManecBR3
                   
                   (um gato)            (outro gato)