Estou usando Java / Slick 2D. Estou tentando usar o mouse para girar o sprite e as setas do teclado para mover o sprite. Posso fazer o sprite girar sem problemas, mas não consigo que ele se mova na direção que deveria. Quando eu clico "para a frente", o sprite não necessariamente se move em direção ao mouse. Na verdade, ele só se moverá realmente para a esquerda da tela. Tenho certeza de que deve haver algum código padrão para isso, pois muitos jogos usam esse estilo de movimento. Alguém pode me ajudar com o que o trigonométrico deve ser? obrigado
EDIT: Aqui está o código de rotação (que faz outra coisa estranha: /programming/12610320/why-is-my-image-rotating-off-center )
int mX = Mouse.getX();
int mY = HEIGHT - Mouse.getY();
int pX = sprite.x;
int pY = sprite.y;
int tempY, tempX;
double mAng, pAng = sprite.angle;
double angRotate=0;
if(mX!=pX){
mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
if(mAng==0 && mX<=pX)
mAng=180;
}
else{
if(mY>pY)
mAng=90;
else
mAng=270;
}
sprite.angle = mAng;
sprite.image.setRotation((float) mAng);
E o código de movimento. Só posso me mover para a esquerda da tela ...
double ang = sprite.angle;
Input input = gc.getInput();
if(input.isKeyDown(sprite.up)){
sprite.x += Math.cos(ang)*sprite.moveSpeed;
sprite.y += Math.sin(ang)*sprite.moveSpeed;
}if (input.isKeyDown(sprite.down)){
sprite.x += -1*Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
sprite.y += -1*Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
}if (input.isKeyDown(sprite.left)){
sprite.x -= Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
sprite.y += Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
}if (input.isKeyDown(sprite.right)){
sprite.x += Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
sprite.y -= Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
}
Respostas:
Você deseja obter um vetor com base em sua velocidade e direção atuais. Em seguida, use esse vetor para aumentar sua posição.
Então agora você conhece sua velocidade com base em sua rotação. Você pode atualizar sua posição com essas informações.
fonte
Você obtém a posição do mouse
Você obtém a posição de sprite
Você encontra o ângulo
Seu movimento será:
fonte