Я искал во всем inte rnet простой способ просто вращать спрайт на угол.
Цель состоит в том, чтобы спрайт оружия следовал за мышью, вращаясь в центре экран (шутер сверху вниз Java). Я пробовал разные вещи:
Примечание: функция render(Graphics g)
находится внутри моего класса Gun. java и использует g
, элемент Graphics, который я использую для рисования на холсте игры. image
- это BufferedImage, содержащий оригинальный спрайт. reticle.getAngle()
задает угол, на который указывает мышь, считая центр экрана центром координат.
Попытка 1
public void render(Graphics g) {
// create a new BufferedImage with the image of the gun on it
BufferedImage rotatedImage = new BufferedImage(image.getWidth(), image.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics gRotatedImage = rotatedImage.getGraphics();
gRotatedImage.drawImage(image, 0, 0, null);
// rotate this gun image in the direction of shoot
private AffineTransform at = new AffineTransform();
at.rotate(reticle.getAngle() + Math.PI,
rotatedImage.getWidth()/2, rotatedImage.getHeight()/2);
AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
rotatedImage = op.filter(rotatedImage, null);
// finally display the rotated version of the gun image
g.drawImage(rotatedImage,
(int)(handler.getDisplay().getWidth()/2 - rotatedImage.getWidth()/2),
(int)(handler.getDisplay().getHeight()/2 - rotatedImage.getHeight()/2),
rotatedImage.getWidth(), rotatedImage.getHeight(), null);
}
При этом Решение, с java2s.com , я получаю спрайт, отображаемый в центре и вращающийся, но больше похожий на вертолет ... Он продолжает вращаться, не следуя за мышью.
Я также проверил все решения из соответствующего вопроса StackOverflow . На этот раз я вижу оружие, отображаемое в левом верхнем углу вслед за мышью, но не могу найти способ разместить его в центре экрана. Я пробовал переводы, но затем изображение спрайта поворачивается, принимая во внимание верхний левый угол в качестве центра.
Попытка 2
public void render(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
double rotation = 0f;
int width = image.getWidth() - 1;
int height = image.getHeight() - 1;
rotation = reticle.getAngle();
rotation = Math.toDegrees(rotation) + 180;
g2d.rotate(Math.toRadians(rotation), width / 2, height / 2);
// g2d.translate(handler.getDisplay().getWidth()/2, handler.getDisplay().getHeight()/2);
g2d.drawImage(image, 0, 0, null);
int x = width / 2;
int y = height / 2;
g2d.setStroke(new BasicStroke(3));
g2d.setColor(Color.RED);
g2d.drawLine(x, y, x, y - height / 4);
g2d.dispose();
}
Я просто хотел бы поворачивать мой спрайт каждые тик игры под углом, указанным reticle.getAngle()
, который я знаю, это хорошо. Я чувствую себя действительно потерянным о том, как использовать Graphics2D или AffineTransform для выполнения вращения. Может ли кто-нибудь привести пример того, как вращать спрайт, следуя за мышью, и затем отображать его в центре экрана?
Каков наилучший способ поворота изображения, которое мы затем хотим отобразить в центре экран?