Página 1 de 1

Bug em objeto que deveria seguir outro

Enviado: Dom Ago 14, 2022 1:04 pm
por ragnarbrody
Estou com um problema em meu jogo, meu protagonista é composto por 2 objetos, o objeto "corpo" e o objeto "cabeça", fiz eles separados pois quando o jogador passa por cima de uma bola de tinta, a cabeça do jogador deve mudar de cor, coloquei na aba "step" do objeto cabeça que a posição do eixo y e o do eixo x devem ser iguais das do objeto corpo, em um primeiro momento funciona, como mostrado no gif abaixo:

Gif andando
Gif andando
Mas se o jogador andar contra os limites do mapa, a cabeça se desloca para fora do corpo, como mostrado abaixo:

gif batendo na parede
gif batendo na parede
Sabem como posso resolver?

Re: Bug em objeto que deveria seguir outro  Tópico resolvido

Enviado: Dom Ago 14, 2022 5:57 pm
por All-x
Ao invés de usar o evento "step" utilize o "end step". Assim não vai ficar com atraso.

Creio que deva funcionar.

Re: Bug em objeto que deveria seguir outro

Enviado: Dom Ago 14, 2022 8:43 pm
por ragnarbrody
Cara, funcionou, obrigado, mas pode me explicar porque colocar no "end step" resolveu? e qual a diferença efetiva do "step" pro "end step"?

Re: Bug em objeto que deveria seguir outro

Enviado: Dom Ago 14, 2022 10:46 pm
por All-x
Sequência dos eventos (veja a lista completa):
  • Begin Step
  • Step
  • End Step
  • Draw
No primeiro momento o GameMaker executa o Begin Step para todas as instâncias ativas. Depois de fazer isso, executa o Step para todas instâncias. E por último End Step para todas as instâncias (uma instância após a outra, e não tudo de uma vez). Até aqui na tela nada aconteceu, então 'por último' é executado o Draw para todas as instâncias e na tela o objeto se move.

Quando você utiliza o Step para mover suas instâncias, a nova posição só será desenhada no evento Draw. E quando você usa posição de outro objeto (x = corpo.x), naquele momento ele ainda pode não ter mudado de posição, pois a como é seguida uma lista (Quando falei que executa o evento pra todos, ele percorre um lista) pode ser que a posição do corpo ainda não tenha mudado. Dessa forma ele pega uma posição anterior, causando um atraso.

Colocando o código no End Step, temos a principio a certeza que o Step, já foi executado pra todas as instâncias (Inclusive com x, y atualizados vindos do sistema básico de movimento hspeed, vspeed e etc).

Em resumo: O Step ocorre antes das instâncias terem sua nova posição, e o End Step depois. Se tu faz a maior parte das movimentações no Step, quando utiliza o End Step conseguirá posições atualizadas.