Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

GS 2: Como troca o objeto usando DragAndDrop

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.
1
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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.
3
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

Re: GS 2: Como troca o objeto usando DragAndDrop

Ter Dez 29, 2020 9:45 pm

Boa noite
grononmc,

O que tenho que acrecentar no codigo?

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.
2
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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?
2
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

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

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.
1
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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)
2
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

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

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
2
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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.
2
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

Re: GS 2: Como troca o objeto usando DragAndDrop

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.
1
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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.
// 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
3
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

Re: GS 2: Como troca o objeto usando DragAndDrop

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:


ItemAtaque = 1; // valor fictício
ItemDefesa = 10;
...


E mais lento? Existe uma diferencia?

Muito obrigado pela ajuda.
2
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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.
2
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

Re: GS 2: Como troca o objeto usando DragAndDrop

Ter Jan 05, 2021 8:46 pm

Boa noite
grononmc,

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

Obrigado pela ajuda.
3
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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.
3
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

Re: GS 2: Como troca o objeto usando DragAndDrop

Qui Jan 07, 2021 6:23 pm

Boa noite
grononmc,

Blz, vou de instancia mesmo pq ja estou familiarizado.


Obrigado pela ajuda.
1
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

Re: GS 2: Como troca o objeto usando DragAndDrop

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:

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.
2
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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:
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.
1
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

Re: GS 2: Como troca o objeto usando DragAndDrop

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:

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


Muito obrigado pela.
1
 
Chuaschinai
Colaborador
Colaborador
Mensagens: 148
Registrado em: Dom Fev 14, 2016 9:19 pm
Karma: 908

Re: GS 2: Como troca o objeto usando DragAndDrop

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.
2
 
Avatar do usuário
GhostPower
Membro
Membro
Autor
Mensagens: 90
Registrado em: Qui Fev 01, 2018 10:38 am
Karma: 429

Re: GS 2: Como troca o objeto usando DragAndDrop

Sáb Jan 16, 2021 5:16 pm

Boa tarde
Chuaschinai,

Estou tentando fazer mais o que esta errado?


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.