Ferramenta e Versão: GameMaker Studio 2.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Introdução
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Neste Tutorial, basicamente, você estara aprendendo a criar um Sistema de Inventario basico utilizando arrays, ele sera capaz de armazenar itens, mover os itens com o mouse, separar,
acumular, organizar, deletar e move-los para um slot externo, ex: barra de hotkeys ou janela de equipamentos.
acumular, organizar, deletar e move-los para um slot externo, ex: barra de hotkeys ou janela de equipamentos.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Preparação
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Com o seu GMS2 aberto crie os seguintes recursos:
Sprites
-sSlot
-sSelect
-sPotion
Todas as sprites possuem o mesmo tamanho, e tem seus pontos de origem centralizados, o tamanho pode ser alterado, mas posteriormente partes do codigo também necessitarão de mudanças!
Scripts
-ItemData
-InventoryInit
-InventoryUpdate
-InventoryDraw
Não necessariamente precisam ser criados nesta mesma ordem e com esses mesmo nomes, mas, sempre é importante manter uma certa organização, procure sempre nomear seus recursos de maneira
simples e que você e outras pessoas possam entender facilmente, como por exemplo, utilize abreviações como "spr_nome", "scr_nome", "obj_nome" ou "sNome", "oName", os scripts, caso sejam
criados para funções especificas, podem receber essa propria função como nome, como no caso dos scripts criados acima.
o Script "ItemData" sera responsavel por inicializa e armazenar as informações sobre os nossos itens.
o Script "InventoryInit" sera responsavel por inicializar os itens no jogo, e o proprio inventario e suas variaveis.
o Script "InventoryUpdate" atualizara algumas funções do inventario, como posições do mouse, qual slot esta sendo sobreposto e afins.
o Script "InventoryDraw" sera o responsavel por realizar os draws relacionados ao inventario e itens.
Objetos
-oInventoryController
o Objeto "oInventoryController" sera o responsavel por controlar todas as coisas relacionadas ao inventario durante o jogo.
Dentro dele serão iniciados tres eventos, nos quais, não terão muita coisa dentro, mas farão toda a diferença
-Create: Sera responsavel por inicializar o script "InventoryInit()".
-Step: Sera responsavel por inicializar e atualizar o script "InventoryUpdate()".
-Draw: Sera responsavel por desenhar oque estiver dentro do script "InventoryDraw()".
Room
-rmTest
Somente uma sala para posicionar o "oInventoryController", por agora, não faremos nenhuma alteração necessaria nela.
Sprites
-sSlot
-sSelect
-sPotion
Todas as sprites possuem o mesmo tamanho, e tem seus pontos de origem centralizados, o tamanho pode ser alterado, mas posteriormente partes do codigo também necessitarão de mudanças!
Scripts
-ItemData
-InventoryInit
-InventoryUpdate
-InventoryDraw
Não necessariamente precisam ser criados nesta mesma ordem e com esses mesmo nomes, mas, sempre é importante manter uma certa organização, procure sempre nomear seus recursos de maneira
simples e que você e outras pessoas possam entender facilmente, como por exemplo, utilize abreviações como "spr_nome", "scr_nome", "obj_nome" ou "sNome", "oName", os scripts, caso sejam
criados para funções especificas, podem receber essa propria função como nome, como no caso dos scripts criados acima.
o Script "ItemData" sera responsavel por inicializa e armazenar as informações sobre os nossos itens.
o Script "InventoryInit" sera responsavel por inicializar os itens no jogo, e o proprio inventario e suas variaveis.
o Script "InventoryUpdate" atualizara algumas funções do inventario, como posições do mouse, qual slot esta sendo sobreposto e afins.
o Script "InventoryDraw" sera o responsavel por realizar os draws relacionados ao inventario e itens.
Objetos
-oInventoryController
o Objeto "oInventoryController" sera o responsavel por controlar todas as coisas relacionadas ao inventario durante o jogo.
Dentro dele serão iniciados tres eventos, nos quais, não terão muita coisa dentro, mas farão toda a diferença
-Create: Sera responsavel por inicializar o script "InventoryInit()".
-Step: Sera responsavel por inicializar e atualizar o script "InventoryUpdate()".
-Draw: Sera responsavel por desenhar oque estiver dentro do script "InventoryDraw()".
Room
-rmTest
Somente uma sala para posicionar o "oInventoryController", por agora, não faremos nenhuma alteração necessaria nela.
Scripts
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Agora, iremos trabalhar na parte dos codigos, preencheremos cada um daqueles Scripts criados acima, com variaveis e funções que farão nosso Inventario funcionar!
itens serão armazenados dentro de uma Array2D global chamada "Itn".(caso tenha alguma duvida sobre oque é uma Array, basta comentar abaixo que eu responderei, caso eu consiga xD), também
criaremos algumas variaveis para melhor estarmos nos referindo a esta array.
o termo "globalvar" é utilizado para criar variaveis globais que podem ser chamadas de qualquer outro codigo ou objeto, des que tenham sido iniciadas antes de serem chamadas.
Itn sera a array global que utilizaremos para armazenar os nossos itens.
ItnID sera uma variavel que recebera o valor de 0, que sera a sua posição em nossa array "Itn".
ItnName sera uma variavel que recebera o valor de 1, que também sera a sua posição na array "Itn".
ItnDesc recebera o valor de 2, sua posição.
ItnSprite... valor 3... posição... alguma coisa do tipo.
Agora, iremos partir para as variaveis dos itens.
ItnNothing e ItnPotion, receberão os valores de 0 e 1, que também ira se referir a suas posições na array, caso queira adicionar mais algum item, basta adicionar mais um valor a esta array
e por um numero diferente para sua posição, assim evitando erros futuros com Ids e coisas do tipo.
Agora, que ja temos os campos, e os itens, iremos finalmente popular a nossa Array "Itn".
as variaveis "Itens" acima, serão nada mais que posições que estarão se referindo a nossos itens dentro da arary, um exemplo seria
que basicamente seria a mesma coisa de
acredito que utilizando variaveis para se referir a esses numeros, seja uma maneira mais organizada e simples de se criar este sistema de itens, mas sinta-se a vontade para pular o processo de criação de
criação de variaveis se assim desejar :)
no final, o seu codigo deve estar mais ou menos como o codigo abaixo ItemData: Clique para ver o conteúdo
Caso ainda tenha alguma duvida sobre essa parte do codigo, ou tenha alguma sugestão, basta comentar abaixo que responderei o mais rapido possivel, por agora,
estamos encerrando atividades no script "ItemData", vamos para o proximo.
ItemData() basicamente, é uma maneira de chamar um script para que oque ele possui dentro dele seja executado.
Inv sera a array global que iremos utilizar para se referir aos slots do inventario.
InvID recebera o valor de 0, no qual sera sua posição na array.
InvQnt recebera o valor de 1, no qual também sera a sua posição na array.
SlotNumber é o numero de slots que o nosso inventario possuira, nesse tutorial utilizarei 50, mas sinta-se livre para utilizar qualquer outro numero, mais abaixo, destacarei algumas informações,
que caso o numero de slots seja diferente, precisarão ser alteradas.
Agora que ja criamos os slots, ta na hora de popularmos eles com itens nulos, oque repesentaria um espaço vazio, isso não é obrigado, mas eu sempre gosto de deixar o primeiro registro de item, classe,
skill, quest,e outras coisas, como "Nothing", mas você também pode so utilizar zero, ou um valor negativo.
Agora vamos a explicação do codigo, para inicializar todos os slots com o Itn[0,0] eu utilizo um laço de repetição chamado "for" que funciona basicamente assim, para(Variavel; Condição; ação), você inicia
uma variavel, e enquanto a condição for verdadeira, ele vai repetir uma ação, no nosso caso "i = 0" e enquanto i for menor que SlotNumber(50), i recebe +1, nesse caso, i vai de 0 a 49, 50 repetições!
e basicamente essa repetição esta dizendo que cada slot do inventario vai receber o Itn[ItnNothing, 0] e o Inv[(0 a 49), 1] vai receber 0, que no caso é a quantidade.
A manipulação desse tipo de inventario não é muito complicada, por exemplo, você pode colocar um item em um slot assim "Inv[10, 0] = Itn[ItnFuckingSword, 0]; Inv[10, 1] = 1".
No final seu codigo deve ficar mais ou menos assim: SPOILER: Clique para ver o conteúdo
Por agora, também vamos encerrar as atividades com o "InventoryInit", nosso proximo passo agora é o "InventoryDraw"
que alterar algumas informações
dentro do "InventoryInit" crie as seguintes variaveis
começaremos desenhando os slots, utilizaremos mais uma vez a função "for", so que desta vez estaremos utilizando ela duas vezes, uma dentro da outra!
primeiro faremos "i" de 0 a 9, e depois "l" de 0 a 4, e então faremos o GameMaker desenhar a sprite do Slot repetidas vezes, com posições diferentes de acordo com "I" e "L",
no meu codigo eu utilizo 100, como uma posição inicial da tela, e depois vem 34 * i, o tamanho da minha sprite é de 32, mas utilizo 34 para que tenha uma separação de 2 pixels
entre cada slot, a mesma coisa na posição Y da função, caso você tenha feito uma quantidade menor de slots, pode tentar utilizar numeros diferentes para o for, ou então desenhar cada um
separadamente, cabe a você decidir como quer que seu inventario seja exibido, caso tenha alguma duvida e queira alguma ajuda, basta comentar abaixo que ficarei feliz em ajudar
Agora, vamos desenhar os itens dentro dos slots
O codigo é quase o mesmo, as unicas diferenças sao que dentro do for, adicionamos a linha "if (Inv[(i + (10 * l)), 0] != ItnNothing)" que basicamente diz, que se o item que estiver em um s
lot de 0 a 49, for diferente do item "Nada" ele vai desenhar, mas caso o item dentro do slot seja o "Nada" ele vai so ignorar ele, e a outra diferença é na sprite informada no draw_sprite.
Lembra das posições que criamos para as Arrays "Itn" e "Inv"? então, teremos que acessar elas, basicamente estamos querendo a sprite armazenada dentro da "Itn[Item, ItnSprite]",
mas tem que ser do item de dentro de um slot do inventario, então no lugar do ID do item, utilizamos a propria array "Inv" que ira retornar o ID do item que esta la dentro.
o pequeno calculo que estão vendo ali dentro, nada mais é do que um pequeno calculo que vai de 0 a 49, no caso, i vai de 0 a 9, e l vai de 0 a 4, então o valor de i recebe o valor de l * 10
"i + (10 * l)", é mais simples do que parece xD,você ja pode executar o seu projeto, que vera que os slots estão desenhados na tela, e caso tenham adicionado algum item em um slot,
vai dar pra ver ele dentro do slot, ao executar você vera algo semelhante a isso.
,
no final, seu codigo deve ficar mais ou menos assim... SPOILER: Clique para ver o conteúdo
Agora iremos para o script "InventoryUpdate"
InvX Sera a posição vertical de nosso mouse no inventario.
InvY Sera a posição horizontal de nosso mouse no inventario.
OverInv Sera a posição do mouse no inventario.
e dentro do "InventoryUpdate" faça:
mX é a posição x do mouse.
mY é a posição y do mouse.
Detalhe!! Aqui, eu utilizo apenas a posição X e Y do mouse, mas caso no seu jogo, o inventario siga o player pela camera, não ira funcionar da mesma maneira, caso esteja utilizando camera você
pode fazer algo parecido com:
aqui, mX e mY ira retornar a posição do mouse na tela, e não na sala, mas isso tudo depende de como você vai fazer o seu codigo :), bom, ja chega de enrolação, caso tenha algum duvida, ja sabe, so perguntar,
agora vamos ao que importa, apos criar todas essas variaveis, iremos começar criando dois "for" um para o InvX e outro para o InvY,
Aqui, verifico se a posição do mouse é maior que a posição da primeira coluna de slots da esquerda, e vejo se é menor que a posição da ultima coluna, a direita,
no caso a posição em que você os desenhou no "InventoryDraw", no meu caso foi 100, mas como as sprites estão com o ponto de origem centralizado, tenho que subtrair 16
e deixei mais um pixel como margem e o for é utilizado para verificar os demais slots, logo o InvX recebe o valor de i.
no segundo if, verifico se o Mouse esta entre os slots horizontalmente, caso ele esteja entre algum slot, o InvX recebe -1, o mesmo se repete para o InvY.
Agora, você pode por dentro do inv draw a seguinte linha, para debug.
ela ira desenhar na tela as informações sobre as variaveis.
agora, iremos verificar se o mouse estiver fora da area destinada ao inventario.
basicamente se o mouse estiver fora da area, InvX e InvY recebem -1, com isso, sempre que o mouse passar por cima de um slot, InvX e InvY receberação valores de acordo com o slot,
agora iremos definir o OverInv.
Se InvX e InvY forem difentes de -1, OverInv vai receber o valor da seguinte conta (InvX"0 a 9" + (10 * InvY"0 a 4"))
por exemplo, se posicionar o mouse no ultimo slot da esquerda inferior, InvX vai ser 9, e InvY vai ser 4, logo OverInv ira te retornar 49, mas caso InvX ou InvY seja igual -1,
OverInv ira receber -1 também, com isso, terminanos por enquanto com o "InventoryUpdate".
com isso, basicamente se o mouse estiver dentro do inventario, ele ira desenhar o seletor dentro do slot selecionado,e é basicamente isso, o nosso Inventario esta começando a tomar forma
e funcionar!
Ela servira para desenhar a quantidade dos itens que temos.
Agora, no "InventoryInit" crie as seguintes variaveis:
ItnSelect: sera a variavel que armazenara o id do item selecionado.
ItnSelectQnt: sera a variavel que armazenara a quantidade do item selecionado.
InvSelect: armazenara a posição do inventario em que selecionamos o item.
Com as variaveis criadas, vamos começar utilizar elas, no "InventoryUpdate", adicione as seguintes linhas de codigo: SPOILER: Clique para ver o conteúdo
e para finalizar, de volta no "InventoryDraw" adicione:
esse codigo basicamente ira desenhar no mouse, o item atualmente selecionado, e pronto, seu inventario esta finalizado funcionando!!(assim espero kk)
ItemData:
Como ja dito antes, esse Script sera responsavel por inicializar e armazenar as informações dos nossos itens, e ele sera inicializado no evento Create do "oInventoryController", nossositens serão armazenados dentro de uma Array2D global chamada "Itn".(caso tenha alguma duvida sobre oque é uma Array, basta comentar abaixo que eu responderei, caso eu consiga xD), também
criaremos algumas variaveis para melhor estarmos nos referindo a esta array.
Código: Selecionar todos
///Variaveis
globalvar Itn, ItnID, ItnName, ItnDesc, ItnSprite;
ItnID = 0;
ItnName = 1;
ItnDesc = 2;
ItnSprite = 3;
Itn sera a array global que utilizaremos para armazenar os nossos itens.
ItnID sera uma variavel que recebera o valor de 0, que sera a sua posição em nossa array "Itn".
ItnName sera uma variavel que recebera o valor de 1, que também sera a sua posição na array "Itn".
ItnDesc recebera o valor de 2, sua posição.
ItnSprite... valor 3... posição... alguma coisa do tipo.
Agora, iremos partir para as variaveis dos itens.
Código: Selecionar todos
///Itens
globalvar ItnNothing, ItnPotion;
ItnNothing = 0;
ItnPotion = 1;
e por um numero diferente para sua posição, assim evitando erros futuros com Ids e coisas do tipo.
Agora, que ja temos os campos, e os itens, iremos finalmente popular a nossa Array "Itn".
as variaveis "Itens" acima, serão nada mais que posições que estarão se referindo a nossos itens dentro da arary, um exemplo seria
Código: Selecionar todos
Itn[ItnNothing, ItnID] = 0;
Itn[ItnNothing, ItnName] = "Nada";
Itn[ItnNothing, ItnDesc] = "Nada";
Itn[ItnNothing, ItnSprite] = 0;
Código: Selecionar todos
Itn[0, 0] = 0;
Itn[0, 1] = "Nada";
Itn[0, 2] = "Nada";
Itn[0, 3] = 0;
criação de variaveis se assim desejar :)
no final, o seu codigo deve estar mais ou menos como o codigo abaixo
Código: Selecionar todos
/// @description Inicializa e armazena informações dos itens
///Variaveis
globalvar Itn, ItnID, ItnName, ItnDesc, ItnSprite;
ItnID = 0;
ItnName = 1;
ItnDesc = 2;
ItnSprite = 3;
///Itens
globalvar ItnNothing, ItnPotion;
ItnNothing = 0;
ItnPotion = 1;
///Lista
///Nothing
Itn[ItnNothing, ItnID] = 0;
Itn[ItnNothing, ItnName] = 0;
Itn[ItnNothing, ItnDesc] = 0;
Itn[ItnNothing, ItnSprite] = 0;
///Potion
Itn[ItnPotion, ItnID] = 1;
Itn[ItnPotion, ItnName] = 0;
Itn[ItnPotion, ItnDesc] = 0;
Itn[ItnPotion, ItnSprite] = sPotion;
estamos encerrando atividades no script "ItemData", vamos para o proximo.
InventoryInit:
Aqui, também utilizaremos uma outra Array 2D global, chamada de "Inv", elas basicamente serão os nossos slots, e armazenarão os nossos itens dentro delasCódigo: Selecionar todos
///Inicializa os itens
ItemData();
///Variaveis
globalvar Inv, InvID, InvQnt, SlotNumber;
InvID = 0;
InvQnt = 1;
SlotNumber = 50;
Inv sera a array global que iremos utilizar para se referir aos slots do inventario.
InvID recebera o valor de 0, no qual sera sua posição na array.
InvQnt recebera o valor de 1, no qual também sera a sua posição na array.
SlotNumber é o numero de slots que o nosso inventario possuira, nesse tutorial utilizarei 50, mas sinta-se livre para utilizar qualquer outro numero, mais abaixo, destacarei algumas informações,
que caso o numero de slots seja diferente, precisarão ser alteradas.
Agora que ja criamos os slots, ta na hora de popularmos eles com itens nulos, oque repesentaria um espaço vazio, isso não é obrigado, mas eu sempre gosto de deixar o primeiro registro de item, classe,
skill, quest,e outras coisas, como "Nothing", mas você também pode so utilizar zero, ou um valor negativo.
Código: Selecionar todos
///Inicializa os slots
for(var i = 0; i < SlotNumber; i ++){
Inv[i, 0] = Itn[ItnNothing, 0];
Inv[i, 1] = 0;
}
uma variavel, e enquanto a condição for verdadeira, ele vai repetir uma ação, no nosso caso "i = 0" e enquanto i for menor que SlotNumber(50), i recebe +1, nesse caso, i vai de 0 a 49, 50 repetições!
e basicamente essa repetição esta dizendo que cada slot do inventario vai receber o Itn[ItnNothing, 0] e o Inv[(0 a 49), 1] vai receber 0, que no caso é a quantidade.
A manipulação desse tipo de inventario não é muito complicada, por exemplo, você pode colocar um item em um slot assim "Inv[10, 0] = Itn[ItnFuckingSword, 0]; Inv[10, 1] = 1".
No final seu codigo deve ficar mais ou menos assim:
Código: Selecionar todos
/// @description Inicializa o inventario
///Carrega os itens
ItemData();
///Variaveis
globalvar Inv, InvID, InvQnt, SlotNumber;
InvID = 0;
InvQnt = 1;
SlotNumber = 50;
SlotRows = 10;
SlotLines = 5;
InvX = -1;
InvY = -1;
OverInv = -1;
///Inicializa os slots
for(var i = 0; i < SlotNumber; i ++){
Inv[i, 0] = Itn[ItnNothing, 0];
Inv[i, 1] = 0;
}
InventoryDraw
Agora daremos inicio a parte visual do inventario, por agora, faremos os slots e os itens dentro deles, apartir de agora, se optou por um numero diferente de slots no inventario, teraque alterar algumas informações
dentro do "InventoryInit" crie as seguintes variaveis
Código: Selecionar todos
SlotRows = 10;
SlotLines = 5;
Código: Selecionar todos
///Slots
for (var i = 0; i < SlotRows; i ++){
for (var l = 0; l < SlotLines; l ++){
draw_sprite(sSlot, 0, 100 + 34 * i, 100 + 34 * l);
}
}
no meu codigo eu utilizo 100, como uma posição inicial da tela, e depois vem 34 * i, o tamanho da minha sprite é de 32, mas utilizo 34 para que tenha uma separação de 2 pixels
entre cada slot, a mesma coisa na posição Y da função, caso você tenha feito uma quantidade menor de slots, pode tentar utilizar numeros diferentes para o for, ou então desenhar cada um
separadamente, cabe a você decidir como quer que seu inventario seja exibido, caso tenha alguma duvida e queira alguma ajuda, basta comentar abaixo que ficarei feliz em ajudar
Agora, vamos desenhar os itens dentro dos slots
Código: Selecionar todos
///Itens em seus slots
for (var i = 0; i < SlotRows; i ++){
for (var l = 0; l < SlotLines; l ++){
if (Inv[(i + (10 * l)), 0] != ItnNothing){
draw_sprite(Itn[Inv[(i + (10 * l)), 0],ItnSprite], 0, 100 + 34 * i, 100 + 34 * l);
}
}
}
lot de 0 a 49, for diferente do item "Nada" ele vai desenhar, mas caso o item dentro do slot seja o "Nada" ele vai so ignorar ele, e a outra diferença é na sprite informada no draw_sprite.
Lembra das posições que criamos para as Arrays "Itn" e "Inv"? então, teremos que acessar elas, basicamente estamos querendo a sprite armazenada dentro da "Itn[Item, ItnSprite]",
mas tem que ser do item de dentro de um slot do inventario, então no lugar do ID do item, utilizamos a propria array "Inv" que ira retornar o ID do item que esta la dentro.
o pequeno calculo que estão vendo ali dentro, nada mais é do que um pequeno calculo que vai de 0 a 49, no caso, i vai de 0 a 9, e l vai de 0 a 4, então o valor de i recebe o valor de l * 10
"i + (10 * l)", é mais simples do que parece xD,você ja pode executar o seu projeto, que vera que os slots estão desenhados na tela, e caso tenham adicionado algum item em um slot,
vai dar pra ver ele dentro do slot, ao executar você vera algo semelhante a isso.
,
no final, seu codigo deve ficar mais ou menos assim...
Código: Selecionar todos
/// @description Draws do inventario
///Slots
for (var i = 0; i < SlotRows; i ++){
for (var l = 0; l < SlotLines; l ++){
draw_sprite(sSlot, 0, 100 + 34 * i, 100 + 34 * l);
}
}
///Itens em seus slots
for (var i = 0; i < SlotRows; i ++){
for (var l = 0; l < SlotLines; l ++){
if (Inv[(i + (10 * l)), 0] != ItnNothing){
draw_sprite(Itn[Inv[(i + (10 * l)), 0],ItnSprite], 0, 100 + 34 * i, 100 + 34 * l);
}
}
}
InventoryUpdate
Aqui basicamente, sera onde vamos controlar o inventario e suas interalçoes com o jogador, mas primeiro, precisamos criar algumas variaveis, dentro do "InventoryInit" faça:Código: Selecionar todos
InvX = -1;
InvY = -1;
OverInv = -1;
InvY Sera a posição horizontal de nosso mouse no inventario.
OverInv Sera a posição do mouse no inventario.
e dentro do "InventoryUpdate" faça:
Código: Selecionar todos
mX = mouse_x;
mY = mouse_y;
mY é a posição y do mouse.
Detalhe!! Aqui, eu utilizo apenas a posição X e Y do mouse, mas caso no seu jogo, o inventario siga o player pela camera, não ira funcionar da mesma maneira, caso esteja utilizando camera você
pode fazer algo parecido com:
Código: Selecionar todos
mX = mouse_x - camera_get_view_x(view_camera[0]);
mY = mouse_y - camera_get_view_y(view_camera[0]);
agora vamos ao que importa, apos criar todas essas variaveis, iremos começar criando dois "for" um para o InvX e outro para o InvY,
Código: Selecionar todos
for (var i = 0; i < SlotRows; i ++){
if (mX > 83 + (34 * i) && mX < 117 + (34 * i)){
InvX = i;
}
if (mX > 114 + (34 * i) && mX < 117 + (34 * i)){
InvX = -1;
}
}
for (var i = 0; i < SlotLines; i ++){
if (mY > 83 + (34 * i) && mY < 117 + (34 * i)){
InvY = i;
}
if (mY > 114 + (34 * i) && mY < 117 + (34 * i)){
InvY = -1;
}
}
no caso a posição em que você os desenhou no "InventoryDraw", no meu caso foi 100, mas como as sprites estão com o ponto de origem centralizado, tenho que subtrair 16
e deixei mais um pixel como margem e o for é utilizado para verificar os demais slots, logo o InvX recebe o valor de i.
no segundo if, verifico se o Mouse esta entre os slots horizontalmente, caso ele esteja entre algum slot, o InvX recebe -1, o mesmo se repete para o InvY.
Agora, você pode por dentro do inv draw a seguinte linha, para debug.
Código: Selecionar todos
draw_text(0, 0, string(mX) + "/" + string(mY) + "/" + string(InvX) + "/" + string(InvY) + "/" + string(OverInv));
agora, iremos verificar se o mouse estiver fora da area destinada ao inventario.
Código: Selecionar todos
if (mX < 84 || mY < 84 || mX > 420 || mY > 250){
InvX = -1;
InvY = -1;
}
agora iremos definir o OverInv.
Código: Selecionar todos
if (InvX != -1 && InvY != -1){
OverInv = (InvX + (10 * InvY));
}else{
OverInv = -1;
}
por exemplo, se posicionar o mouse no ultimo slot da esquerda inferior, InvX vai ser 9, e InvY vai ser 4, logo OverInv ira te retornar 49, mas caso InvX ou InvY seja igual -1,
OverInv ira receber -1 também, com isso, terminanos por enquanto com o "InventoryUpdate".
Criando Seletor de Itens
Bom agora iremos criar uma pequena sprite sobre o slot selecionado, para o jogador melhor visualizar onde e qual slot esta sendo selecionado e isso, é bem simples, basta fazer isso:Código: Selecionar todos
///Seletor
if (OverInv != -1){
draw_sprite(sSelect, 0, 100 + (34 * InvX), 100 + (34 * InvY));
}
e funcionar!
Selecionando Itens
Agora, iremos fazer a seleção dos itens, mas primeiro, abra o "InventoryDraw" e adicione a seguinte linha:Código: Selecionar todos
///Quantidade de itens
draw_set_color(c_black);
for (var i = 0; i < SlotRows; i ++){
for (var l = 0; l < SlotLines; l ++){
draw_text(100 + 34 * i, 100 + 34 * l, string(Inv[(i + (10 * l)), InvQnt]))
}
}
draw_set_color(c_white);
Agora, no "InventoryInit" crie as seguintes variaveis:
Código: Selecionar todos
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
ItnSelectQnt: sera a variavel que armazenara a quantidade do item selecionado.
InvSelect: armazenara a posição do inventario em que selecionamos o item.
Com as variaveis criadas, vamos começar utilizar elas, no "InventoryUpdate", adicione as seguintes linhas de codigo:
Código: Selecionar todos
///Seleciona Item
if (mouse_check_button_pressed(mb_left)){
if (OverInv!= -1){
if (ItnSelect == -1){
if (Itn[Inv[OverInv, InvID], ItnID] != Itn[ItnNothing, ItnID]){
ItnSelect = Itn[Inv[OverInv, InvID], ItnID];
ItnSelectQnt = Inv[OverInv, InvQnt];
InvSelect = OverInv;
Inv[OverInv, InvID] = Itn[ItnNothing, ItnID];
Inv[OverInv, InvQnt] = 0;
}
}
}
}
if (mouse_check_button_pressed(mb_right)){
if (OverInv != -1){
if (ItnSelect == -1){
if (Itn[Inv[OverInv, InvID], ItnID] != Itn[ItnNothing, ItnID]){
ItnSelect = Itn[Inv[OverInv, InvID], ItnID];
ItnSelectQnt = 1;
InvSelect = OverInv;
Inv[OverInv, InvQnt] --;
if (Inv[OverInv, InvQnt] <= 0){
Inv[OverInv, InvID] = Itn[ItnNothing, ItnID]
Inv[OverInv, InvQnt] = 0;
}
}
}
}
}
if (mouse_check_button_released(mb_left)){
if (ItnSelect != -1){
if (OverInv != -1){
if (Inv[OverInv, InvID] == Itn[ItnNothing, ItnID]){
Inv[OverInv, InvID] = Itn[ItnSelect, ItnID];
Inv[OverInv, InvQnt] = ItnSelectQnt;
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
}else{
if (Inv[OverInv, InvID] == Itn[ItnSelect, ItnID]){
Inv[OverInv, InvQnt] += ItnSelectQnt;
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
}else{
Inv[InvSelect, InvID] = Itn[ItnSelect, ItnID];
Inv[InvSelect, InvQnt] += ItnSelectQnt;
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
}
}
}else{
Inv[InvSelect, InvID] = Itn[ItnSelect, ItnID];
Inv[InvSelect, InvQnt] += ItnSelectQnt;
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
}
}
}
if (mouse_check_button_released(mb_right)){
if (ItnSelect != -1){
if (OverInv != -1){
if (Inv[OverInv, InvID] == Itn[ItnNothing, ItnID]){
Inv[OverInv, InvID] = Itn[ItnSelect, ItnID];
Inv[OverInv, InvQnt] = ItnSelectQnt;
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
}else{
if (Inv[OverInv, InvID] == Itn[ItnSelect, ItnID]){
Inv[OverInv, InvQnt] += ItnSelectQnt;
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
}else{
Inv[InvSelect, InvID] = Itn[ItnSelect, ItnID];
Inv[InvSelect, InvQnt] += ItnSelectQnt;
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
}
}
}else{
Inv[InvSelect, InvID] = Itn[ItnSelect, ItnID];
Inv[InvSelect, InvQnt] += ItnSelectQnt;
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
}
}
}
Código: Selecionar todos
///Desenha o item selecionado
if (ItnSelect != -1){
draw_sprite(Itn[ItnSelect, ItnSprite], 0, mX, mY);
}
Conclusão
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Bom, é um sistema bem simples, se fosse para dar um nivel de dificuldade, eu diria, que de 0 a 10, seria 4, afinal você não precisa de conhecimento nenhum, tudo que eu fiz foi declarar algumas variaveis,
ao pressionar o botão esquerdo sobre um item, você retira ele de seu slot, e ao soltar, coloca ele no slot que estiver por baixo, se estiver vazio é claro, e o direito faz basicamente a mesma coisa, so
que so retia uma unidade do item, esse foi meu primeiro tutorial, então se de alguma maneira, o modo como eu formatei o post, expliquei as coisas não lhe agradou ou não foi muito claro, basta comentar abaixo a sua
duvida/reclamação, que eu farei questão de corrigir, obrigado pra todo mundo que leu ate aqui, moderadores/administradores sintam-se livres para modificar/apagar o topico caso ele não esteja de acordo com as regras,
ou caso o considerem desnecessario, obrigado!
Ah e como a maioria deve ter percebido, o nivel de organização do topico foi decaindo ao decorrer do tutorial, isso se deve ao fato de eu estar meio sem tempo, e como eu ja tinha investido um pouco de tempo escrevendo isso,
eu decidi terminar ele logo, ao invez de desistir(como na maioria dos casos), peço desculpas pela falta de organização e pelos erros de portugues e outros, muito Obrigado, ate a proxima c-c.
ao pressionar o botão esquerdo sobre um item, você retira ele de seu slot, e ao soltar, coloca ele no slot que estiver por baixo, se estiver vazio é claro, e o direito faz basicamente a mesma coisa, so
que so retia uma unidade do item, esse foi meu primeiro tutorial, então se de alguma maneira, o modo como eu formatei o post, expliquei as coisas não lhe agradou ou não foi muito claro, basta comentar abaixo a sua
duvida/reclamação, que eu farei questão de corrigir, obrigado pra todo mundo que leu ate aqui, moderadores/administradores sintam-se livres para modificar/apagar o topico caso ele não esteja de acordo com as regras,
ou caso o considerem desnecessario, obrigado!
Ah e como a maioria deve ter percebido, o nivel de organização do topico foi decaindo ao decorrer do tutorial, isso se deve ao fato de eu estar meio sem tempo, e como eu ja tinha investido um pouco de tempo escrevendo isso,
eu decidi terminar ele logo, ao invez de desistir(como na maioria dos casos), peço desculpas pela falta de organização e pelos erros de portugues e outros, muito Obrigado, ate a proxima c-c.
Downloads
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-