Página 1 de 1

Inventario e opções ao utilizar os itens

Enviado: Qui Ago 25, 2016 12:20 pm
por Rouca_SG
Olá pessoal. Olha eu aqui de novo pedindo ajuda e a opinião de vocês. 

Então, eu estou fazendo um jogo no gamemaker e eu estive pesquisando um longo tempo sobre inventarios... E consegui criar um bem simples mais legalzinho...

Basicamente, existe um obj_inventario que cria e replica um obj_slot na quantidade que eu determinar... e as subimagens do sprite do obj_slot mostram os item, tipo se eu peguei o item 1 a sub imagem que aparece na sprite do obj_slot é a 1, e assim por diante... 
E quando se clica com o mouse de algum slot com itens ele gasta a quantidade do item e zera o slot
Exatamente o que eu queria

Mas agora eu to com um problema... 
Eu queria saber como por opções de Usar, combinar, e soltar os itens.... 
Tipo, eu programei um obj_opçoes que deve ser criado ao clicar com o mouse encima do obj_slot caso ele esteja com itens e num draw o texto das opções é desenhado... 
Eu clico, as opções aparecem e eu posso escolher o que fazer.... tudo funciona perfeitamente.
O grande problema é que as opções só aparece para o primeiro slot criado e não para as replicas... como se apenas aquele obj_slot estivesse lá

Minha duvida é: existe alguma forma de identificar cada objeto replicado? 
Tipo, obj_slot[1], obj_slot[2] ou sei lá?

Ou não sei, uma maneira mais fácil de exibir as opções sem criar um obj_opções?? tipo no proprio obj_slot?

Estive pensando em colocar no obj_slot um comando de mouse_in e mouse_over para as opções aparecerem, mas não sei ainda como relaciona-la para o slot certo, com os itens certos...

kkkkk Eu estou falando muita besteira aqui????? 
Eu ainda sou novata nisso e minhas soluções para os problemas geralmente criam problemas maiores hahaha

Por isso preciso da opinião de vocês =)

Re: Inventario e opções ao utilizar os itens

Enviado: Qui Ago 25, 2016 6:54 pm
por gabrielsch
Você bem que poderia postar o seu código atual para entendermos melhor.
Pelo que eu entendi você cria vários objetos obj_slot e cada um se encarrega de mostrar um item especifico mas eu ainda não entendi como você armazena esse tipo de informação, sem código fica complicado.

Re: Inventario e opções ao utilizar os itens

Enviado: Sex Ago 26, 2016 11:42 am
por Rouca_SG
Haha, desculpe não ter colocado os códigos, eu não sabia mesmo como fazer isso.
Vou colocar aqui abaixo:

Ah, esses códigos que peguei, vieram de exemplos de engine que achei aqui no forum e no antigo... 
Infelizmente eu vi tantas diferentes que nem sei quem fez esse que estou usando haha
Mas é simples de entender e me serviu muito bem para o que eu quero

Esse é o script responsável por criar os slots:

Código: Selecionar todos

///scr_criar_slots

//quantidade de slots
slots = argument0;

//maximo por slot
max_slot = argument1;

//---------------------
var spr   atual;
atual = 1;

spr = sprite_index;
sprite_index = spr_slot;
for(Y = 0 Y < ceil( sqrt(  slots)* sprite_height)    Y += sprite_height){
for(X = 0 X < floor( sqrt(  slots)* sprite_height) X += sprite_width){
//criar slots-----------------
if(atual <= slots){
slot[atual] = instance_create(x + X, y + Y,obj_slot);
slot[atual].item = 0;
slot[atual].quantidade = 0;
slot[atual].X = X;
slot[atual].Y = Y;
slot[atual].pai = id;
//---------------------
atual += 1;
}
}
}

Esse é o script que gerenciar os itens:

Código: Selecionar todos

///scr_item

var slot; slot = 1;
while(slot <= instance_number(obj_slot)){


if(obj_inventario.slot[slot].quantidade < obj_inventario.max_slot
 and obj_inventario.slot[slot].item = argument0)
or
(obj_inventario.slot[slot].quantidade = 0)
  {
obj_inventario.slot[slot].item = argument0;
obj_inventario.slot[slot].quantidade += 1;
instance_destroy();
exit
}
else
{
slot += 1;
}
}

E aqui é o código que fica no evento Draw do obj_slot :

Código: Selecionar todos

///no evento draw do obj_slot

draw_set_font(fnt_slot);
draw_set_color(c_white)
image_index = item;
x = pai.x + X;
y = pai.y + Y;
draw_sprite(sprite_index,image_index,x,y);
draw_text(x + 20, y + 20, quantidade);
Aqui a imagem de como o inventario fica:

Imagem

E aqui são as opões que eu estou tentando fazer:
Imagem

Eu queria que essas opções aparecem ao lado de cada respectivo slot quando o mouse passasse por cima... 
E eu, boba e inocente, pensei que colocar um instance_create para gerar o objeto das opções seria o suficiente.... 
Me enganei feio não é hahaha

Espero que possam me ajudar =)

Re: Inventario e opções ao utilizar os itens

Enviado: Sex Ago 26, 2016 4:53 pm
por Denis Lemos
Já que os slots são objetos, fica bem mais fácil criar o obj_opcoes em cima deles.

Basta colocar um código no obj_slot para quando o mouse estiver em cima dele, então criar o obj_spcoes. Caso o mouse não estiver em cima do obj_slot, então deletar o obj_opcoes que foi criado, se ele existir é claro. Tem que tomar cuidado na hora de deletar o obj_opcoes, para que delete somente o que foi criado pelo slot em uso. Para fazer isso, tem que guardar o id do obj_opcoes criado e deletar somente a instância com esse id, caso contrário todas as instâncias serão deletadas da cena.

No Evento Create do obj_slot

Código: Selecionar todos

options_ID = noone;//Declara a variável para guardar o id da instância do obj_opcoes

No Evento Step do obj_slot

Código: Selecionar todos

if(position_meeting(mouse_x, mouse_y, self))//Verifica se o mouse está em cima deste slot apenas
{
    if(options_ID == noone)//Se a id estiver vazia
    {
        options_ID = instance_create(x,y, obj_opcoes);//Cria uma instância do obj_opcoes e salva o seu id dentro dessa variável
    }
}
else//Se o mouse não estiver em cima desse slot
    {
        if(options_ID)//Se existir uma instância guardada dentro dessa variável
        {
            with(options_ID)instance_destroy();//Destroi a instância com o id que foi guardado anteriormente
            options_ID = noone;//Deixa a id vazia novamente
        }
    }
Não esqueça de colocar um depth menor para o obj_opcoes aparecer na frente do slot.
PS: Eu testei aqui e funcionou lindamente!

Re: Inventario e opções ao utilizar os itens

Enviado: Sáb Ago 27, 2016 10:49 am
por Rouca_SG
Denis! Obrigada pelo ajuda \o/
Eu coloquei ainda uma condição para esse código só executasse quando o slot estivesse com itens e foi exatamente como você falou:
"funcionou lindamente" =D

Mas agora me apareceu outro problema hahaha
(acho que já disse que as soluções dos meus problemas sempre geram problemas maiores)

Então, não é nada com seu código, eu acho... Eu que devo ter feito alguma coisa errada nos outros objetos, copiado algo fora do lugar, ou sei lá...
 Mas o código que eu uso para fazer o item ser usado parece gerar algum conflito.

Código: Selecionar todos

if(quantidade > 0){
            if  (item=1){
                show_message("Usar item 1?")
                quantidade -= 1;
                }
            if  (item=2){
                show_message("Usar item 2?")
                quantidade -= 1;
                }
            if  (item=3){
                show_message("Usar item 3?")
                quantidade -= 1;
            }
            if  (item=4){
                show_message("Usar item 4?")
                quantidade -= 1;
            }
        }
    else{

}
    if(quantidade == 0){
    item = 0;
    }
Eu uso esse codigo para quando se clica na opção USAR. 
Mas agora ele afeta a todos os slots não apenas ao que eu estou clicando. entende?
Não importa se um slot tem 3 itens, 5, 7 , ou 0 ... se eu utilizar a opção, todos os slots se igualam em numero,  mesmo os slots que estão vazios. ou ficam com 2 ou 1 itens marcados (mesmo sem item)
Tenho um exemplo de engine aqui (que não utiliza o obj_opções) que elimina os itens com esse codigo ao clicar com o mouse no obj_slot. e tudo funciona perfeitamente.
Já que esse codigo ficava no obj_slot e agora eu mudei ele para o obj_opções tenho que relacionar as variáveis quantidade e item com o obj_slot que é onde as informações estão armazenadas.
Então eu coloquei obj_slot.item e obj_slot.quantidade para fazer funcionar e, com toda certeza esse deve ser o problema  aqui, 
o programa está vendo todos os slots como um obj só kkkkkkk
Não sei o que fazer para acertar as coisas :P
Preciso de ajuda!!!

Re: Inventario e opções ao utilizar os itens

Enviado: Sáb Ago 27, 2016 1:54 pm
por Denis Lemos
Rouca_SG escreveu: Então eu coloquei obj_slot.item e obj_slot.quantidade para fazer funcionar e, com toda certeza esse deve ser o problema  aqui, 
o programa está vendo todos os slots como um obj só kkkkkkk
Não sei o que fazer para acertar as coisas :P
Preciso de ajuda!!!
Sim, é exatamente esse o problema! Lembra do post anterior que eu expliquei que tem que guardar o id do obj_opcoes que foi criado, para poder deletar apenas ele em vez de todas as cópias dessa instância? Esse é o mesmo caso, você precisa guardar o id do obj_slot de onde o obj_opcoes foi criado, para alterar apenas os itens desse slot.
No Evento Create do obj_opcoes você precisa declarar uma variável que vai guardar o id do slot a qual ele pertence.

Código: Selecionar todos

slot_ID = noone;//Declara a variável para guardar o id do slot de origem
Agora você só precisa definir o id do slot no mesmo código que te passei no post anterior, no momento da criação do obj_opcoes. No Evento Step do obj_slot.

Código: Selecionar todos

if(position_meeting(mouse_x, mouse_y, self))//Verifica se o mouse está em cima deste slot apenas.
{
    if(options_ID == noone)//Se a id estiver vazia.
    {
        options_ID = instance_create(x,y, obj_opcoes);//Cria uma instância do obj_opcoes e salva o seu id dentro dessa variável.
        options_ID.slot_ID = id;//Salva o id desse slot na variável slot_ID do obj_opcoes.
        //options_ID.slot_ID = self;
    }
}
else//Se o mouse não estiver em cima desse slot
    {
        if(options_ID)//Se existir uma instância guardada dentro dessa variável.
        {
            with(options_ID)instance_destroy();//Destroi a instância com o id que foi guardado anteriormente.
            options_ID = noone;//Deixa a id vazia novamente.
        }
    }
Então, em vez de mudar o valor dos itens usando o nome do obj_slot que fará os itens de todos os slots mudar, você usa o id do slot salvo dentro da variável slot_ID, isso vai fazer mudar apenas os itens daquela instância em especial.
Ex:

Código: Selecionar todos

slot_ID.item = 1;
slot_ID.quantidade = 3;
Sugiro que você pratique bastante o uso de IDs e como fazer um bom uso delas, pois facilitam um monte na criação dos jogos e quase sempre são necessárias, pois na maioria dos casos nós precisamos alterar apenas uma instância em especial do objeto na cena e não todas elas.

Re: Inventario e opções ao utilizar os itens

Enviado: Dom Ago 28, 2016 9:52 am
por Rouca_SG
Ei, obrigada de novo Denis :D
Eu já estava mesmo planejando  usar o seu codigo para concertar o meu inventario, mas eu não sabia bem como representar o que eu estava pensando nos objetos kkkk
Funcionou direitinho \o/
Existe tanta coisa sobre GameMaker que eu não fazia ideia, já aprendi mais uma nova agora hahaha
Vou anotar o uso de ID's na minha lista de estudos, pois com certeza ainda vou precisar muito :D

Estou muito grata pela ajuda!