Página 1 de 2
GS 2: Como troca o objeto usando DragAndDrop
Enviado: Seg Dez 28, 2020 1:43 pm
por GhostPower
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Seg Dez 28, 2020 8:55 pm
por Chuaschinai
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Ter Dez 29, 2020 9:45 pm
por GhostPower
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Qua Dez 30, 2020 12:01 pm
por Chuaschinai
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?
Re: Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Qua Dez 30, 2020 1:26 pm
por GhostPower
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Qua Dez 30, 2020 4:33 pm
por Chuaschinai
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)
Re: Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Sáb Jan 02, 2021 6:05 pm
por GhostPower
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
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Sáb Jan 02, 2021 7:39 pm
por Chuaschinai
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Seg Jan 04, 2021 7:04 pm
por GhostPower
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Ter Jan 05, 2021 1:02 pm
por Chuaschinai
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
Código: Selecionar todos
var _item = instance_position(mouse_x, mouse_y, obj_item);
if(global.ItemMouse == noone) {
if(mouse_check_button_pressed(mb_left)) {
if(_item != noone)
global.ItemMouse = _item;
}
}else {
if(mouse_check_button(mb_left)) {
global.ItemMouse.x = mouse_x;
global.ItemMouse.y = mouse_y;
}else {
global.ItemMouse = noone;
}
}
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Ter Jan 05, 2021 6:57 pm
por GhostPower
Boa tarde
grononmc,
O x/yprevious pensei que ele pegava a ultima posiçao.Vlw
Posso usar variavel no objeto, ex:
E mais lento? Existe uma diferencia?
Muito obrigado pela ajuda.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Ter Jan 05, 2021 7:53 pm
por Chuaschinai
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Ter Jan 05, 2021 8:46 pm
por GhostPower
Boa noite
grononmc,
Qual e a recomendaçao de uso: ds_map ou instancia?
Obrigado pela ajuda.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Ter Jan 05, 2021 11:01 pm
por Chuaschinai
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Qui Jan 07, 2021 6:23 pm
por GhostPower
Boa noite
grononmc,
Blz, vou de instancia mesmo pq ja estou familiarizado.
Obrigado pela ajuda.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Sáb Jan 09, 2021 9:18 pm
por GhostPower
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Sáb Jan 09, 2021 9:43 pm
por Chuaschinai
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Seg Jan 11, 2021 8:56 pm
por GhostPower
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Seg Jan 11, 2021 9:54 pm
por Chuaschinai
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.
Re: GS 2: Como troca o objeto usando DragAndDrop
Enviado: Sáb Jan 16, 2021 5:16 pm
por GhostPower
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.