Eu estou com um problema com a movimentação de objetos. Eu consigo movimentá-los para o lado (eixo X) e pra cima e pra baixo (eixo Y), talvez eu até conssiga fazer eles se moverem num ângulo de 45º mas o problema é que eu quero conseguir movimentar estes objetos em qualquer ângulo.
Eu fiz um código que na verdade até da certo, só que é um quebra-galho.
//Codigo para calcular o próximo pixel
//posx e posy são atributos do objeto
public Point Prox(){
Point nextPos = new Point();
double adx = Math.cos(Math.toRadians(graus));//coseno do grau
double ady = Math.sin(Math.toRadians(graus));//seno do grau
posx += adx; //adiciona resultado à coordenada x
posy += -ady;// adiciona resultado à coordenada y
nextPos.x = (int)posx; //arredonda e atribui
nextPos.y = (int)posy; //à variável de retorno
return nextPos;
}
Eu queria saber se tem um jeito melhor de fazer isso porque eu fiz mas não me parece certo, na verdade extremamente errado.
Ex:
Para um objeto se mover em um angulo de 45º é preciso que seja adicionado 1 pixel em cada eixo a cada ‘passo’ que ele dá. O seno de 45º é 0.7, quando arredondar vai para 1 mas da próxima vez o programa vai ter que arredondar 1.4 e vai arredondar para 1 ao invés de 2.
Se puderem me falar uma coisa ou duas sobre vetores em java eu seria muito grato, também.
Que tal guardar como double, e só passar para int na hora de redesenhar o objeto?
Aliás, Java2D trabalha com pontos especificados como 2 floats (Point2D.Float) ou 2 doubles (Point2D.Double). É por isso que estou achando esquisito você guardar uma posição como pixels.
A posição é um Point, eu converto pra int a soma entre a posição atual do objeto e o quanto ele deve se mover na hora em que atribuo esses valores as coordenadas do Point. Eu estou pensando na tela como se fosse um plano cartesiano, não tem como eu mostrar meio pixel por exemplo, por isso a necessidade do inteiro.
Em nenhum momento do código (mesmo o código inteiro) eu mechi com o java2D, eu estava testando inserindo um valor para o ângulo através de um JOptionPane, então eu clicava em um botão começar que iniciava um Timer que movia uma JLabel (O objeto que falei) para sua nova posição a cada 17 milésimos de segundo.
Mas o que eu queria saber é algo sobre a lógica desse código, eu não sei de que outra maneira posso calcular o próximo ponto a partir de um angulo.
É, no lugar do ‘10’ eu poderia por uma variável, isso seria o quanto o objeto ‘anda’ a cada ‘passo’.
O problema que estou tendo é que esse método não é 100% preciso, eu queria alguma dica de como fazer isso dar certo, com senos e cosenos parece não dar. Eu to quebrando minha cabeça aqui mas não consigo pensar em outra maneira de fazer isso.
Como eu queria ter prestado mais atenção nas aulas de trigonometria D:
Você ta certo. Eu não tinha entendido muito bem, mas agora eu vi.
Se eu multiplicar por 10 não vou ter problemas com arredondamentos, mas acho que 7 pixels é um passo muito grande pra se dar, eu perderia muito FPS tentando fazer isso numa velocidade razoavel.
posx += adx*10; //adiciona resultado à coordenada x
posy += -ady*10;// adiciona resultado à coordenada y
e deveria ser assim também, se não a posição dele que seria multiplicada por 10, e não a soma das coordenadas do próximo pixel em relação a ele.
Ex: se o proximo pixel que o objeto iria fosse 100,100 na verdade ele iria para 1000,1000.