25 de setembro de 2014

Como descobrir id de instâncias.

Executar funções e manipular variáveis em instâncias específicas, quando utilizamos mais que uma de um mesmo objeto, pode acabar sendo um problema se não soubermos como conseguir sua id. Este tutorial tem como objetivo apresentar diferentes métodos de se obter id de instâncias.

Como vimos no Tutorial sobre Variáveis, é possível manipular variáveis à partir de outras instâncias usando a estrutura "objeto.variável" ou a função with, porém, quando temos mais de uma instância de um mesmo objeto o Game Maker faz a alteração em todas instâncias ou utiliza o valor de uma qualquer, dependendo da ação, o que pode não ser o que queremos em algumas situações.

É possível armazenar o valor da id já na sua criação, por exemplo:

exemplo_id = instance_create(x, y, obj_exemplo)

Dessa maneira a variável "exemplo_id" irá armazenar a id da instância criada. Seguindo essa lógica, se fizermos:

exemplo_id1 = instance_create(x, yobj_exemplo)
exemplo_id2 = instance_create(x, yobj_exemplo)
exemplo_id3 = instance_create(x, yobj_exemplo)

Cada variável irá armazenar a id de cada instância criada.

Também podemos utilizar as funções de colisão, que podem ser vistas nessa página da YoYo Games. O Tutorial sobre Drag'n'Drop possui um ótimo exemplo de utilização da função collision_point.

Outra maneira é fazer com que a instância desejada "coloque" sua id dentro de uma variável global ou em outra instância. Por exemplo:

obj_monstro

Step Event

if vida > vida_monstro.global
{
   id_monstro.global = id
}

Se todas instâncias utilizarem esse código, a variável global "id_monstro" irá armazenar a id do monstro que tiver a maior vida. É uma boa opção para saber qual monstro oferece mais "risco" ao jogador.

O Game Maker também oferece algumas funções para encontrar id, sendo elas:

instance_id[n] = Vetor que armazena a id de todas instâncias presentes na room.

instance_nearest = Retorna a id da instância mais próxima.

instance_furthest = Retorna id da instância mais distante.

instance_position = Retorna id da instância em uma dada posição.

instance_place = Retorna id da instância do objeto especificado.

Para informações mais detalhadas veja a página de Funções.

Exemplo:

Se precisarmos criar um monstro que possui cabeça, tronco, braços e pernas, podemos usar um objeto de controle e fazer com que ele crie as outras instâncias ao invés de colocar todas na room e "montá-las".

obj_monstro_controle

Create Event

pernas = instance_create(x, y, obj_pernas)
tronco = instance_create(xyobj_tronco)
bracos = instance_create(xyobj_bracos)
cabeca = instance_create(xyobj_cabeca)

pernas.principal = id
tronco.principal = id
bracos.principal = id
cabeca.principal = id

Dessa maneira podemos fazer com que, por exemplo, se acertarmos uma das partes do corpo do monstro o obj_monstro_controle também leve dano e também podemos fazer com que as partes do corpo se comportem como um único objeto.

Um comentário :