Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

[ENGINE] Exemplo de Inventário - Intermediário

Sprites, Modelos 3D, Exemplos, Áudios, Extensões e outros Recursos
Avatar do usuário
Denis Lemos
Membro
Membro
Reações: 0
Mensagens: 49

[ENGINE] Exemplo de Inventário - Intermediário

Mensagem por Denis Lemos » Qua Ago 10, 2016 6:28 pm

Nome: Exemplo de Inventário
Versão: Game Maker: Studio
Nível: Intermediário
Imagens:
Imagem

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
Editado pela última vez por Denis Lemos em Qua Set 07, 2016 11:40 pm, em um total de 4 vezes.

Avatar do usuário
Rouca_SG
Membro
Membro
Reações: 0
Mensagens: 22

Re: Engine de Inventário Simples

Mensagem por Rouca_SG » Sex Ago 12, 2016 4:54 pm

Parece bom, vou testar quando chegar no meu pc \o/
Pelo que eu entendi, você não utiliza scripts separado, ou usa? 
Nunca encontrei nenhum modelo de inventario que não utilize scripts e é meio difícil para mim entender como scripts feito por outras pessoas funcionam :P
Estou bem animada com essa engine =)

Avatar do usuário
Denis Lemos
Membro
Membro
Reações: 0
Mensagens: 49

Re: Engine de Inventário Simples

Mensagem por Denis Lemos » Sex Ago 12, 2016 10:57 pm

Na verdade usa scripts, mas é apenas para deixar o código no Step(Draw) mais limpo e simples de entender, eu recomendo que você aprenda como funciona os scripts, pois eles facilitam muito sua vida. Eu também tenho muita dificuldade de entender os códigos de outras pessoas, pois cada um tem uma lógica e modo de programar diferente. Essa "engine" é um pouco complexa, é recomendado para usuários intermediários ou mais avançados, pois de certa forma está bem completa e a quantidade de códigos que foi necessário para fazer tudo pode atrapalhar o entendimento de usuários iniciantes. Talvez eu tenha errado em fazer dessa forma, pois usuários mais experientes acho que saberiam como fazer, mas ainda sim pode ser útil como referência.

Eu vou fazer uma outra "engine" mais simples e com menos recursos do que essa, sem as "frescuras" de arrastar e soltar o item(que fez o código ficar mais difícil de entender), só o básico mesmo. Tipo só clicar no item e mandar ele para o inventário e vice verso. Dessa forma mais simples fica bem mais fácil de entender o fundamento do sistema que basicamente é o uso de arrays.

[EDITADO]
Criei uma versão de exemplo do inventário bem mais simples e de fácil entendimento, o link da postagem está AQUI!

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante