13 de agosto de 2014

Projéteis

Este tutorial tem como objetivo ensinar algumas formas de como criar projéteis no Game Maker. Primeiro é preciso entender que a velocidade no mundo virtual é diferente da do mundo real. Um carro, no mundo real, que percorrer 100 metros em 1 segundo terá percorrido cada metro do trajeto. Já no Game Maker, e acredito que em qualquer engine para criação de jogos, se dissermos que um objeto tem velocidade igual a 100 (pixels), estaremos dizendo que a posição do objeto varia de 100 em 100 pixels, criando a ilusão de que o objeto está se movimentando.

Saber isso é importante pois se na primeira situação houver uma pessoa no meio da pista, essa pessoa será atropelada pelo carro, já na segunda, se um objeto estiver na posição 50 ele não será atingido. Lembrando que ainda não estamos usando sprites nesses exemplos, considere que os objetos têm tamanho 1x1 pixels.

Dividirei este tutorial em duas partes: Projéteis Lentos e Projéteis Rápidos.

Para criar projéteis de acordo com a posição do sprite veja: Tutorial - Como criar projeteis em jogos Top-Down Shooter.

Projéteis Lentos

Mouse

São aqueles projéteis que podem ser desviados, como em jogos de naves. Pode ser feito da seguinte maneira:

Projétil (id: obj_bullet):

Create Event:

directionpoint_direction(xymouse_xmouse_y)
image_angle =  direction
speed = 8

Step Event:

if place_meeting(x, y, obj_enemy) || x < 0 || y < 0 || x > room_width || y > room_height
{
   instance_destroy()
}

Jogador(id: obj_player):

Global Left Button Event:

instance_create(x, y, obj_bullet)

No Create Event do Projétil definimos a direção do sprite(image_angle) baseado na posição do mouse. Caso sua imagem esteja invertida, bastar adicionar 180º à função, dessa maneira teremos: image_angle point_direction(xymouse_xmouse_y) + 180. Também definimos a velocidade(speed) do Projétil; o movimento deixará de ser contínuo se a velocidade escolhida for maior que seu tamanho .

No Step Event defini quando o prójétil deverá ser destruído, usando a função instance_destroy(). Isto serve para evitar que o jogo mantenha instâncias que não estão mais sendo usadas, que causariam perda de memória. O símbolo "||" é usado como "ou", portanto a instância será destruída quando sua posição estiver fora da room ou quando atingir o Inimigo(id: obj_enemy).

A função instance_create(xyobj_bullet) no Global Left Button Event do Jogador faz com que um projétil seja criado toda vez que clicarmos com o botão esquerdo do mouse.

Teclado

Para atirar utilizando o teclado podemos usar a função motion_set(0, 0), que define uma direção e velocidade para o objeto. Exemplo:

Projétil(id: obj_bullet):

Create Event:

if keyboard_check(ord('W')) && keyboard_check(ord('D'))
{
   motion_set(45, 4)
}
else
{
   motion_set(0, 4)
}

Jogador(id: obj_player)

Step Event:

if keyboard_check(vk_space)
{
   instance_create(x, y, obj_bullet)
}

Esse código criará um projétil quando clicarmos na barra de espaço. Se o jogador estiver segurando W e D, ele terá direção Nordeste(45º), caso contrário, o projétil terá direção Leste(0º). Nos dois casos a velocidade do projétil será 4.

Projéteis rápidos

Neste caso vamos considerar que, se nada estiver entre o jogador e o inimigo, o tiro acertará instantâneamente, sem chance de desvio.

Inimigo (id: obj_enemy):

Create Event:

vida = 10

Left Button Event:

if !collision_line(x, y, obj_player.x, obj.player.y, obj_wall, 0, 1)
{
   vida -= 1
}

Este código, apesar de não gerar projéteis, nos dá liberdade para criar diversos efeitos visuais para fingir que o tiro foi disparado. A função !collision_line(x1, y1, x2, y2, obj, prec, notme) cria uma linha invisível entre (x1, y1) e (x2, y2) e verifica se o objeto especificado colide com ela.

Observação: !collision_line é o mesmo que collision_line = false

Portanto, quando clicarmos sobre o inimigo e não houver uma colisão entre nossa linha e uma Parede(id: obj_wall), significa que não há nada para bloquear o falso projétil, então o inimigo será atingido. Quando isso acontecer ele perderá 1 de vida,. Para adicionar os efeitos visuais, citados anteriormente, basta criar instâncias  dentro do código que indica que o inimigo foi atingido e definir onde elas serão criadas.

Nenhum comentário :

Postar um comentário