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



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!
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", nossos
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.
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 delas
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"
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, tera
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"
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:
InvX Sera a posição vertical de nosso mouse no inventario.
InvY Sera a posição horizontal de nosso mouse no inventario.
OverInv[b] Sera a posição do mouse no inventario.
e dentro do "InventoryUpdate" faça:
[b]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".
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:
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!
Agora, iremos fazer a seleção dos itens, mas primeiro, abra o "InventoryDraw" e adicione a seguinte linha:
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", nossos
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.
Código: Selecionar todos
///Variaveis
globalvar Itn, ItnID, ItnName, ItnDesc, ItnSprite;
ItnID = 0;
ItnName = 1;
ItnDesc = 2;
ItnSprite = 3;
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.
Código: Selecionar todos
///Itens
globalvar ItnNothing, ItnPotion;
ItnNothing = 0;
ItnPotion = 1;
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
Código: Selecionar todos
Itn[ItnNothing, ItnID] = 0;
Itn[ItnNothing, ItnName] = "Nada";
Itn[ItnNothing, ItnDesc] = "Nada";
Itn[ItnNothing, ItnSprite] = 0;
que basicamente seria a mesma coisa de
Código: Selecionar todos
Itn[0, 0] = 0;
Itn[0, 1] = "Nada";
Itn[0, 2] = "Nada";
Itn[0, 3] = 0;
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
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;
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.
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 delas
Código: Selecionar todos
///Inicializa os itens
ItemData();
///Variaveis
globalvar Inv, InvID, InvQnt, SlotNumber;
InvID = 0;
InvQnt = 1;
SlotNumber = 50;
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.
Código: Selecionar todos
///Inicializa os slots
for(var i = 0; i < SlotNumber; i ++){
Inv[i, 0] = Itn[ItnNothing, 0];
Inv[i, 1] = 0;
}
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:
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;
}
Por agora, também vamos encerrar as atividades com o "InventoryInit", nosso proximo passo agora é o "InventoryDraw"
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, tera
que alterar algumas informações
dentro do "InventoryInit" crie as seguintes variaveis
Código: Selecionar todos
SlotRows = 10;
SlotLines = 5;
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!
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);
}
}
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
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);
}
}
}
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...
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);
}
}
}
Agora iremos para o script "InventoryUpdate"
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;
InvX Sera a posição vertical de nosso mouse no inventario.
InvY Sera a posição horizontal de nosso mouse no inventario.
OverInv[b] Sera a posição do mouse no inventario.
e dentro do "InventoryUpdate" faça:
Código: Selecionar todos
mX = mouse_x;
mY = mouse_y;
[b]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:
Código: Selecionar todos
mX = mouse_x - camera_get_view_x(view_camera[0]);
mY = mouse_y - camera_get_view_y(view_camera[0]);
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,
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;
}
}
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.
Código: Selecionar todos
draw_text(0, 0, string(mX) + "/" + string(mY) + "/" + string(InvX) + "/" + string(InvY) + "/" + string(OverInv));
ela ira desenhar na tela as informações sobre as variaveis.
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;
}
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.
Código: Selecionar todos
if (InvX != -1 && InvY != -1){
OverInv = (InvX + (10 * InvY));
}else{
OverInv = -1;
}
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".
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));
}
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!
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);
Ela servira para desenhar a quantidade dos itens que temos.
Agora, no "InventoryInit" crie as seguintes variaveis:
Código: Selecionar todos
ItnSelect = -1;
ItnSelectQnt = 0;
InvSelect = -1;
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:
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;
}
}
}
e para finalizar, de volta no "InventoryDraw" adicione:
Código: Selecionar todos
///Desenha o item selecionado
if (ItnSelect != -1){
draw_sprite(Itn[ItnSelect, ItnSprite], 0, mX, mY);
}
esse codigo basicamente ira desenhar no mouse, o item atualmente selecionado, e pronto, seu inventario esta finalizado funcionando!!(assim espero kk)
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
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
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-