Fazer setLocation em jlabel para simular pulo com curva perfeita

11 respostas
janjan

Bem como o titulo fala… tentei as tecnicas simples fazendo for com x e y do label
e o PULO do meu boneco lembra uma piramede!

queria que lembrasse uma curva perfeita…
e nao acho na internet um algoritmo pra me explicar isso
ou algo do tipo…

fico no aguardo de alguma dica
abraços!

11 Respostas

janjan

alguma dica pra isso gurizada?
que to aprendendo a fazer jogos…
e como de prache quero fazer um mario!
e fazer pular de maneira elegante pelo menos!
ideia?

a parde do meu metodo que faz pular e andar para direita é essa
e minha variavel lb é o boneco!

if (d && c) {
								System.out.println("d c");
								int xlb = lb.getX();
								int ylb = lb.getY();
								Graphics2D g = (Graphics2D)boneco.this.getGraphics();
								float y = ylb;
								for (float x = xlb; x < xlb + 50; ) {
									Thread.sleep(30);
									lb.setLocation(Math.round(x), Math.round(y));
									g.drawString(".", Math.round(x), Math.round(y));
									y -= 0.5f;
									x+=1.5f ;
									
								}
								lb.setLocation(lb.getX()+3,lb.getY());
								xlb = lb.getX();
								y = lb.getY();
								
								for (float x = xlb; x < xlb + 50; ) {
									Thread.sleep(30);
									
									lb.setLocation(Math.round(x), Math.round(y));
									g.drawString(".", Math.round(x), Math.round(y));
									
									y += 0.5;
									x+=1.5f ;
									
								}
							}
janjan

aqueles drawString são só pra ver que realmente o boneco pula em formato de triangulo!

JoaoBluSCBR

Bem, lembre que o que dá a impressão de curva, é o movimento contínuo do boneco para frente. (Ou do piso no sentido contrario)

Então não mova o boneco para frente e para cima na mesma exibição.

Mova 1 pixel para frente, exiba, mova 1 pixel para cima, mova e quando chegar ao topo, continue neste mesmo processo na descida.

Se vc mover os 2 no mesmo loop e depois exibir, a impressao será triangular.

Na rede tem um pequeno jogo chamado Tumbleweed que mostra bem um boneco pulando com movimento do piso em sentido
contrário. Naquele caso, o boneco só sobe e desce, a curva fica totalmente por conta da impressao visual do movimento do piso.

JoaoBluSCBR

Não sei até que ponto vc conhece, mas um salto em meia lua perfeita normalmente
é feito em 32 fazes, sendo que cada uma varia exatamente 5,625 graus em relacao ao movimento anterior.

Então seria assim:

O boneco está em posicao 0,0

Ele se movimenta 1 m em direção a 5,625 graus, depois:
Ele se movimenta 1 m em direção a 11,25 graus, depois:
Ele se movimenta 1 m em direção a 16,875 graus, e assim por diante, ou seja

Você pode fazer um loop de 0 a 31 que modifique um valor iniciado em 0 somando a ele 5,625 e você terá a direção.

Agora com ela, e com a distancia 1 (de cada movimento) vc aplica a fórmula:

destino.x = origem.x + sin ( angulo em radianos ) * distancia;
destino.y = origem.y + cos ( angulo em radianos ) * distancia;

obs.: Para conseguir o angulo em radianos basta multiplicar o valor dele por PI e dividir por 180.

Os 32 pontos de destino formarão uma meia-lua perfeita.

JoaoBluSCBR

Se não conseguir adaptar isso no teu código me manda uma MP e
amanhã faço isso para vc.

Agora não posso.

janjan

velho consegui reproduzir, mas nao to com meu código oficial aqui…
vo testar de novo em casa hoje de noite!
valeu pela dica… era alguma coisa desse tipoq eu eu estava procurando e nao achava!

E

JoaoBluSCBR:
Não sei até que ponto vc conhece, mas um salto em meia lua perfeita normalmente
é feito em 32 fazes, sendo que cada uma varia exatamente 5,625 graus em relacao ao movimento anterior.

Isso que você usou é a fórmula de uma semicircunferência.

Como você deve saber, se não considerarmos a resistência do ar, o trajeto de um salto é uma parábola, e para calcular parábolas não é necessário usar senos ou cossenos (exceto para determinar, a partir do ângulo e da velocidade iniciais, onde é que vai parar o bonequinho quando arremessado).

Considerando a resistência do ar, o trajeto é um pouco mais complexo (é uma espécie de “parábola torta”, porque a velocidade vai diminuindo devido ao atrito com o ar).

Para um joguinho um pulo em formato de semicircunferência, concordo, é tolerável em alguns casos - mas não dá para acertar em uma semicircunferência o ângulo inicial, por exemplo.

JoaoBluSCBR

Minha formação é em física e concordo com suas colocacoes…

Mas, eu tentei ajudar com uma proposta bem básica.

O propósito dele era não ter um pulo triangular e achei que
a semicircunferência básica atenderia suficientemente ao objetivo.

Não entendi sua colocação abaixo:


mas não dá para acertar em uma semicircunferência o ângulo inicial, por exemplo.

E

Legal, João.
(Eu realmente achei curioso o jeito de explicar, que era usando vetores “in disguise”. Devia ter desconfiado que você tinha formação em física. )

E

É que em uma semicircunferência o ângulo inicial da trajetória é exatamente 90º (e é isso que é fisicamente esquisito, porque se você lança algo com um ângulo de 90º, em vez de ele sair fazendo uma semicircunferência, esse objeto vai simplesmente para cima e voltar no mesmo ponto).

Em um arco de circunferência dá para acertar o ângulo inicial da trajetória, mas aí em vez de ter 32 passos, teríamos menos, porque seria necessário determinar quando chegou ao châo de novo. (Se o ângulo for bem raso, um arco de círcunferência e uma parábola são muito parecidos).

JoaoBluSCBR

Sim, entendo, vc tem razão. Um ângulo de 5 graus produziria, sem atrito, um movimento parabólico muito irreal.

Quanto ao “in disguise”, sim, eu criei uma constante cosmológica para um universo único. kkkkkkkkkkkkkkk

Se eu tentasse explicar isso inserindo valores nos loops iria fazer uma confusao de derivadas que ninguem
acabaria entendendo.

O disguise do vetor pelo menos parece fácil de observar, é como uma flexa que vai apontando para a frente e caindo. kkkk

Gosto de tentar criar formas de explicar algumas coisas por uma ótica diferente. Mania de professor.

Criado 31 de agosto de 2011
Ultima resposta 1 de set. de 2011
Respostas 11
Participantes 3