[resolvido] Deixar peça embaixo

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[resolvido] Deixar peça embaixo

Mensagem por saim em Ter 20 Dez 2011, 11:05

Estou fazendo um quebra-cabeças e tendo dificuldades ao soltar as peças. Eu quero que, ao soltar, elas fiquem embaixo das demais. Pra arrastar, eu tenho uma variável, draggin, que mudo de true pra false conforme seja pra peça seguir ou ignorar o mouse.
No evento left_release (ou seja, só funciona quando o mouse está sobre a peça), eu coloco o seguinte (resumidamente):
Código:
with (objPiece){
   if draggin == true{
        depth = 1;
        }
        else{
            depth = 0;
            }
   }
E isso funciona desde que o mouse esteja apenas sobre a peça que está se movimentando. Se ele estiver sobre uma outra peça, a depth da peça que eu solto vai pra zero, não pra um e aí, ela não vai pra trás.
Estranhamente, mesmo que a id seja menor que a da peça que está abaixo, ambas estando com depth igual a zero, a peça não vai pra trás.
Alguém pode me explicar porque?


Última edição por saim em Ter 20 Dez 2011, 14:14, editado 1 vez(es)

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por Mr.Brum em Ter 20 Dez 2011, 11:28

Qual o code que vc está usando para o objeto seguir o mouse??

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por saim em Ter 20 Dez 2011, 11:41

Código:
if (draggin == true){
    event_perform(ev_trigger, 1);//movePiece();
    }
mxp = mouse_x; myp = mouse_y;
Resumidamente, esse ev_trigger contém:
Código:
x += mouse_x - mxp; y += mouse_y - myp;
Estou mostrando só a versão resumida porque o resto do código se refere a uma situação em que já existem peças encaixadas, o que não é o caso. O problema ocorre em qualquer situação.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por Markituh em Ter 20 Dez 2011, 11:49

Só pra constar saim, um objeto com depth 1 vai ficar em baixo dos que tem 0, mas um com -1 (menos um) vai ficar acima. E na condição da draggin você deixou depth 1, sendo que sua intenção era deixar a peça acima de todas.

Resumo: depth é que nem a Y, não a Z.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por saim em Ter 20 Dez 2011, 12:00

Não, Markituh, o que eu quero é que, ao soltar a peça, ela vá pra baixo de todo mundo. Então, se estiver sendo arrastada (draggin = true) ela vá pra depth maior que as outras mesmo (então 1 se estiver sendo arrastada e 0 se não estiver).
Só que, quando eu solto uma peça que ESTÁ sendo arrastada ao mesmo tempo que "solto" uma que NÃO está sendo arrastada - ou seja, estou arrastando uma por cima de outra e, com o mouse sobre as duas, eu solto o botão - a depth das duas vai pra zero (eu debuguei) e não sei porque isso acontece.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por Markituh em Ter 20 Dez 2011, 12:16

Ah, sim, erro meu. Lembro que fiz um quebra-cabeça e tive esse bug, ao menos um similiar, que quando eu estava carregando uma, se eu passasse por outra ela também ia junto Happy O que fiz foi armazenar o objeto que cliquei em uma variável para esse propósito (global, diga-se), e quando eu soltasse já não havia erro, porque eu só iria soltar aquele que eu armazenei.

Mas se por ventura a peça que estiver abaixo também for computada, seria bom checar se a variável está com um valor que não um nulo (0, false, whatever) na hora de checar se está carregando, evitando assim que você também carregue a peça de baixo junto.
Código:
// Isso vai pro evento clique do mouse
// Se estiver usando um evento próprio pra isso e não o Step, sei que você sabe adaptar.
if mouse_check_button_pressed(mb_left) and draggin == false and global.current_piece = none
{
    draggin = true;
    global.current_piece = instance_position(mouse_x, mouse_y, objPiece);
}
E no código para movimentar as X e Y do peça, por meio da "draggin", de acordo com as do mouse, você adiciona as checagens adicionais. Não sei se deu pra entender, mas se precisar posso fazer mandar um gmk mostrando isso.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por Mr.Brum em Ter 20 Dez 2011, 12:32

tenta inverter os depths, parece que vc trocou eles:
Código:
with (objPiece){
  if draggin == true{
        depth = 0;
        }
        else{
            depth = 1;
            }
  }
Lembre-se que os depths menores são desenhados mais a frente na tela,e vc tinha colocado o maior depth quando o draggin estava ativado,qdo que neste momento o depth deveria ser o menor, pro objeto ficar acima dos demais.
Testa aí.

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por saim em Ter 20 Dez 2011, 13:45

@Markituh: não, o valor de draggin também foi debugado. Está "1" na peça que se move e "0" na peça parada, que permanece parada até que eu clique nela e ela esteja por cima (tenho uma rotina bem chatinha de se fazer só pra poder pegar a peça que está por cima, independente da depth).

@mrbrum22: Eu quero que se o valor de draggin for verdadeiro ela vá pra baixo. COMO inverter os valores poderia me ajudar?

Mocada, é o seguinte:
arrastando: a peça vai pra cima (depth = -1, já resolvi isso)
soltei: a peça que está sendo arrastada vai pra baixo de TODAS (depth = 1, mas não está ficando igual a um)
não toquei na peça: ela fica numa posição qualquer em relação às outras (depth = 0, já resolvi também).

Edit: Pfff... É exatamente isso! Rodo o código na peça com draggin = true, o depth dela vai pra 1 E o draggin, pra false. Depois rodo na outra instância e como o draggin da primeira é false, o depth vai pra 0 também!
Agora é achar um jeito de evitar isso...

O problema está no evento de soltar o botão do mouse. Quando faço isso com duas peças sob o mouse, a depth das duas vai pra zero, quando eu esperava que a que eu estivesse arrastando fosse pra um (e a outra continasse em zero mesmo).
Teoricamente, não há erro no código. Se draggin = true, depth = 1. Simples. Mas não é o que está acontecendo, o depth está indo pra 0.
DEVE ser algum problema de ordem dos eventos - o código roda numa instância, joga pra um, depois roda de novo e joga pra zero. Só que eu não consigo imaginar onde está esse problema.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por Markituh em Ter 20 Dez 2011, 14:03

:| ... yes Aposto muito que é a ordem dos eventos. Rapaz, não sei se vai funcionar contigo, mas tenta dar show_message após cada operação que você faz na variável, em todos os blocos de código. Geralmente faço isso no C++ para saber o porque do programa simplesmente deixar de responder depois de fazer uma operação.

De preferência (ou melhor, de obrigação), coloque qual é bloco no qual o respectivo show_message está. Aí vai ficar até que óbvio saber qual é o código que faz m%$#@

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por saim em Ter 20 Dez 2011, 14:14

RESOLVIDO!!!
O problema era que o código estava nas peças. Fiz isso pra facilitar, mas acabou complicando. Passei o código pra um controle que aí, não tem perigo do draggin passar pra false e o código ser rodado novamente. E, já que tenho a variável draggin e agora estou usando o evento global, nem preciso verificar se a peça está sob o mouse.
Parei de fazer o depth das outras ir pra zero, também. Faço isso quando pego uma peça, então não tem motivo pra fazer de novo ao soltar.

Obrigado pela ajuda, moçada!

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [resolvido] Deixar peça embaixo

Mensagem por Conteúdo patrocinado Hoje à(s) 13:58


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum