Fazendo um Inventário (Parte 2/3)

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Fazendo um Inventário (Parte 2/3)

Mensagem por Zero. em Ter 10 Mar 2015, 18:59

→Enfim a parte dois da nossa criação de inventário!
Desculpem-me pela demora mas arrumar tempo nunca é fácil Smile


→Vamos à parte 2 !

Nome : Fazendo um Inventário (Parte 2/3)
Plataforma : GM7 ou superior (Pro).
Dificuldade : Mediano.
Pré-Requisitos : GM7 ou superior e um pouco de noção sobre arrays (mas talvez você entenda arrays com esse tutorial).
Créditos : Zero.

Nós já temos o corpo do inventário, seus slots, os itens, já sabemos como adicionar itens a estes slots agora vamos aprender a usar estes itens!

2.1 – Usando Itens
Para usarmos os itens é muito simples, basta nós clicarmos com o botão direito no item (isto é uma das possibilidade, vai a depender do jogo) e diminuirmos um na quantidade do item clicado e caso a quantidade do item for menor que 1, nós iremos excluí-lo do inventário. Mas como fazer isso?  Siga os passos a seguir.

Em nossos objetos que são parentes do par_item (obj_pot_hp, obj_pot_mp, obj_armadura, obj_espada), nos colocamos o seguinte código no evento Mouse Right Pressed  Event Mouse  :

Código:
global.quant[indice] -= 1 //retira um da quantidade do item
/*Aqui em baixo é onde teremos que por o que nosso item faz.
No caso desta engine existe 2 variaveis no obj_controle, uma chamada global.hp e outra chamada global.mp. Nossa poção de hp irá aumentar 5 de hp e a de mp irá aumentar 5 de mp. Eu para isso eu fiz o seguinte*/
global.hp += 5 // é apenas isto, sem complicações

Mas e agora? Nosso itemtem 1 de quantidade (por exemplo), ao diminuirmos 1, essa quantidade passará a ser 0, era pra ele sumir, como fazemos para excluí-lo? Siga os seguintes passos :
Nos objetos que são parente do par_item adicione o seguinte código a seu evento Step  Event Step  :

Código:
if global.quant[indice] <= 0 // se a minha quantidade (item) for menor ou igual a 0
{
global.slot[indice] =  noone // meu item no slot é igual à nenhum
global.quant[indice] = 0 // minha quantidade é 0 (para evitarmos qualquer tipo de problema)
instance_destroy() // eu sou destruído
}

É assim que funciona nossa exclusão de itens, não basta apenas excluir a instância, porque a instância é apenas a representação do objeto que está na nossa array global.slot[indice]. Para excluirmos nosso item do inventário, temos que excluir a instância e também definir o valor do global.slot do seu indice para noone (noone tem valor de -4 no GameMaker) e  definir o valor de global.quant do seu indice para 0, sendo indice o valor do indice do objeto do inventário atual (o qual estamos trabalhando).

2.2 – Movimentando os itens pelo inventário
A ideia para movimentarmos os itens pelo inventário é bem simples. Ao clicarmos em um item no inventário com o botão esquerdo, nos iremos guardar o valor do indice desse item em uma variavel global, caso essa variavel global não tenha nenhum outro indice guardado (caso haja algum outro indice guardado, ai é executado a troca). Após clicarmos e guardamos o indice desse item em uma variavel global, nos vamos clicar em outro item com o qual nos queremos trocar. Assim que nos clicarmos em outro item (pode ser o mesmo que guardamos o indice, caso queira deixa-lo onde estava mesmo) eu irei trocar o global.slot do indice que guardei com o global.slot do item que eu escolhi para trocar, assim como o seus global.quant's. Ao trocarmos estas, nós devemos trocar as suas instâncias também, assim, nós deletamos as instâncias dos itens que pegamos os indice, e definimos o valor da variavel create nos obj_slot's que tem o mesmo indice desses itens. Ao definirmos a variavel create como 0, o obj_slot irá criar o item novamente, mas agora, irá criar o item que foi trocado, em ambos os slots!
Na pratica, ficaria assim :

Inicialmente no obj_controle, em seu evento Create  Event Create , nos iremos adicionar aquela variavel global :

Código:
global.troca = 0

No obj_slot, nós iremos adicionar o seguinte código ao seu evento Mouse Left Pressed  Event Mouse :

Código:
if global.troca = 0 // se a variavel global ainda não tiver nenhum indice salvo
{
   global.troca = indice // salvamos o indice desse slot nela
   exit; // saímos deste piece of code para que não haja conflito com o código abaixo
}

if global.troca > 0 // se já existe algum indice salvo (aqui iria funcionar, teoricamente, no nosso segundo item que foi clicado, que é com o qual nós queremos trocar
{
   scr_troca() // este é o script de troca que será mostrado a seguir
   global.troca = 0 // define a variavel global.troca para 0, assim confirmando a troca
}

Agora nós criaremos o script scr_troca. Ele é o código principal desta troca :

Código:
var aux_slot, aux_quant; // criação de variáveis temporárias auxiliares para nos ajuderam na troca
aux_slot = global.slot[global.troca] // salvando o valor de global.troca em uma variavel auxiliar para que seu valor não seja perdido, e podermos concluir a troca
aux_quant = global.quant[global.troca] // salvando o valor de global.quant também
global.slot[global.troca] = global.slot[indice] // Fazendo a troca agora. O slot do indice global.troca recebe o slot do indice “indice” que é o indice do slot que clicamos por último
global.quant[global.troca] = global.quant[indice] // trocando sua quant também
global.slot[indice] = aux_slot // agora o slot com o indice desse slot clicado por último está recebendo a variável auxliar a qual guardamos os valores do indice global.troca, se não tivessemos esta variavel auxiliar a troca não aconteceria pois o valor do slot e quant de indice global.troca já foram alterados
global.quant[indice] = aux_quant // quant do indice do ultimo slot clicado recebendo o quant da variavel auxiliar
with par_item // aqui nós vamos entrar em todos os itens que tem como parent o objeto par_item
{
   if indice = other.indice or indice = global.troca // como nós entramos em todos os itens, nos temos que excluir apenas os que estão sendo trocados, para isso há uma checagem de indice para que apenas os itens com os indices utilizados na troca sejam excluídos
   {
       instance_destroy()
   }
}
with obj_slot // agora nós vamos entrar nos obj_slot's para alterarmos o valor da variavel create
{  
   if indice = global.troca // se o indice deste slot é igual ao indice do slot clicado pela primeira vez, então... Isto segue o mesmo raciocínio da checagem feita nos itens
   {
       create = 0 // define a variavel create para 0, para que os itens trocados sejam criados
   }
}
create = 0 // define a variavel create deste slot (o último que foi clicado) para 0, para que ele também crie o item que foi trocado

E pronto! Nosso itens já são trocados!
Os itens são trocados, mas nos nem sentimos que eles são trocados né? Ta feio ainda.
Bom, vamos deixá-lo mais “sentível”.

Adicione esta subimagem ao spr_slot, ela será a subimagem de posição 0 no sprite:
pwaGvryTLQ.png hosted at imgserv.com. the free image hosting service.

Com está nova subimagem, vamos adicionar o seguinte em nosso obj_slot.
Após a parte do código que diz se há item ou não e desenha o slot com item ou sem item (if create = 1 {image_index = 1} eles {image_index = 0}) adicione o seguinte :

Código:
if global.troca = indice {image_index = 2} // se este é o primeiro item que eu escolhi para trocar, ele ficará destacado, com uma subimagem diferente!

Agora nós já sentimos esta troca, mas, para sentirmos ainda mais isto, podemos fazer o seguinte.

Nos objetos que são parent do par_item nós acrescentamos o seguinte em seu evento Draw  Event Draw (antes de qualquer outro código!) :

Código:
if global.troca = indice
{
    draw_sprite(sprite_index,image_index,mouse_x,mouse_y)
}

Agora sim! Está bem mais bonito! Já podemos ver, também, que item estamos trocando com sua sprite desenhada no mouse! Podemos testar nosso projeto e ver uma troca de itens quase completa! Testem seus projetos.

→Este foi a segunda parte do tutorial Como fazer um inventário.
Obrigado por ver este turorial e nos dê um feedback, é sempre bom Very Happy


Engine :
https://www.dropbox.com/s/4xaodww3v3eobee/Invent%C3%A1rio%20pt2.gmz?dl=0

Na parte 3 nós iremos moldar mais esse inventário, divindo quantidade de itens, jogando itens no chão, e fazer o inventário seguir a tela. Além disso mostrarei os tipos de inventário.

Veja aqui a Parte 1 :
Parte 1

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum