Versão: Game Maker: Studio
Nível: Intermediário
Imagens:
![Imagem](http://i66.tinypic.com/3586wat.jpg)
Sobre: Essa "engine"(projeto de exemplo) mostra o básico para se fazer um inventário, onde o jogador vai poder:
* Realocar os itens dentro do inventário;
* Arrastar um item de fora e guardar dentro do inventário;
* Arrastar um item de dentro do inventário e "dropá-lo" para fora;
LINK DA VERSÃO MAIS SIMPLES DO INVENTÁRIO
Funcionamento: Basicamente a lógica do exemplo funciona assim:
* Existe duas sprites, a primeira é uma imagem 32x32 que é usada para desenhar os "slots" do inventário. A segunda sprite é usada para desenhar os itens, dentro dessa sprite existem várias sub imagens sendo cada uma delas referentes a um tipo de item.
Sub imagem 0: Está vazia, é para quando o slot estiver vazio;
Sub imagem 1: Representa o item1, que é um vidro de porção azul;
Sub imagem 2: Representa o item2, que é um vidro de porção vermelho;
Sub imagem 3: Representa o item3, que é um vidro de porção verde;
Sub imagem 4: Representa o item4, que é um vidro de porção amarelo;
* Somente os itens fora do inventário são objetos verdadeiros, os itens dentro do inventário são apenas sprites desenhadas de acordo com o item alocado dentro de cada "slot" na array. Os itens fora do inventário são todos instâncias do mesmo objeto, o que os diferencia é apenas a sub imagem de suas sprites que se baseiam no valor da variável item_type. Essas sub imagens são atribuídas da mesma forma que foi explicado acima.
* Primeiramente, no Evento Create do obj_inventory é criado uma array2D[a,b] que será o inventário por assim dizer, e esta array2D[a,b] será baseda nos valores de:
a: culumnsNumber: É o número de colunas horizontais que o inventário vai conter. Como é usado array, não será possível mudar o tamanho do inventário posteriormente. Caso isso seja preciso, deve-se então usar listas.
b: slotsNumber: É o numero de "slots" que cada coluna horizontal vai ter.
Assim que a array2D chamada de inventory[] for criada, ainda no Evento Create vai ter um loop for que vai percorrer cada um dos "slots" e passar o valor 0 para eles começarem vazios.
Por exemplo: Se passar o seguinte valor para a array inventory[0,2] = 4 o terceiro slot da primeira coluna terá o valor 4 que é referente ao item4(porção amarela). PS: Obrserve que o índice a da array se refere ao número das colunas horizontais e o índice b se refere ao número de "slots" que cada coluna horizontal vai ter.
* Após criar a array2D do inventário, no Evento Draw é desenha os "slots" um a um usando outro loop for. Aproveitando esse mesmo loop, é feita a verificação do valor que o "slot" contém e já desenha o item referente ao seu valor. Dessa forma, sempre que trocar o valor de cada "slot" do inventário, já vai atualizar automaticamente os itens disponíveis.
* A partir daí, basta ir mudando o valor dos elementos da array conforme as coisas vão acontecendo em seu jogo. No exemplo, eu usei os clicks do mouse para pegar, arrastar e largar os itens. Basicamente a lógica empregada foi a seguinte:
* Ao clicar em algum item, vai salvar em uma variável o tipo de item que foi clicado e desenhar uma sprite no ponteiro do mouse com a sub imagem referente ao item clicado, para simular que o item está sendo arrastado. Mas o item clicado não pode continuar lá paradão no mesmo lugar, então se ele estiver fora do inventário na hora do click, quer dizer que ele é uma instância, e essa instância precisa ser deletada na mesma hora para dar a ilusão que o item está sendo arrastado.
Mas se o click for dentro do inventário onde os itens não são uma instância, como faz para saber em qual item foi clicado já que eles não tem uma máscara de colisão? Simples, basta verificar se o ponteiro do mouse está dentro da região delimitadora do "slot" usando esse comando point_in_rectangle(). Lembra do loop for usado no Evento Draw para desenhar os "slots" e itens? Dentro desse mesmo loop é usado esse comando para saber se o mouse foi clicado dentro do retângulo do "slot" aproveitando a coordenada usada para desenhar o "slot" como referência para o centro do retângulo. Então se conter algum item dentro desse "slot" vai salvar o tipo do item para desenhar no ponteiro do mouse simulando que o mouse está arrastando aquele item, e ao mesmo tempo vai tornar o valor daquele slot como zero, para ele ficar vazio já que o seu item está sendo arrastado pelo mouse. É da mesma forma que pegar o item fora do inventário, só que no primeiro caso precisa deletar a instância.
* Ao soltar o botão do mouse, consequentemente vai parar de arrastar o item que está sendo arrastado. Se o mouse estiver fora do inventário, vai criar uma instância do obj_itens e mudar o valor da variável item_type referente ao número do item que estava sendo arrastado usando o valor salvo na hora que pegou o item. Se largar o item dentro de algum "slot", simplesmente vai alterar o valor daquele "slot" na array referente ao número do item que estava sendo arrastado. Mas se soltar o item nos separadores da grid, o item vai voltar ao seu local de origem, para isso é gravado o número do "slot" e a posição da instância no momento em que o item é pego.
* Sempre que largar um item em algum 'slot" que já contenha um item, o novo item vai ocupar o seu lugar. Então vai ser feita uma varredura no inventário para procurar um outro "slot" vazio para reposicionar o antigo item. Caso não encontre um "slot" vazio vai aparecer uma janela dizendo que o inventário está cheio e perguntando se você deseja substituir o antigo item pelo novo. Caso você aceite, o novo item vai ficar no inventário e o item antigo vai ser "dropado" para fora do inventário para a mesma posição onde estava o novo item quando você o pegou. Caso você não aceite, o novo item não vai ser aceito no inventário e vai retornar para a posição onde você o pegou.
Para saber mais sobre arrays, acesse o link da documentação do Game Maker Studio: Arrays Docs
Download:
DOWNLOAD LINK