17 de agosto de 2014

Sprites

Os sprites são peças fundamentais no Game Maker e na criação de jogos. São eles quem darão vida ao seu jogo e, juntamente com diversos outros fatores, farão seu jogo se destacar e ganhar uma identidade própria. O objetivo deste tutorial é exemplificar algumas maneiras de realizar a mudança de sprite dos objetos e dar algumas dicas de como programar de maneira a otimizar essas mudanças.

Para simplificar, usaremos o Método 2  do Tutorial de Movimento em 8 Direções, que abordei em outra postagem, para definir a movimentação. Também abordarei sobre a mudança de sprite para os monstros e para os jogos com vista superior, nos quais não podemos ver o corpo do personagem.

Primeiro, é necessário que tenhamos as imagens em nossa pasta de sprites. Aqui tratarei as posições como: Leste(E), Nordeste(NE), Norte(N), Noroeste(NW), Oeste(W), Sudoeste(SW), Sul(S) e Sudeste(SE).

Dica: Utilize prefixo ou sufixos para diferenciar sprites de outros recursos, como por exemplo, nomear um sprite de spr_jogador ou img_jogador ao invés de jogador.

Create Event:

image_speed = 1

Step Event:

if movimento_horizontal > 0 && movimento_vertical = 0
{
   sprite_index = spr_E
}
if movimento_horizontal > 0 && movimento_vertical < 0
{
   sprite_index = spr_NE
}
if movimento_horizontal = 0 && movimento_vertical < 0
{
   sprite_index = spr_N
}
if movimento_horizontal < 0 && movimento_vertical < 0
{
   sprite_index = spr_NW
}
if movimento_horizontal < 0 && movimento_vertical = 0
{
   sprite_index = spr_W
}
if movimento_horizontal < 0 && movimento_vertical > 0
{
   sprite_index = spr_SW
}
if movimento_horizontal = 0 && movimento_vertical > 0
{
   sprite_index = spr_S
}
if movimento_horizontal > 0 && movimento_vertical > 0
{
   sprite_index = spr_SE
}
if movimento_horizontal = 0 && movimento_vertical = 0
{
   image_index = 0
}

Tudo que precisamos é definir a velocidade da animação(image_speed), em Create Event, e escolher qual e quando um sprite será usado no Step Event. O image_index = 0 faz com que o personagem volte à posição inicial da animação quando não houver movimento, para que não fique com um dos pés no ar. Esse código é extremamente genérico, portanto será necessário adaptá-lo de acordo com sua necessidade. Por exemplo, mudar o sprite quando um personagem pular, quando estiver nadando, quando trocar de equipamento, entre outras situações. Abordarei essas situações em tutoriais mais específicos.

Rotação

Para os jogos com vista superior podemos rotacionar o sprite do personagem, ao invés de desenhá-lo em cada ângulo possível.

Step Event

image_anglepoint_direction(xy, mouse_xmouse_y)

Isso fará com que o personagem rotacione de acordo com a posição do mouse. Este tipo de animação é comumente utilizada em jogos de tiro com vista superior.

Escala

No caso de sprites sem muitos detalhes, onde espelhar o desenho já é o suficiente, podemos utilizar a função image_xscale *= -1, que faz com que o Game Maker mantenha o tamanho da imagem mas mude sua direção de acordo com o eixe escolhido. Para deixar a imagem de ponta-cabeça basta usar image_yscale *= -1.

if place_meeting(x + movimento_horizontal, y, obj_wall)
{
movimento_horizontal *= -1
image_xscale *= -1
}

Este código fará com que o o objeto mude a direção do movimento e o sprite seja espelhado toda vez que o objeto colidir com a parede.

4 comentários :

  1. no ultimo caso oq eu coloco no lugar de movimento_horizontal?

    ResponderExcluir
    Respostas
    1. A variável que você estiver usando pra gravar a direção do movimento.

      Excluir
  2. esses tutoriais servem para game maker v8 ?

    ResponderExcluir
  3. para ficar parado e so movimentar depois que eu pressionar alguma tecla como seria?
    meu codigo esta assim
    if(keyboard_check(ord("W")) && place_free(x,y-spd)){//pra cima ta de costas
    y-=spd;
    sprite_index = spr_player_up;
    }

    else if(keyboard_check(ord("S")) && place_free(x,y+spd)){//pra baixo ta de frente
    y+=spd;
    sprite_index = spr_player_down;
    }

    if(keyboard_check(ord("A")) && place_free(x-spd,y)){//para esquerda
    x-=spd;
    sprite_index = spr_player_left;
    }

    else if(keyboard_check(ord("D")) && place_free(x+spd,y)){//para direita
    x+=spd;
    sprite_index = spr_player_right;
    }

    ResponderExcluir