Algum script que faça o EVENTO esperar para executar a próxima ação?

38 Respostas   1929 Visualizações

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

katumblo

  • *
  • Posts: 555
  • Ouros: 211
  • Aposentado esperando o Uthred pagar minha aposent.
  • Equipamentos "Se não lhe dão a glória, conquiste-a com uma beleza dessas. Confie em mim, não há odalisca que resista." "Quando reerguemos nossa CRM, árduas foram as batalhas, e sempre tivemos em mãos nossos escudos. Este representa nossas defesas, e nele, as engrenagens que nos move." "O azul da cota de malha e o dourado da ombreira contrastam com o aço forte e resistente desta armadura." "Este era muito usado nas famosas e aclamadas justas. A pequena abertura era só para a visão mesmo. Ainda bem que guardei um."
Resposta 15: 06/09/2014 às 16:25

Bom, primeiramente gostaria de agradecer a toooodos que me ajudaram aqui {;

Agora vamos lá...

Eduardogbg : Na verdade to entendendo nada que você ta falando ._.
Colisão ? Mas se o "esperar" só funcionasse com colisão eu teria que estar sempre perto para funcionar, e para tirar o "esperar" da colisão gastaria bastante códigos e isso poderá acarretar algum lag na hora de colocar por exemplo uns 20 eventos no mesmo mapa :x

Don Mariachi : Quando eu li seu comentário falei : PUTS, BOA ! depois eu também lembrei que não podia ser por variável kkk de boas {;

Alisson : Que seção é essa? '-'

Bebop : Eu já o uso mas ele não funciona para as outras páginas :x
Tudo vai dar certo (y(8.

hategum rpg

Resposta 16: 06/09/2014 às 16:36

Eu tambem acho que um evento resolve...voce poderia criar uma parte no evento que afete o jogador fazendo assim com que ele não se mexa.
e depois voltando ao normal quando o outro ja estiver em execução...
Um cara desenvolvendo um jogo de RPG...
"  Faça o melhor que puder em tudo, simples assim."                    
                              - Hategum RPG.

Eduardogbg

  • *
  • Posts: 24
  • Ouros: 9
  • 116
Resposta 17: 06/09/2014 às 19:18

Bom, primeiramente gostaria de agradecer a toooodos que me ajudaram aqui {;

Agora vamos lá...

Eduardogbg : Na verdade to entendendo nada que você ta falando ._.
Colisão ? Mas se o "esperar" só funcionasse com colisão eu teria que estar sempre perto para funcionar, e para tirar o "esperar" da colisão gastaria bastante códigos e isso poderá acarretar algum lag na hora de colocar por exemplo uns 20 eventos no mesmo mapa :x

Don Mariachi : Quando eu li seu comentário falei : PUTS, BOA ! depois eu também lembrei que não podia ser por variável kkk de boas {;

Alisson : Que seção é essa? '-'

Bebop : Eu já o uso mas ele não funciona para as outras páginas :x

 Tá, pq não pode ser por variável? Depois, esquece, esse esquema da seção de movimento customizado só iria afetar o movimento do evento (para onde ele anda).

 Depois, cara, você nunca programou um sistema com colisão? Quando me refiro a colisão quero dizer o seguinte: Condições para verificar a posição do herói em relação a um evento qualquer; Resultado.

No caso, você teria que botar o negócio do botão: Condição Botão; Condição Herói Cima; Condição X Herói == X Planta; Planta Y +1; Condição Planta Y == Herói Cima; Qualquer merda que você queira.
Daí para baixo seria X==X; Y-1; Y==Y. Direita: Y==Y; X-1; X==X. Esquerda: Y==Y; X+1; X==X.

Só que lembra q vc tem que programar as variáveis e deixar em processo paralelo.


Shiroyasha

  • *
  • Posts: 277
  • Ouros: 342
  • Viajando por aí.
  • Medalhas Participantes do Maps Together 2
Resposta 18: 06/09/2014 às 19:28 - Última modificação por Shiroyasha em 06/09/2014 às 19:33

Sei que já disseram isso, mas use o processo paralelo nessa página em questão. Não adianta insistir em nenhuma outra forma quando sua página não está em processo paralelo, o jogador vai sempre esperar.

O Eduardogbg já apresentou a única real solução para o seu problema do jeito como você o apresenta. O único problema da abordagem dele é que vai ser preciso usar variáveis também. Aqui você poderia então usar as variáveis de instância que já lhe falei em outra oportunidade.

Para pegar as coordenadas do evento em questão você usaria:

Código: [Selecionar]
@x = get_character(0).x
@y = get_character(0).y

Daí bastaria programar a colisão via eventos como bem entendesse. Lembrando que o tamanho do seu código pouco interferirá no lag gerado. Essa nem chega a ser uma desculpa.

Para todos os efeitos acho muito melhor você reconstruir o seu sistema e tentar aproveitar melhor cada página em questão porque mesmo que você siga a solução que o Eduardogbg apresentou e eu aprimorei  ainda estará fazendo uma programação desnecessária (A.K.A Programação Orientada a Gambiarras ou POG para os mais íntimos). A propósito, eu nem recomendo o que acabei de sugerir. Tem forma muito melhor de aproveitar 5 páginas de eventos, mas você insiste em não apresentar prints ficando difícil indicar onde você, provavelmente, está errando.

Nota: 5 páginas é tanta coisa, mas tanta coisa que dá pra fazer até um interpretador de movimentos de xadrez...

Até.

Eduardogbg

  • *
  • Posts: 24
  • Ouros: 9
  • 116
Resposta 19: 06/09/2014 às 21:11 - Última modificação por Eduardogbg em 06/09/2014 às 21:19


Código: [Selecionar]
@x = get_character(0).x
@y = get_character(0).y

Só quero fazer uma pequena observação em questão dos arrobas, eles vão trabalhar em todos os eventos? Como assim? @x definido no evento 001 vai ser o mesmo que está sendo usado no evento 002. Então, use as variáveis sem arroba para a colisão, só cuidado pois elas não funcionam em múltiplas páginas.

Shiroyasha

  • *
  • Posts: 277
  • Ouros: 342
  • Viajando por aí.
  • Medalhas Participantes do Maps Together 2
Resposta 20: 06/09/2014 às 22:06 - Última modificação por Shiroyasha em 06/09/2014 às 22:51

Só quero fazer uma pequena observação em questão dos arrobas, eles vão trabalhar em todos os eventos? Como assim? @x definido no evento 001 vai ser o mesmo que está sendo usado no evento 002. Então, use as variáveis sem arroba para a colisão, só cuidado pois elas não funcionam em múltiplas páginas.
Variáveis locais (sem arrouba) só podem ser usadas dentro do bloco de código que as chama. Nesse caso apenas dentro do "chamar script" onde estão, o que te impede de usá-las na opção de Script presente nas condições depois.

Já as variáveis de instância (com arrouba) não mudam o seu valor dentro de outros eventos funcionando localmente. O que pode estar acontecendo é que ao testar você estar atribuindo uma variável não definida (null) em uma variável global do jogo. Ao fazer isso o valor que você atribuiu anteriormente vai permanecer fazendo parecer que a variável é a mesma para todos os eventos no mapa quando não é. )o)
Ao usar uma variável de instância também é possível chamar em outras páginas daquele mesmo evento.

Mas faz bem fazer essa ressalva aí, vi que você estava atrás de um script para variáveis locais um tempo atrás. Isto pode ser do seu interesse.

Se bem que dá pra fazer as condições comparando diretamente as informações sem usar variável alguma, até simplifica ainda mais.

Código: [Selecionar]
#-1 é referente ao player e 0 o evento que chama esta condição.
get_character(-1).x == get_character(0).x

Aí já fica até com menos risco de ter problemas.

katumblo

  • *
  • Posts: 555
  • Ouros: 211
  • Aposentado esperando o Uthred pagar minha aposent.
  • Equipamentos "Se não lhe dão a glória, conquiste-a com uma beleza dessas. Confie em mim, não há odalisca que resista." "Quando reerguemos nossa CRM, árduas foram as batalhas, e sempre tivemos em mãos nossos escudos. Este representa nossas defesas, e nele, as engrenagens que nos move." "O azul da cota de malha e o dourado da ombreira contrastam com o aço forte e resistente desta armadura." "Este era muito usado nas famosas e aclamadas justas. A pequena abertura era só para a visão mesmo. Ainda bem que guardei um."
Resposta 21: 07/09/2014 às 11:41

Ah, sobre o colisão eu tinha esquecido deste modo... Bom, não daria certo pelo fato de usar variáveis ou switches, porque é algo global, deste jeito não daria para fazer 20 dos mesmos eventos ;s

E sobre o jeito que o Shiroyasha apresentou, irei testar, no mais, muitíssimo obrigado, muito mesmo, e shiro, sobre as variáveis locais, eu fiz esse seu jeito os outros eventos também mudavam o valor das variáveis com arroba o.o daí acabei usando o script de adicionar mais swthchies e resolveu o problema ...
Agora vou dar uma olhada nesse modo que você apresentou acima *=*
E sobre meu evento realmente não precisar de várias paginas, eu fui dar uma revisada nele, e percebi que realmente não precisa, 1 ou 2 já bastaria.
No mais, jaja volto para dar a resposta se funcionou ou não *=*

Ah, e sobre isso:

Código: [Selecionar]
get_character(-1).x == get_character(0).x

Não entendi muito bem, isso verificaria se o personagem está em cima do evento ? e se eu quisesse que ele ficasse abaixo do evento ? como ficaria?
Tudo vai dar certo (y(8.

Shiroyasha

  • *
  • Posts: 277
  • Ouros: 342
  • Viajando por aí.
  • Medalhas Participantes do Maps Together 2
Resposta 22: 07/09/2014 às 12:07 - Última modificação por Shiroyasha em 07/09/2014 às 12:11

Bem, por aqui nunca tive problema algum ao usar variáveis de instância. Tomem cuidado ao usá-las juntamente com variáveis globais, imagino que isto está enganando vocês. Recomendo que não as usem em variáveis globais do jogo para testar o seu valor, imprimam na janela de depuração usando:

Código: [Selecionar]
p @x

Do contrário é muito fácil errar um teste atribuindo o valor delas a uma variável do jogo.

Ah, e sobre isso:

Código: [Selecionar]
get_character(-1).x == get_character(0).x

Não entendi muito bem, isso verificaria se o personagem está em cima do evento ? e se eu quisesse que ele ficasse abaixo do evento ? como ficaria?
Isso está verificando se a coordenada X no mapa do jogador é igual a coordenada X do evento. Era só para exemplificar como seria sem o uso de variável fazendo a comparação direta. Dá para fazer o mesmo com a abscissa (get_character(-1).y == get_character(0).y).

o/

katumblo

  • *
  • Posts: 555
  • Ouros: 211
  • Aposentado esperando o Uthred pagar minha aposent.
  • Equipamentos "Se não lhe dão a glória, conquiste-a com uma beleza dessas. Confie em mim, não há odalisca que resista." "Quando reerguemos nossa CRM, árduas foram as batalhas, e sempre tivemos em mãos nossos escudos. Este representa nossas defesas, e nele, as engrenagens que nos move." "O azul da cota de malha e o dourado da ombreira contrastam com o aço forte e resistente desta armadura." "Este era muito usado nas famosas e aclamadas justas. A pequena abertura era só para a visão mesmo. Ainda bem que guardei um."
Resposta 23: 07/09/2014 às 12:13

Código: [Selecionar]
get_character(-1).y == get_character(0).y


Mas se eu quisesse verificar o personagem em outras direções, seria assim?

get_character(-1).y+1 == get_character(0).y+1  > Este exemplo verifica se o personagem está abaixo
get_character(-1).y-1 == get_character(0).y-1  > Este exemplo verifica se o personagem está acima

Tudo vai dar certo (y(8.

Shiroyasha

  • *
  • Posts: 277
  • Ouros: 342
  • Viajando por aí.
  • Medalhas Participantes do Maps Together 2
Resposta 24: 07/09/2014 às 13:45

Ok, vou supor que você nunca programou colisão.
Você operou os dois lados da igualdade nos exemplos que deu, isso não vai resolver nada.

1) Um evento está 1 tile acima do seu personagem quando suas ordenadas (x) são iguais e a abscissa (y) do evento é menor 1 unidade em relação a do personagem. Logo para que sejam iguais você soma 1 unidade na posição do evento.

Usando 1 condição com operador lógico AND (condição de call script):
< > Estrutura Condicional:Script: (get_character(-1).x == get_character(0).x) && (get_character(-1).y == get_character(0).y +1)
   <>
   FIM
<>

Usando duas condições:
< > Estrutura Condicional:Script: get_character(-1).x == get_character(0).x
   < > Estrutura Condicional:Script: get_character(-1).y == get_character(0).y+1
      < >
      FIM
   FIM
< >

Com isto em mente:

Código: [Selecionar]
# Evento acima do personagem
(get_character(-1).x == get_character(0).x) && (get_character(-1).y == get_character(0).y +1)

#Evento abaixo do personagem
(get_character(-1).x == get_character(0).x) && (get_character(-1).y+1 == get_character(0).y)

#Evento a esquerda do personagem
(get_character(-1).y == get_character(0).y) && (get_character(-1).x == get_character(0).x +1)

#Evento a direita do personagem
(get_character(-1).y == get_character(0).y) && (get_character(-1).x+1 == get_character(0).x)

No seu caso nem é preciso verificar essas posições individualmente, se você usar:

Código: [Selecionar]
#Evento próximo ao personagem (acima, abaixo, esquerda ou direita)
(get_character(-1).x == get_character(0).x) && (get_character(-1).y - get_character(0).y).abs == 1 || (get_character(-1).y == get_character(0).y) && (get_character(-1).x - get_character(0).x).abs == 1

Terá criado uma checagem de colisão completa usando uma única condição e sem usar variável alguma.
Eita, já ensinei técnica secreta demais... Haha. Bons estudos.

Até.

Eduardogbg

  • *
  • Posts: 24
  • Ouros: 9
  • 116
Resposta 25: 07/09/2014 às 13:47

@Shiroyasha
Pois é, acabei de ver que era um erro no meu teste mesmo, eu fui fazer uma gambiarrinha para testa e só percebi que tava fazendo merda quando você me corrigiu. Eu to ligado q variável com @ é variável de classe, só não sabia o que era uma "classe" quando se usava pelo evento.

@katumblo
O que eu estava sugerindo, era você armazenar os valores das coordenadas em uma variável e trabalhar usando essas variáveis, e não os valores diretamente. Vamos ver se Shiroyasha pode te sugerir outra maneira.

edit: ninja'd

katumblo

  • *
  • Posts: 555
  • Ouros: 211
  • Aposentado esperando o Uthred pagar minha aposent.
  • Equipamentos "Se não lhe dão a glória, conquiste-a com uma beleza dessas. Confie em mim, não há odalisca que resista." "Quando reerguemos nossa CRM, árduas foram as batalhas, e sempre tivemos em mãos nossos escudos. Este representa nossas defesas, e nele, as engrenagens que nos move." "O azul da cota de malha e o dourado da ombreira contrastam com o aço forte e resistente desta armadura." "Este era muito usado nas famosas e aclamadas justas. A pequena abertura era só para a visão mesmo. Ainda bem que guardei um."
Resposta 26: 07/09/2014 às 15:01 - Última modificação por katumblo em 07/09/2014 às 15:02

Shiroyasha eu entendi, mas a unica coisa que não consigo entender de maneira alguma é o porque de eu ter que criar a condição assim:

< > Estrutura Condicional:Script: get_character(-1).x == get_character(0).x
   < > Estrutura Condicional:Script: get_character(-1).y == get_character(0).y+1
      < >
      FIM
   FIM
< >

Porque a primeira condição ? Qual o uso dela? Aquilo ali é para quando o personagem estar no mesmo lugar que o evento, não ?
A de baixo eu entendi completamente, porque quando o Y do personagem for igual ao Y+1 do evento, vai saber que o personagem está um tile abaixo ... Mas qual a função da primeira condição?


Eduardogbg : Cada evento teria que usar 1 variável, pois se não, 1 variavel apenas não iria dar, pois quando o evento armazenasse na variável, e o personagem fosse pra próxima, a armazenação trocaria por outra e daria um "bug muito bugado" ... não? :s
Tudo vai dar certo (y(8.

Eduardogbg

  • *
  • Posts: 24
  • Ouros: 9
  • 116
Resposta 27: 07/09/2014 às 15:22

Shiroyasha eu entendi, mas a unica coisa que não consigo entender de maneira alguma é o porque de eu ter que criar a condição assim:

< > Estrutura Condicional:Script: get_character(-1).x == get_character(0).x
   < > Estrutura Condicional:Script: get_character(-1).y == get_character(0).y+1
      < >
      FIM
   FIM
< >

Essa condição é para ver se o personagem está na mesma linha X, se não ele pode estar na diagonal que iria funcionar. Se essa condição não estivesse ali ia dar um bugg muito louco de verdade, tipo do sistema funcionar assim:
 Evento
                            Personagem

Sacou?

Eduardogbg : Cada evento teria que usar 1 variável, pois se não, 1 variavel apenas não iria dar, pois quando o evento armazenasse na variável, e o personagem fosse pra próxima, a armazenação trocaria por outra e daria um "bug muito bugado" ... não? :s


Variável local meu amigo, variável de script, aquele negócio do @, tá lembrado?

Shiroyasha

  • *
  • Posts: 277
  • Ouros: 342
  • Viajando por aí.
  • Medalhas Participantes do Maps Together 2
Resposta 28: 07/09/2014 às 15:52

Essa condição é para ver se o personagem está na mesma linha X, se não ele pode estar na diagonal que iria funcionar. Se essa condição não estivesse ali ia dar um bugg muito louco de verdade, tipo do sistema funcionar assim:
 Evento
                            Personagem

Sacou?
Isso! Do contrário a condição seria verdadeira pra qualquer posição no eixo X. Quando se trabalha com colisões é preciso ter esse cuidado de verificar ambas as coordenadas. Mesmo assim experimente testar cada condição individualmente e você certamente compreenderá os bugs que estamos citando.

Fora isso esqueci de dizer que seu personagem deverá estar virado para o evento também para funcionar corretamente. Já deixo como dever de casa descobrir como fazer isso.  :malvado:

Kvothe

  • *
  • Posts: 652
  • Ouros: 1423
  • Maker Geral
Resposta 29: 07/09/2014 às 17:47

 ... Eita quanta resposta. Bom eu fiz uma gambiarra aqui (depois eu faço uma versão mais bonitinha e tal..)... Eu testei aqui é parece que funcionou... testa aí é vê!

Script:
Código: [Selecionar]
class Game_Event < Game_Character
  alias :waitInit :initialize
  def initialize(*a, &b)
    waitInit(*a, &b)
    @wait_sec = 0
  end
  # Espera X segundos..
  def wait_sec(x)
    @wait_sec = x * 60
  end
  # teste
  alias :waitUpdate :update
  def update
    unless @wait_sec == 0
      @wait_sec -= 1
    else
      @wait_sec = 0
      waitUpdate
    end
  end
end

Exemplo