GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» Problema ao entrar por uma porta e voltar por ela
por aminaro Seg 06 maio 2024, 10:08

» Alguém aqui já ganha dinheiro com seus games?
por theguitarmester Ter 30 Abr 2024, 11:43

» Colisões não funcionando
por theguitarmester Ter 30 Abr 2024, 10:16

» Como ajustar velocidade de cada frame da animação no game maker
por pequetux Sex 26 Abr 2024, 16:45

» Preciso de ajuda
por AftonDuGrau Dom 21 Abr 2024, 20:18

» Como faz o evento drawn GUI, não se repetir?
por aminaro Sex 19 Abr 2024, 20:30

» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07

» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45

» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51

» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31

» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11

» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39

» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27

» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30

» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17

» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21


pêndulo - QUASE lá

5 participantes

Ir para baixo

pêndulo - QUASE lá Empty pêndulo - QUASE lá

Mensagem por saim Qua 07 Mar 2012, 14:13

O que era desejado
Um pêndulo que opere de modo moto-contínuo até que se adicione ou retire manualmente energia no sistema.

O que foi feito:
Depois de muito tentar, finalmente consegui chegar num pêndulo relativamente decente.
O problema de fazer um pêndulo usando as fórmulas da física real (tensão na corda, gravidade, vetor resultante) é que essas fórmulas usam aproximações.
Resolvi refazer uma engine que vi a muito tempo atrás mas que, na época, só consegui entender a idéia básica, que é a seguinte:
- Movimente o objeto normalmente, fingindo que não existe a corda (aplicando gravidade e tudo);
- Se a distância do objeto ao centro da corda for maior do que a corda, abre uma série de comandos:
...- Força a posição do pêndulo pra distância máxima;
...- Aponta a velocidade pra direção "posiçãoAnterior -> posiçãoAtual", mantendo o valor do módulo;
O código que estou usando é esse aqui:
Código:
ySpd += grav; //atualiza a velocidade vertical em função da gravidade
x += xSpd; y += ySpd; //atualiza a posição em função das velocidades
modSpd = point_distance(0, 0, xSpd, ySpd); //determina o módulo da velocidade
if (point_distance(x, y, cx, cy) > radius) { //se a distância ao centro for maior que o raio
   var ang;
   ang = point_direction(cx, cy, x, y); //define o ângulo do centro à posição
   x = cx + radius * cos(degtorad(ang)); y = cy + radius * sin(degtorad(-ang)); //puxa o objeto pra distância máxima
   dire = point_direction(xprev, yprev, x, y); //atualiza a direção do movimento, ligando a posição anterior à posição atual
   xSpd = modSpd * cos(degtorad(dire)); ySpd = modSpd * sin(degtorad(-dire)); //atualiza as velocidade horizontal/vertical em função da nova direção
   }

xprev = x; yprev = y; //a posição atual é a anterior do próximo step
Onde:
cx/cy = centro do pêndulo
xSpd/ySpd = velocidades horizontal/vertical
modSpd = módulo da velocidade, como vetor
xprev/yprev = x/y previous
radius = raio
grav = gravidade

radius * cos(degtorad(ang)) = lengthdir_x(radius, ang);
radius * sin(degtorad(-ang)) = lengthdir_y(radius, ang);
(estou tentando deixar de lado alguns vícios)

O que deu errado:
De alguma forma, o sistema está ganhando energia. Eu esperava que, ao completar 180°, a velocidade voltasse a zero, já que o objeto estaria subindo e, portanto, a gravidade estaria reduzindo a velocidade. Como o trecho a subir é o mesmo trecho que o objeto tem que descer, uma coisa eliminaria a outra.
Isso quase funcionou. Mas o objeto subiu um pouco mais do que devia e isso aconteceu em todas as voltas. Em pouco tempo, o objeto estava rodando ao redor do centro.
Se eu multiplico o valor de modSpd por 0.995 ou 0.9945, o pêndulo funciona adequadamente, mas esses valores foram encontrados na base da tentativa-e-erro, não há matemática envolvida.
Gostaria de pedir ajuda aos universitários. Literalmente. Alguém que esteja com mecânica fundamental mais fresca, na cabeça, por favor examine essas equações e me diga em que momento a energia está entrando no sistema.
Ou algum estudante de segundo grau mesmo, que seja bom com números, verifique essas contas e veja o que há de errado.
Se for necessário (pra jogar no excell, sei lá) tenho como gerar um texto com o valor dessas variáveis no final de cada step.


Última edição por saim em Qui 08 Mar 2012, 14:39, editado 1 vez(es)
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por cascavelo Qua 07 Mar 2012, 15:44

Enfrentei o mesmo problema desenvolvendo um engine para uma bola que quicava, por mais que eu tentasse controlar a gravidade a bola ia subindo a cada quique que dava até sumir da tela. Quebrei a cabeça um tempão e cheguei na conclusão que é um bug do sistema de gravidade do GM. Tive que retirar altura do sprite artificialmente pra conseguir o resultado desejado.
O problema parece ser a maneira que o GM lida com a gravidade, não parece ser algo real. O GM parece péssimo para lidar com física.
cascavelo
cascavelo

Games Ranking : Nota A

Notas recebidas : A - A - A - A - A -A -C
Data de inscrição : 08/12/2011
Reputação : 71
Número de Mensagens : 1011
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 1 Prata x 2 Bronze x 1

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por saim Qua 07 Mar 2012, 16:12

Só que o GM não está lidando com física, nesse caso. Todas as variáveis são manipuladas manualmente, justamente pra evitar o uso de uma engine built-in que eu não sei como funciona. Nesse caso, a culpa não tem como ser do GM...
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por cascavelo Qua 07 Mar 2012, 17:35

Ok, agora entendi o que você fez, achei que tinha usado a "gravity". Mas acho melhor você postar o código completo para que se possa testar.
cascavelo
cascavelo

Games Ranking : Nota A

Notas recebidas : A - A - A - A - A -A -C
Data de inscrição : 08/12/2011
Reputação : 71
Número de Mensagens : 1011
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 1 Prata x 2 Bronze x 1

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por PedroX Qua 07 Mar 2012, 18:42

Não é bem moto-continuo, porque perde velocidade, mas pode te servir:
http://dl.dropbox.com/u/38888521/Pendulo.gmk

Tem como adicionar uma força em uma certa direção, no exemplo adiciona na direction que já está movendo, ao apertar espaço.

É bem simples e pode ser transformado em base de seno e cosseno.

Até mais!

_________________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:
PedroX
PedroX

Games Ranking : Nota B

Notas recebidas : C+B
Data de inscrição : 26/07/2008
Reputação : 311
Número de Mensagens : 6087
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 0 Tutoriais x 17 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

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

https://web.whatsapp.com/send?phone=5519995935953&text=Pedro

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por saim Qui 08 Mar 2012, 08:13

cascavelo escreveu:Mas acho melhor você postar o código completo para que se possa testar.
Está completo, basta definir as variáveis citadas no create event. O código que postei, obviamente, fica no step.

Pedrø escreveu:Não é bem moto-continuo, porque perde velocidade, mas pode te servir
AARGH!!! Agora vou ter que esperar até chegar em casa pra testar!
Perder velocidade não é exatamente um problema, eu ia mesmo colocar um atrito artificialmente, quando tudo desse certo, só queria que DESSE certo antes de modificar.
Valeu! Smile
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por cascavelo Qui 08 Mar 2012, 14:34

Está completo, basta definir as variáveis citadas no create event. O código que postei, obviamente, fica no step.

Dá este erro:

ERROR in
action number 1
of Step Event
for object object0:

Error in code at line 8:
dire = point_direction(xprev, yprev, x, y); //atualiza a direção do movimento, ligando a posição anterior à posição atual
^
at position 28: Unknown variable xprev
cascavelo
cascavelo

Games Ranking : Nota A

Notas recebidas : A - A - A - A - A -A -C
Data de inscrição : 08/12/2011
Reputação : 71
Número de Mensagens : 1011
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 1 Prata x 2 Bronze x 1

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por saim Qui 08 Mar 2012, 14:40

Ah, tá, esqueci dessas. Agora já atualizei o tópico inicial.
Elas devem ser definidas como xprev = x e yprev = y, no create.
[edit]Aliás, deixa eu motrar como está o create:
Código:
cx = x; cy = y; radius = 50; grav = 0.5;
x += radius;
xprev = x; yprev = y;
xSpd = 0; ySpd = 0; modSpd = 0; dire = 0;
maxMod = 0;

Edit 2
saim escreveu:@Pedrø, o exemplo funciona de um jeito muito bacana, mas não é o que eu estou procurando, por dois motivos (culpa minha, que não citei essas premissas):
- Quando a massa está acima do centro, ela não cai. Eu gostaria que caísse, como se a massa estivesse presa a uma corda.
- Você usa speed e direction. Eu tenho birra de usar essas variáveis, porque eu não sei como elas funcionam internamente. Aí, qualquer coisa que funcione, vai ser meio que uma "mágica". Nada contra usar lengthdir, porque essas eu SEI como funcionam, mas nunca sei exatamente como speed, hspeed, vspeed e direction são tratadas internamente e, mesmo quando a coisa é simples (como nesse caso) eu fico na dúvida se as posições são atualizadas ANTES ou DEPOIS do código ser executado.

Tem um terceiro problema que também é culpa minha, mas ESSE pode ser resolvido: eu não entendi nada! --\' Não entendi como você adiciona energia, não entendi como o objeto atualiza sua posição, não entendi o motivo do "-1" - nada. Eu adoraria ver uma versão comentada desses scripts. Por mais que eles não sirvam pro meu jogo (se é que esse jogo sai do papel), são muito interessantes.

Moçada, foi mal pelo double post. Dormi no ponto. Corrigido.
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por PedroX Qui 08 Mar 2012, 23:09

Atualizei o exemplo no mesmo link.
Veja agora se melhorou os comentários.
Fiz versões alternativas para que você veja a diferença entre as funções do GM e as contas usadas manualmente.

_________________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:
PedroX
PedroX

Games Ranking : Nota B

Notas recebidas : C+B
Data de inscrição : 26/07/2008
Reputação : 311
Número de Mensagens : 6087
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 0 Tutoriais x 17 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

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

https://web.whatsapp.com/send?phone=5519995935953&text=Pedro

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por saim Sex 09 Mar 2012, 13:51

Melhorou no sentido de mostrar como fazer sem usar as built-ins (estava muito tarde e não cheguei a testar, mas vi os comentários), mas ainda não entendi como os códigos funcionam, o que eles fazem, etc.
Talvez porque estava muito tarde - e eu estava muito empolgado com um outro assunto (relacionado a games, mas que não tem nada a ver com game maker) - eu não consegui visualizar qual o sentido dos seus códigos. Por outro lado, você tem uma cabeça bem complexa, você está tão acostumado a pescar que pode se esquecer que precisa explicar como amarrar o anzol.

Mas não esquenta com isso não, ainda que eu consiga entender, o código não vai me servir, porque eu realmente quero que, quando o objeto estiver em baixa velocidade e acima do centro, ele caia por gravidade simples, sem continuar o movimento circular (a corda que une o objeto ao centro não pode ser rígida).

A pergunta inicial permanece, agora piorada: porque se eu reduzo a velocidade, multiplicando por um valor mais baixo como 0.7, por exemplo, o objeto se prende ao chegar a uns 45°?
Isso mesmo, se eu multiplico, no step dos meus códigos, o módulo da velocidade por um valor desses, o objeto fica preso, flutuando, perto de 45°.
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por Klior Sex 09 Mar 2012, 15:51

saim sempre com suas duvidas interessantes...
tem que acrescentar isso na sua assinatura:
"Meus tutoriais: Variáveis, Arrays, Máquina de Estados Finitos, Game genérico, Surfaces, cores, Blend Modes, A* pathfinding, Debugando, lengthdir_x/y, lasers
Minhas engines: Desenhar bandeira, Efeitos texto
Minhas duvidas: ........."

sobre sua duvida estarei dando uma olhada no fds, caso ainda não esteja resolvida..
Klior
Klior

Data de inscrição : 07/03/2010
Reputação : 13
Número de Mensagens : 426
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 0 Tutoriais x 1 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Plataformas :
  • Game Maker 8.0 ou 8.1
  • C#
  • Javascript


Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por Mr. Kaleb Sex 09 Mar 2012, 18:27

Ah, saim, agora o bicho pegou, porque, você quer uma corda maleável, então você vai ter que achar um extensão ou algo parecido, porque, digo por experiência própria, já tentei fazer algo parecido, e é bastante complexo ao meu ver.
O jeito mais fácil de fazer seria com joints, lembra daquelas engines do Jiraya de localização de pontos? Pois é, seria algo parecido, mas mesclado com um sistema de física que fosse complexa o suficiente para se adequar.
Fora isso, não sei de mais nada.
Mr. Kaleb
Mr. Kaleb

Games Ranking : Nota C

Notas recebidas : C
Data de inscrição : 07/09/2010
Reputação : 21
Número de Mensagens : 1400
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

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

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por PedroX Sex 09 Mar 2012, 19:01

Entendi saim.

Para descomplicar um pouco, adicionei mais comentários.
Facilitou um bom tanto.

Qualquer coisa posta ai. Não desista não.

Edit

Assim que você entender, passo para a parte dele cair, como numa corda flexível.
Mas isso exigirá um pouco de trabalho.

_________________


Leia o Manual do Iniciante e a Lista de Tutoriais, para aprender bastante sobre o GM.
Recomendo o Manual completo das colisões, bem útil.
O exemplo Criar um chat (banir, kickar, etc) é interessante.

Para seu jogo ficar rápido e legal, aprenda a Aumentar o desempenho do seu jogo.

Aprenda a calcular a velocidade de suas animações


Entre para o Clube do Inglês:
PedroX
PedroX

Games Ranking : Nota B

Notas recebidas : C+B
Data de inscrição : 26/07/2008
Reputação : 311
Número de Mensagens : 6087
Prêmios : pêndulo - QUASE lá Empty

Medalhas x 0 Tutoriais x 17 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

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

https://web.whatsapp.com/send?phone=5519995935953&text=Pedro

Ir para o topo Ir para baixo

pêndulo - QUASE lá Empty Re: pêndulo - QUASE lá

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo


 
Permissões neste sub-fórum
Não podes responder a tópicos