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

Npcs com movimento aleatório em determinada área

Iniciado por guKing, 15/01/2017 às 03:54

15/01/2017 às 03:54 Última edição: 25/01/2017 às 16:02 por King Gerar
Eu dei uma olhada no fórum e no google e não achei nada que eu realmente entendesse :( Alguém sabe me explicar se tem como marcar uma área para que o um NPC perambule por ela sem sair da delimitação? A minha ideia é fazer isso para colocar alguma animais de enfeite no mapa.

EDIT: Área errada tem como mover? É para VX ACE, perdão. :(

E eu queria saber se a função REGIÃO do VX ACE tem como ser usada para isso.

Movi para a área correta.

Dá uma olhada nesse tópico. Creio que seu problema seja equivalente, portanto, de igual solução.

15/01/2017 às 15:55 #2 Última edição: 15/01/2017 às 16:51 por guKing
Tchê, era isso mesmo brother! Muito obrigado!

edit

Então, funciona e tals, mas quando eu adiciono um NPC com movimento sem região ele buga. É pra ser isso mesmo?

Tem do miguel8884 de acordo com a região

[user]King Gerar[/user] Eu to tendo um problema com o rolê. Ele funciona e muito bem, mas, se eu quiser fazer com que um  NPC se mova por evento ou qualquer outra coisa, eu preciso definir uma região pra ele também. Tem como arrumar isso?

Citação de: guKing online 22/01/2017 às 15:05
[user]King Gerar[/user] Eu to tendo um problema com o rolê. Ele funciona e muito bem, mas, se eu quiser fazer com que um  NPC se mova por evento ou qualquer outra coisa, eu preciso definir uma região pra ele também. Tem como arrumar isso?
Se tu fizer este evento com duas páginas, uma para se mover em regiões, outra sem esse comentário para que ele se mova
livremente, não funciona não? É que o script não é meu, e não lembro bem se eu o utilizava fora dessas condições.


23/01/2017 às 20:31 #7 Última edição: 23/01/2017 às 20:36 por TanatosMaker
O ruim é que provavelmente você não vai usar uma área ao quadrado, ou seja com 4 lados sendo as laterais e os diametros iguais, daí seria possível fazer isso por eventos sem muita dificuldade.

Deixar o animal em processo paralelo:
Citar
<>Comentário: Verificar coordenadas do evento
<>Var "Animal A-X" igual X coordenada (Este evento)
<>Var "Animal A-Y" igual Y coordenada (Este evento)
<>Comentário: #Verificar se o animal sai da posição X
<>Condição "Animal A-X" menor  que 15
   <>Mover evento: Este Evento:
   :                          :Andar passo para direita
   :                          :Andar passo para direita
   <>
:Fim
<>Condição "Animal A-X" maior  que 55
   <>Mover evento: Este Evento:
   :                          :Andar passo para esquerda
   :                          :Andar passo para esquerda
   <>
:Fim
<>Comentário: #Verificar se o animal sai da posição Y
<>Condição "Animal A-X" menor que 12
   <>Mover evento: Este Evento:
   :                          :Andar passo para cima
   :                          :Andar passo para cima
   <>
:Fim
<>Condição "Animal A-X" maior que 30
   <>Mover evento: Este Evento:
   :                          :Andar passo para baixo
   :                          :Andar passo para baixo
   <>
:Fim
<>


Eu coloquei para retornar dois passos caso passe das coordenadas estipuladas, mas pode diminuir pra 1.

Citação de: TanatosMaker online 23/01/2017 às 20:31
O ruim é que provavelmente você não vai usar uma área ao quadrado, ou seja com 4 lados sendo as laterais e os diametros iguais, daí seria possível fazer isso por eventos sem muita dificuldade.

Deixar o animal em processo paralelo:
Citar
<>Comentário: Verificar coordenadas do evento
<>Var "Animal A-X" igual X coordenada (Este evento)
<>Var "Animal A-Y" igual Y coordenada (Este evento)
<>Comentário: #Verificar se o animal sai da posição X
<>Condição "Animal A-X" menor  que 15
   <>Mover evento: Este Evento:
   :                          :Andar passo para direita
   :                          :Andar passo para direita
   <>
:Fim
<>Condição "Animal A-X" maior  que 55
   <>Mover evento: Este Evento:
   :                          :Andar passo para esquerda
   :                          :Andar passo para esquerda
   <>
:Fim
<>Comentário: #Verificar se o animal sai da posição Y
<>Condição "Animal A-X" menor que 12
   <>Mover evento: Este Evento:
   :                          :Andar passo para cima
   :                          :Andar passo para cima
   <>
:Fim
<>Condição "Animal A-X" maior que 30
   <>Mover evento: Este Evento:
   :                          :Andar passo para baixo
   :                          :Andar passo para baixo
   <>
:Fim
<>


Eu coloquei para retornar dois passos caso passe das coordenadas estipuladas, mas pode diminuir pra 1.

Realmente não :(

Mas o script que ele me passou me resolve o problema. A única questão é: qualquer evento (seja com movimento aleatório ou com rota) tem que ter uma região para si.

24/01/2017 às 23:37 #9 Última edição: 24/01/2017 às 23:40 por TanatosMaker
Não precisa fazer uma cópia da mensagem pra responder a minha já que era a única acima da sua...

Sobre a script, é realmente, você vai ter que criar uma ID de terreno pra cada evento possivel, se mais de um evento puder se limitar a mesma área você usaria a mesma ID.

Uma resposta meio "burra" pra isso, que pode gerar um certo lag, é demarcar o terreno que ele pode ir com eventos vazios, assim ele não irá passar.
Spoiler
[close]
Dessa forma você pode fazer o movimento que quiser com o personagem e ele nunca sairá da área que colocou os eventos, pois ele vai detectar que há algo ali (certifique-se de não botar gráfico algum nos eventos e de NÃO ativar a opção de atravessar).


You See!~

Citação de: guKing online 22/01/2017 às 15:05
[user]King Gerar[/user] Eu to tendo um problema com o rolê. Ele funciona e muito bem, mas, se eu quiser fazer com que um  NPC se mova por evento ou qualquer outra coisa, eu preciso definir uma região pra ele também. Tem como arrumar isso?
Consegui mexer no script. Se o evento estiver com uma página ativa na qual contém a tag <region 0>, ele não irá
sofrer limitação por regiões.

#-------------------------------------------------------------------------------
#                              NPC Region Move
#-------------------------------------------------------------------------------
# Este script faz com que determinados eventos somente andem sobre tiles com
# determinadas regiões.
#-------------------------------------------------------------------------------
# Instruções:
# Comente o evento com "<region id>"
# No id colocar o id da region que o npc se moverá :)
# Caso queira que o evento se movimente em qualquer região, coloque o id nesta
# tag como 0 (zero).
#===============================================================================

#===============================================================================
# ** Game_CharacterBase
#-------------------------------------------------------------------------------
#  Esta classe gerencia os personagens. Comum a todos os persongens, armazena
# informações básicas como coordenadas e gráficos
# Esta classe é usada como superclasse da classe Game_Character.
#===============================================================================

class Game_Event < Game_Character
  #---------------------------------------------------------------------------
  # * Movimento em linha reta em
  #     d       : direção (2,4,6,8)
  #     turn_ok : permissão para mudar de direção
  #-----------------------------------------------------------------------------
  def move_straight(d, turn_ok = true)
    @move_succeed = passable?(@x, @y, d)
    if @list[0].parameters[0][0..6] == '<region'
      @list[0].parameters[0][9] != '>' ? @region_id = @list[0].parameters[0][8..9] : @region_id = list[0].parameters[0][8]
    end
    if @region_id != "0"
      @move_succeed = false unless $game_map.region_to_pass(@x, @y, d) == @region_id.to_i      
    end
    if @move_succeed
      set_direction(d)
      @x = $game_map.round_x_with_direction(@x, d)
      @y = $game_map.round_y_with_direction(@y, d)
      @real_x = $game_map.x_with_direction(@x, reverse_dir(d))
      @real_y = $game_map.y_with_direction(@y, reverse_dir(d))
      increase_steps
    elsif turn_ok
      set_direction(d)
      check_event_trigger_touch_front
    end
  end
end
#===============================================================================
# ** Game_Map
#-------------------------------------------------------------------------------
#  Esta classe gerencia o mapa. Inclui funções de rolagem e definição de 
# passagens. A instância desta classe é referenciada por $game_map.
#===============================================================================

class Game_Map
  #-----------------------------------------------------------------------------
  # * Definição de ID da região
  #     x   : coordenada X
  #     y   : coordenada Y
  #-----------------------------------------------------------------------------
  def region_to_pass(x, y, d)
    case d
    when 2
      y += 1
    when 4
      x -= 1
    when 6
      x += 1
    when 8
      y -= 1
    end
    valid?(x, y) ? @map.data[x, y, 3] >> 8 : 0
  end
end

[user]King Gerar[/user] <3 que homem ein. Muito obrigado!

A danada sou eu  :rei:

Haha, bom que funcionou (eu acho). Qualquer bug, só dar um toque que destranco o tópico.

:lock: