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.

GS 2: Como troca o objeto usando DragAndDrop

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Seg Dez 28, 2020 1:43 pm

Boa tarde
Dev,

Como que troca um objeto usando drag and drop igual ao minecraft.

Segue o link do gif:

https://gfycat.com/informalfamiliargosling

Como o mouse segurando o objeto ao clicar no outro objeto eles trocam de posiçoes.

Como que faz isso?

Obrigado pela ajuda.

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Seg Dez 28, 2020 8:55 pm

Você pode quando a troca ocorrer, armazenar o objeto do inventario em uma variável temporária, e então substituir o que esta no slot pelo item do mouse. Ao final a variável que representa o item do mouse, atribuir o item temporário que antes estava no slot.

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Ter Dez 29, 2020 9:45 pm

Boa noite
grononmc,

O que tenho que acrecentar no codigo?

Código: Selecionar todos

if (mouse_check_button_pressed(mb_left)) {
    Drag = instance_position(mouse_x, mouse_y,self);


} 

Event Step

if Drag!= noone  
{
    if mouse_check_button(mb_left) 
	{
       Drag.x = mouse_x;
       Drag.y = mouse_y;
       	  
	  }

Quando clico no objeto ele segura os dois; tentei fazer o que voce falou, mas nao funcionou, pq?

Obrigado pela ajuda.

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Qua Dez 30, 2020 12:01 pm

Esse é todo o código?

Você poderia usar um objeto controlador para fazer o intermediário entre o item e o slot do inventário, nele você saberia se a posição do mouse esta em cima de um item ou slot.

E na verdade depende da forma que você esta fazendo, você criou um objeto slot ou esta usando grid?

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Qua Dez 30, 2020 1:26 pm

Boa tarde
grononmc,

E um codigo simples de drag and drop, o meu slot e um objeto.

Entao to pensando ainda como travar o item no slot.

Vlw pela ajuda.

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Qua Dez 30, 2020 4:33 pm

Fiz um exemplo aqui, para você ter uma ideia.
Ao invés de usar o objeto item seguindo o mouse, fiz com que a variável salvasse o asset(object_index), e simplesmente desenhei sua sprite na tela.
O exemplo é simples mas creio que seja isto que esteja procurando.
InventarioExemplo (v1.4.9999)

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Sáb Jan 02, 2021 6:05 pm

Boa tarde
grononmc,

Vlw, vou ver como e logica e adaptar no meu. Pq usou o object_index para desenhar o sprite? e para economizar memoria?

Obrigado pela ajuda

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Sáb Jan 02, 2021 7:39 pm

Sim, eu optei em usar o object_index, para ser mais simples, sem ter que arrastar o objeto, fica mais simples salvar somente o ID do asset, já que pelo que vi você não precisará de informações adicionais do objeto tais como características do item, mas mesmo assim se precisar, você pode usar um ds_map, salvando o object_index e as demais informações do objeto, uma variável que faz todo o controle é bem mais prático.

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Seg Jan 04, 2021 7:04 pm

Boa tarde
grononmc,

Entao cara acho que preciso sim, pois faço varias comparaçoes entre o objeto item do player e o que esta no slot. Sabe verificar o que tem mais ataque, qual e o item mais caro e etc.

Cara se usasse o xprevious e o yprevious para troca de posiçao?

Como usa o ds_map?

Muito obrigado.

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Ter Jan 05, 2021 1:02 pm

O x/yprevious, salva a ultima posição do frame anterior do objeto, não tem o porque utiliza-lo.

O ds_map, é bem simples de usar, nele você tem uma chave e um valor atribuído a ela, é basicamente uma lista de variáveis, veja:

Você pode usar o ds_map_add ou usar o ? para adicionar e ou retornar o valor da chave.

Código: Selecionar todos

// Adiciona os valores
var item = ds_map_create();
    item[?"object_index"] = object_index;
    item[?"damage"] = 10;
    item[?"attack_speed"] = 3.5;
    item[?"value"] = 100;

// Acessa os valores
var velocidade_do_ataque = item[?"attack_speed"];
var valor_do_item = item[?"value"];

// etc...
Obviamente vai ter que mudar algumas coisas no código que te mandei, ao invés de adicionar o object_index à global.ItemMouse, deve-se adicionar o ds_map que contém todas as informações sobre o item.

Vou deixar também um código de arrastar o objeto caso queira ainda:
Arrastar objeto: Clique para ver o conteúdo

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Ter Jan 05, 2021 6:57 pm

Boa tarde
grononmc,

O x/yprevious pensei que ele pegava a ultima posiçao.Vlw

Posso usar variavel no objeto, ex:

Código: Selecionar todos


ItemAtaque = 1; // valor fictício
ItemDefesa = 10;
...
E mais lento? Existe uma diferencia?

Muito obrigado pela ajuda.

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Ter Jan 05, 2021 7:53 pm

Sim o x/yprevious pega a posição anterior, mas a não a posição em que o item foi criado.

A única diferença é que, na outra você usa ds_map, ao invés da instancia, lento não fica.

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Ter Jan 05, 2021 8:46 pm

Boa noite
grononmc,

Qual e a recomendaçao de uso: ds_map ou instancia?

Obrigado pela ajuda.

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Ter Jan 05, 2021 11:01 pm

GhostPower escreveu:Boa noite
grononmc,

Qual e a recomendaçao de uso: ds_map ou instancia?

Obrigado pela ajuda.
Qual se sentir melhor, vai do gosto ou propósito.

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Qui Jan 07, 2021 6:23 pm

Boa noite
grononmc,

Blz, vou de instancia mesmo pq ja estou familiarizado.


Obrigado pela ajuda.

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Sáb Jan 09, 2021 9:18 pm

Boa noite
grononmc,

Estou tentando fazer a troca, mas antes queria que o objeto item seguisse o mouse quando eu click(pressed) ate quando clicar de novo para parar.

Olha o codigo usando:

Código: Selecionar todos

var itemDrag = instance_position(mouse_x, mouse_y, self);
if(global.ItemMouse == noone) {
   if(mouse_check_button_pressed(mb_left)) {
       x = mouse_x;// Segue o mouse 
       y = mouse_y;//
if(itemDrag != noone)
          global.ItemMouse = itemDrag;
		}
}else {
   if(mouse_check_button(mb_left)) {
       global.ItemMouse.x = mouse_x;
       global.ItemMouse.y = mouse_y;
   }else {
       global.ItemMouse = noone;
   }
}


O codigo esta certo, pois testei ele quando e comprado o item segue o mouse.

O que esta errado?Por que quando e clicado(pressed) e diferente?

Muito obrigado pela ajuda.

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Sáb Jan 09, 2021 9:43 pm

Porque o pressed, é somente uma vez, a parte de seguir o mouse esta na parte caso a condição global.ItemMouse seja diferente de noone, ou seja se estiver com o botão esquerdo apertado e o global.ItemMouse for diferente de noone o item segue o mouse.
O jeito que você esta tentando fazer não funciona porque ele só vai seguir se estiver clicando, o Pressed é somente quando o botão do mouse é pressionado e não segurado.

Para você fazer seguir somente clicando uma vez, pode então pode fazer assim:

Código: Selecionar todos

var itemDrag = instance_position(mouse_x, mouse_y, self);
if(global.ItemMouse == noone) {
	if(mouse_check_button_pressed(mb_left)) {
		if(itemDrag != noone)
			global.ItemMouse = itemDrag;
	}
}else {
	// Segue o mouse
	global.ItemMouse.x = mouse_x;
	global.ItemMouse.y = mouse_y;
	// Quando pressionar novamente solta o item
	if(mouse_check_button_pressed(mb_left)) {
		global.ItemMouse = noone;
	}
}
Nem testei, mas creio que funcionara.

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Seg Jan 11, 2021 8:56 pm

Boa noite
grononmc,

Vlw funcionou, Com seria para travar o item dentro do slot e ser "puxado" automaticamente no slot?

Teria que usar:

Código: Selecionar todos

 slot = instance_position(mouse_x, mouse_y, obj_slot); //verifica se esta em cima do slot
Muito obrigado pela.

Avatar do usuário
Chuaschinai
Colaborador
Colaborador
Reações: 6
Mensagens: 198

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por Chuaschinai » Seg Jan 11, 2021 9:54 pm

Sim, você pode checar com o instance_position, caso esteja em colisão, ele adicionar no slot sem precisar soltar o botão e desabilita a variável do mouse.

Avatar do usuário
GhostPower
Membro
Membro
Reações: 0
Mensagens: 97

Re: GS 2: Como troca o objeto usando DragAndDrop

Mensagem por GhostPower » Sáb Jan 16, 2021 5:16 pm

Boa tarde
Chuaschinai,

Estou tentando fazer mais o que esta errado?

Código: Selecionar todos


var itemDrag = instance_position(mouse_x, mouse_y, obj_item);
var slotItem = instance_position(mouse_x, mouse_y, obj_slotItem);

if(global.ItemMouse == noone) {
   if(mouse_check_button_pressed(mb_left)) {
       if(itemDrag != noone)
          global.ItemMouse = itemDrag;
		}
}else {
   global.ItemMouse.x = mouse_x;
   global.ItemMouse.y = mouse_y;
    if(mouse_check_button_pressed(mb_left)) {
       if slotItem != noone // Ele nao verifica se esta em cima do slot?
	   {
	var itemTemp = itemDrag; // Salva o item
       itemDrag = global.ItemMouse; // Troca o item
       global.ItemMouse = itemTemp; // Muda o item
       mouse_clear(mb_left);
	   }
	  } 
	 
}
Obrigado pela ajuda.

Responder

Quem está online

Usuários navegando neste fórum: Google Adsense [Bot] e 1 visitante