Conectar-se

Esqueci minha senha

Últimos assuntos
» [Enquete] Concursos GMBR
por Willy Hoje à(s) 19:49

» CR - Concurso Relâmpago!!
por Willy Ter 18 Jul 2017, 17:11

» 3D:como rodar a camara em horizontal?
por Cambalinho Ter 18 Jul 2017, 15:09

» [Resolvido] pode explicar a d3d_set_projection()?
por Cambalinho Ter 18 Jul 2017, 11:28

» Escrever a resposta certa muda de room
por PedroX Seg 17 Jul 2017, 21:46

» Nota de esclarecimento - GMBR voltou!
por Mentos e Coca-cola Seg 17 Jul 2017, 17:05

» [CR] Campo Minado
por Katerp Dom 16 Jul 2017, 23:09

» [CR] The Bazooka Cat
por Tedi Ripper Dom 16 Jul 2017, 23:01

» Como melhorar um protótipo(Design)
por lolandoplayer Dom 16 Jul 2017, 22:56

» Diminuir velocidade ao arrastar objeto
por LwysF Dom 16 Jul 2017, 17:33

Quem está conectado
34 usuários online :: 5 usuários cadastrados, Nenhum Invisível e 29 Visitantes

gart30, Katerp, Koelho, Tedi Ripper, Willy

[ Ver toda a lista ]


O recorde de usuários online foi de 324 em Ter 05 Out 2010, 13:36
Estatísticas
Temos 12700 usuários registrados
O último usuário registrado atende pelo nome de Eduardo Gomes

Os nossos membros postaram um total de 220919 mensagens em 30412 assuntos

objeto grudando nas paredes

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

objeto grudando nas paredes

Mensagem por saim em Sex 19 Ago 2011, 14:10

Tenho um objeto que eu quero que seja arrastado pelo mouse, desde que determinadas condições sejam encontradas.
Sempre que esse objeto tocar alguma parede, seja no sentido que for, ele deveria deixar de ser arrastado e cair.
Ele não faz isso. Achei que fosse alguma das condições pra cair que não estava sendo encontrada, mas debuguei e ambas estavam ok.
Essas condições são (ou deveriam ser): "drag=0" e "!place_meeting(x, y+1, obj_wall)".
Depois de um tempo grudado na parede, o objeto muda de idéia e se solta.
Alguém sabe o que há de errado?

Eis os códigos do objeto:
>create<
Código:
drag=false; //checa se está sendo arrastado
mxprev=mouse_x; //mouse_x_previous
myprev=mouse_y; //mouse_y_previous
deltax=0; //hspeed
deltay=0; //vspeed
addGrav=0.5; //gravity
peso=0; //peso mesmo, do objeto
>mouse_left_press<
Código:
object_event_add(obj_movable, ev_mouse, ev_left_press, '
if (poder==maoFant && level[maoFant]>=peso){ //está usando o poder certo e suporta o objeto
   drag=true;
   }
>mouse_global_left_release<
Código:
drag=false;
>step<
Código:
if (drag==true){ //se está arrastando
   deltax=mouse_x-mxprev; deltay=mouse_y-myprev; //anda junto com o mouse
   tempoPoder=max(tempoPoder-1, 0); //gasta um pouco do poder
   if (tempoPoder==0){ //se o poder acabou
      drag=false; //solta o objeto
      }
   }
   else{ //se não está arrastando, cai
      deltax*=0.9; //um pouco de atrito com o ar
      deltay+=(!place_meeting(x, y+1, obj_wall))*addGrav; //minha própria gravidade
      }

if !place_meeting(x+deltax, y+deltay, obj_wall){ //se tem espaço pra mover
   x+=deltax; y+=deltay; //move
   }
   else{ //place_meeting=true
      var len, dir, unitx, unity, i;
      len=point_distance(0, 0, deltax, deltay); //espaço máximo pra mover
      dir=point_direction(0, 0, deltax, deltay); //direção pra mover
      unitx=lengthdir_x(1, dir); unity=lengthdir_y(1, dir); //1 pixel na direção certa
      for(i=0; i<len; i+=1){ //antes era "while (!place_meeting(x+unitx, y+unity, obj_wall)){"
         if (!place_meeting(x+unitx, y+unity, obj_wall)){ //o while dispensava isso
            x+=unitx; y+=unity; //anda 1 pixel
            }
         }
      drag=false; //para de arrastar (mesmo se não estiver arrastando)
       deltax=0; deltay=0;
      }

mxprev=mouse_x; myprev=mouse_y; //atualiza essas variáveis só no final do step
>draw (só pra debug)<
Código:
draw_sprite(sprite_index, image_index, x, y);
draw_text(x, y-40, "drag="+string(drag));
draw_text(x, y-20, "met="+string(!place_meeting(x, y+1, obj_wall)));
pra testar esses códigos, você precisará declarar algumas variáveis (que, no jogo, são globais, mas pra efeito de teste podem ser locais):
Código:
maoFant=0;
poder=maoFant;
level[maoFant]=0;
tempoPoder=200;


Última edição por saim em Sex 19 Ago 2011, 14:33, editado 2 vez(es)
avatar
saim

Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 1
   : 0
   : 3

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: objeto grudando nas paredes

Mensagem por Lucas 5293 em Sex 19 Ago 2011, 14:17

Tente substituir o if pelo while, por exemplo:
Código:
while(drag=0 and !place_meeting(x, y+1, obj_wall))
{
x=mouse_x
y=mouse_y
}
avatar
Lucas 5293

Ranking : Nota C
Notas recebidas : C-D-B-B-B-C-C-C
Data de inscrição : 10/12/2010
Número de Mensagens : 695
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 0
   : 1
   : 0

Ver perfil do usuário http://dopxgames.blogspot.com

Voltar ao Topo Ir em baixo

Re: objeto grudando nas paredes

Mensagem por saim em Sex 19 Ago 2011, 14:24

Isso vai travar o jogo, porque o while nunca sairá do loop.
avatar
saim

Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 1
   : 0
   : 3

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Re: objeto grudando nas paredes

Mensagem por saim em Sex 19 Ago 2011, 14:30

Foi mal, moçada, era coisa simples. Está resolvido, podem trancar.
Editei o post original, agora funciona.
avatar
saim

Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Prêmios
   : 1
   : 0
   : 3

Ver perfil do usuário

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