Página 1 de 1

[PROG]#IEM Aula 08 - Objetos e Instâncias

Enviado: Sex Abr 29, 2016 3:20 pm
por All-x

INTRODUÇÃO EM GML

Aula 08 - Objetos e Instâncias

Atualizada(25/02/2015)



Objetos:

Rapaz, essa é uma aula essencial, presta atenção nela! É um tanto longa, então não precisa ver tudo de uma vez.

Hoje iremos aprender o sistema base em que são inseridos nossos códigos, os objetos.

Sua definição pode variar dependendo da linguagem, mas o essencial é você saber que um objeto controla os aspectos lógicos do nosso jogo, tanto visíveis, como invisíveis.

Exemplos do que pode ser um objeto:

Mario
Inimigo
Moeda
Controlador que escolhe que música deve tocar em qual fase.


Ao criar um objeto na nossa arvore de recursos nos deparamos com o seguinte:

Imagem

Name: aqui damos um nome ao objeto.

Sprite: definimos uma imagem da pasta Sprites para o objeto. Os botões NEW e EDIT são atalhos para criar uma nova sprite ou editar a que está selecionada.

Visible: Se este objeto irá aparecer durante a execução do jogo. Isso inclui os eventos Draw do objeto.

Solid: Se este é um bloco que não se move, como chão ou parede, marque esta opção. Assim a física básica do jogo tratará esse objeto de forma diferente, tentando impedir que outros o atravessem.

Persistent: Isso muda o comportamento do objeto durante a passagem entre uma room e outra. Quando trocamos de room, todos os objetos da room anterior são deletados e os da nova room aparecem. A persistência, faz com que o objeto não seja deletado nessa passagem de room. Todas suas características são preservadas, como sua posição por exemplo. Ele é um objeto "teimoso" xD.

Use Physics: Selecione isso se for usar o Sistema de física do GMS.

Depth: Aqui se define a profundidade em que é desenhado o objeto. Todos tem por padrão o valor 0, e o que vai definir se um objeto é desenhado sobre outro é a ordem de criação:

Imagem

É por isso que existe essa opção de "camada". Colocando uma valor menor o objeto será desenhado por cima, colocando um valor maior ele será desenhado atrás:

Imagem

Parent: Aqui você escolhe um pai para seu objeto. Esse objeto irá herdar todas as configurações e códigos do seu pai. Logo ele é um filho. Vamos dizer que tu tem um inimigo e quer criar outro, mas este tem apenas a sprite diferente. Em vez de escrever todo o código novamente, tu simplesmente define o novo objeto como filho do inimigo, mudando apenas a sprite.

Mask: Quando você cria a sprite que irá usar no objeto, ao lado já pode configurar a mascara de colisão. Por padrão a mascara é a área total da imagem, ou seja um retângulo. Mas por muitas vezes você tem um personagem com várias sprites em diversos movimentos, e todas elas de dimensões (altura x largura) diferentes. Isso se torna um problema, pois na hora da mudança das sprites o personagem pode ficar preso ao chão, pois a sprite de pulo era mais alta que a normal. Resolvemos isso usando uma Sprite como máscara de colisão. Escolhemos geralmente uma retangular não animada.

Eventos:

Ao centro temos o controle de eventos do objeto, trataremos disso amplamente na próxima aula. Mas fique com esse resumo fixo na cabeça:

-  Create: ocorre apenas uma vez, quando objeto é criado;
-  Step: ocorre o tempo todo enquanto o objeto existir;
-  Draw: ocorre o tempo todo, mas é usado para inserir funções de desenho (draw_);

Ações:

Ao lado temos ações que podemos adicionar ao game. Há muitos bloquinhos Drag & Drop, mas usaremos somente o da aba control -> Execute a piece of code. É aqui onde colocamos nosso código e podemos fazer tudo que é feito com os outros bloquinhos de ação e ainda muito mais.

Funções:

Código: Selecionar todos

object_exists(obj);
obj: nome do objeto.

Verifica se um objeto existe ou não na arvore de recursos (Não na room).

Exemplo:

Código: Selecionar todos

//Se o obj_lutador existe
if object_exists(obJ_lutador)
{
    //Muda a posição horizontal do obj_lutador para 32
    obj_lutador.x = 32
}
Imagem

Código: Selecionar todos

object_get_depth(obj);
obj: nome do objeto.

Pega o valor de profundidade de desenho de um objeto.

Exemplo:

Código: Selecionar todos

//Se a profundidade do player for maior que -50
if object_get_depth(obj_player) > -50
{
    //A profundidade do player será -50
    obj_set_depth(-50, player);
}
Imagem

Código: Selecionar todos

object_get_mask(obj);
obj: nome do objeto.

Retorna a sprite que está sendo usada como mascara pelo objeto.

Exemplo:

Código: Selecionar todos

//Pega a máscara do objeto luigi
mask_index = object_get_mask(luigi)
Imagem

Código: Selecionar todos

object_get_name(obj);
obj: nome do objeto.

Retorna o nome do objeto selecionado em uma string.

Exemplo:

Código: Selecionar todos

//Guarda a string "player" na variável meu_nome
meu_nome = object_get_name(player);
Imagem

Código: Selecionar todos

object_get_parent(obj);
obj: nome do objeto.

Retorna o objeto que é pai do objeto selecionado.

Exemplo:

Código: Selecionar todos

//Pega o pai do obj_inimigo_3
pai_do_outro = object_get_parent(obj_inimigo_3)
Imagem

Código: Selecionar todos

object_get_persistent(obj);
obj: nome do objeto.

Retorna se o objeto é persistente (true) ou não (false).
Imagem

Código: Selecionar todos

object_get_solid(obj);
obj: nome do objeto.

Retorna se o objeto é sólido (true) ou não (false).
Imagem

Código: Selecionar todos

object_get_sprite(obj);
obj: nome do objeto.

Retorna a sprite escolhida inicialmente pelo objeto selecionado. Sim aquela da janela de propriedades do objeto diferntemente do sprite_index que pega a sprite usada no momento.
Imagem

Código: Selecionar todos

object_get_visible(obj);
obj: nome do objeto.

Retorna se o objeto é visível (true) ou não (false).
Imagem

Código: Selecionar todos

object_get_physics(obj);
Retorna se o objeto usa física (true) ou não (false).
Imagem

Código: Selecionar todos

object_is_ancestor(obj);
obj: nome do objeto.

Retorna se o objeto é pai de outros objetos (true) ou não (false).
Imagem
As funções do tipo _set_, ao invés de pegar um informação atribuem. Sendo o primeiro argumento o valor, e o segundo o objeto selecionado.

Exemplo:

Código: Selecionar todos

if desaparecer == true
{
     object_set_visible(false, obj_bloco);
}
Lembrando que essas funções alteram as caracteristicas de todas as réplicas desse objeto. Ou seja as instancias, que veremos abaixo.

Instancias:

Você deve ter reparado que podemos adicionar quantas réplicas quisermos de nossos objetos no editor de rooms do GMS, certo? O nome dado a essas réplicas é instancia de objeto.

Imagem

Vejamos as funções:

Código: Selecionar todos

instance_change(obj, perf);
obj: objeto a ser trocado.
perf: Se irá executar o evento Destroy do antigo objeto e o Create do novo.

Troca o objeto atual por outro.

Exemplo:

Código: Selecionar todos

/*Troca para o objeto player_morrendo sem executar o 
evento Destroy do objeto anterior e o Create do objeto
novo.*/
instance_change(player_morrendo, false);
Imagem

Código: Selecionar todos

instance_copy(perf);
perf: Irá executar o create da nova cópia (true ou false).

Essa função cria uma cópia exata da instancia atual, com todos seus valores (Incluindo a posição). Você pode escolher se quer ou não que o create da cópia aconteça.

Retorna o ID da cópia criada.
Imagem

Código: Selecionar todos

instance_count
Esta variável retorna  a quantidade de instâncias de qualquer objeto ativas.

Código: Selecionar todos

instance_create(x, y, obj);
x: posição horizontal onde será criado o novo objeto.
y: posição vertical onde será criado o novo objeto.
obj: objeto a ser criado.

Cria uma nova instância de objeto em uma determinada posição.

Retorna o ID da instância criada.

Exemplo:

Código: Selecionar todos

//Cria uma instancia de obj_bala e lhe atribui velocidade horizontal 10.
var tt = instance_create(x, y, obj_bala);
tt.hspeed = 10;
Imagem

Código: Selecionar todos

instance_destroy();
Destrói a instância.
Imagem

Código: Selecionar todos

instance_exists(obj);
obj: objeto ou instância a ser checado.

Checa se existe um objeto ou uma instancia de objeto. Retorna true caso sim e false caso não.

Exemplo:

Código: Selecionar todos

//Se não existir pelo menos um instância do obj_iminigo
if not instance_exists(obj_inimigo)
{
   room_goto(fase_10);
}
Imagem

Código: Selecionar todos

instance_find(obj, n);
obj: nome do objeto.
n: numero da ordem.

Procura uma instancia de objeto dada a sua ordem (Do mais velho ao mais novo) começando por zero e terminado no [total de instancias -1].

Retorna a ID da instancia encontrada.

Exemplo:

Código: Selecionar todos

/*Procura todos os objetos e verifica se passou da parte inferior da room,
caso alguma sim ele vai pra cima*/
for (var i = 0; i < instance_number(obj_inimigo); i += 1)
{
   var o = instance_find(obj_Enemy,i);

   if o.y > room_height { o.vspeed = -15; }
}
Imagem

Código: Selecionar todos

instance_furthest(x, y, obj);
x: posição horizontal onde será checado a distância do objeto.
y: posição vertical onde será checado a distância do objeto.
obj: objeto a ser checado.

Retorna a ID da instância de objeto mais longe da posição dada.

Exemplo:

Código: Selecionar todos

var longe = instance_furthest(x, y, obj_inimigo);

//Destrói a instancia de obj_inimigo mais longe
with (longe)
{
   instance_destroy();
}
Imagem

Código: Selecionar todos

instance_id[0...]
Vetor/Array que guarda todas as instancias de todos objetos ativas na room.

Exemplo:

Código: Selecionar todos

for (var i = 0; i < instance_count; i += 1;)
{
   with (instance_id[i]) { speed += 5; }
}
Imagem

Código: Selecionar todos

instance_nearest(x, y, obj);
x: posição horizontal onde será checado a distância do objeto.
y: posição vertical onde será checado a distância do objeto.
obj: objeto a ser checado.

Retorna a ID da instância do objeto mais perto.

Exemplo:

Código: Selecionar todos

var perto = instance_furthest(x, y, obj_inimigo);

//Segue instancia de obj_inimigo mais perto
mp_potential_step(perto.x, perto.y, 5, 0);
Imagem

Código: Selecionar todos

instance_number(obj);
obj: obj a ser checado.

Retorna o número de instancias de determinado objeto.

Código: Selecionar todos

instance_place(x, y, obj);

Código: Selecionar todos

instance_position(x, y, obj);
Veja as duas funções acima em: #COL Aula 01 - Colisões simples

Aula anterior: #IEM Aula 07 - Funções e Scripts