18 de outubro de 2014

Como desativar objetos fora da tela.

Utilizando a função instance_deactivate_region e instance_activate_region é possível desativar/ativar todos objetos que estiverem dentro/fora de uma área retangular determinada pelo usuário. Esse recurso pode ser utilizado para otimizar os jogos evitando que instâncias não presentes na tela sejam carregadas, o que somente causaria um desperdício de memória e, eventualmente, travaria o jogo.

Este tutorial tem como objetivo explicar como desativar objetos fora da view e reativá-los dentro dela de maneira eficiente.

A função completa é instance_deactivate_region(left, top, width, height, inside, notme), onde:

left - Posição x do lado esquerdo do retângulo.

top - Posição y da parte superior do retângulo.

height - Altura do retângulo.

inside - true para desativar objetos dentro do retângulo, false para os de fora.

notme - true para também desativar a instância que utiliza a função, false para não inluí-la.

A instance_deactivate_region é igual, somente não possui o argumento notme.

Para desativarmos os objetos fora do nosso campo de visão e reativá-los quando entrarem na view usaremos as funções da view; caso não saiba utilizá-las veja na página de Funções.

obj_jogador

Step Event

instance_deactivate_region(view_xview[0] - 200, view_yview[0] - 200, view_wview[0] + 400, view_hview[0] + 400, false, true)

instance_activate_region(view_xview[0] - 200view_yview[0] - 200view_wview[0] + 400view_hview[0] + 400true)

Os valores 200 e 400 servem para aumentar a tela de ativação, para não acontecer das instâncias simplesmente aparecerem na tela, e devem ser alterados de acordo com sua necessidade. Isso vai depender do tamanho dos seus objetos, pois se você se aproximar de um avião, supondo que seu jogo seja Top-Down e que a largura da asa do avião seja maior que 200, não vai querer que a asa dele só fique visível quando o centro do avião aparecer na tela, então precisamos reativá-lo antes, aumentando a tela de ativação. Observe que, se tirarmos 200 da posição inicial x/y é necessário adicionar 400 ao tamanho do retângulo; 200 para chegar até a view mais o tamanho da view e mais 200 para depois da view.

Dica: É possível que alguns de vocês precisem desativar instâncias, como inventários, e verão que elas sempre serão reativadas, pois estão dentro da view. A solução que encontrei foi, ao invés de desativá-las, enviá-las para uma posição negativa, que no meu caso é x = -10000. Dessa maneira elas serão desativadas automaticamente por estarem fora da view e, por se tratar de uma posição negativa, nunca teremos acesso a elas. Lembre-se de utilizar um número alto pois é possível que sua tela de ativação chegue às posições negativas.

Um comentário :

  1. Queria saber como faz para não desativar certos objetos??

    ResponderExcluir