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:
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:
É 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:
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);
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
}
Código: Selecionar todos
object_get_depth(obj);
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);
}
Código: Selecionar todos
object_get_mask(obj);
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)
Código: Selecionar todos
object_get_name(obj);
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);
Código: Selecionar todos
object_get_parent(obj);
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)
Código: Selecionar todos
object_get_persistent(obj);
Retorna se o objeto é persistente (true) ou não (false).
Código: Selecionar todos
object_get_solid(obj);
Retorna se o objeto é sólido (true) ou não (false).
Código: Selecionar todos
object_get_sprite(obj);
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.
Código: Selecionar todos
object_get_visible(obj);
Retorna se o objeto é visível (true) ou não (false).
Código: Selecionar todos
object_get_physics(obj);
Código: Selecionar todos
object_is_ancestor(obj);
Retorna se o objeto é pai de outros objetos (true) ou não (false).
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);
}
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.
Vejamos as funções:
Código: Selecionar todos
instance_change(obj, perf);
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);
Código: Selecionar todos
instance_copy(perf);
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.
Código: Selecionar todos
instance_count
Código: Selecionar todos
instance_create(x, y, obj);
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;
Código: Selecionar todos
instance_destroy();
Código: Selecionar todos
instance_exists(obj);
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);
}
Código: Selecionar todos
instance_find(obj, n);
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; }
}
Código: Selecionar todos
instance_furthest(x, y, obj);
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();
}
Código: Selecionar todos
instance_id[0...]
Exemplo:
Código: Selecionar todos
for (var i = 0; i < instance_count; i += 1;)
{
with (instance_id[i]) { speed += 5; }
}
Código: Selecionar todos
instance_nearest(x, y, obj);
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);
Código: Selecionar todos
instance_number(obj);
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);
Aula anterior: #IEM Aula 07 - Funções e Scripts