17 de setembro de 2014

Drag'n'Drop

O Drag'n'Drop (Arrastar e Soltar) é bastante utilizado em jogos em que a principal forma de interação é utilizando o mouse. Por exemplo, em todos RPGs que conheço, que fazem uso do mouse, é possível equipar itens arrastando-os para dentro de um inventário. Este tutorial tem como objetivo ensinar como criar uma engine de Drag'n'Drop no Game Maker.

Este é um tutorial que acredito ser para usuários que tenham, pelo menos, conehcimento intermediário acerca das funções básicas oferecidas pelo Game Maker. Caso tenha dúvidas quanto a utilização de alguma função ou operador veja os Tutoriais para Iniciantes e a página de Funções.

A ideia é fazer com que quando clicarmos sobre um objeto o mesmo siga a posição do mouse; quando clicarmos novamente precisamos fazer com que ele pare de se mover. 

Exemplo:

obj_cursor

Create Event

item_segurado = noone

Step Event

if item_segurado != noone
{
   item_segurado.x = mouse_x
   item_segurado.y = mouse_y
}

Global Left Pressed Event

nome = collision_point(mouse_xmouse_yalltruetrue)

if item_segurado = noone && nome.arrastavel
{
   item_segurado = nome
exit
}
if item_segurado != noone
{
   item_segurado = noone
exit
}

obj_item

Create Event

arrastavel = true

Apesar de ser um pouco complexo, é bem simples entender pra que serve cada variável. A função collision_point retorna a id da instância que estiver sob o cursor quando clicamos com o botão esquerdo do mouse, depois disso o código verifica se estamos segurando algum item e, se não estivermos, checa se a instância é arrastável. Se não estivermos segurando algum item e a instância for arrastável, então o valor da variável "item_segurado" será a id conseguida através do collision_point.

Observação: É necessário declarar a variável "arrastavel" como true ou false para TODOS objetos que serão utilizados no jogo, pois se clicarmos sobre uma instância que não tenha essa variável o jogo irá travar.

Um comentário :

  1. se eu clicar fora de qualquer iten ta dando erro, como eu resolvo isso ?

    ResponderExcluir