[英]How do I rotate an oval using Graphics2D and AffineTransform around an ever changing origin?
我正在制作自己的太空侵略者版本。 我在屏幕底部有一个射击手,敌人从上面靠近。 我的射击者可以沿着屏幕底部的x轴完美移动。 但是我必须给它一个炮塔,它可以根据按下的键绕射手的中心旋转。
以x轴为0度旋转(相对于y轴正旋转角为正):
炮塔应始于射手头部的顶部(即90度)。 如果按A
,则应继续向左旋转(逆时针),如果按D
,则应继续向右旋转(顺时针)。 如果按S
它将停止旋转。 允许最大旋转180度(从正x轴到负x轴)。
到目前为止,使用代码我的炮塔是从0度开始的(指向正x方向)。 如果按A
它将旋转90度(垂直),如果按D
,将一直旋转至-90度(垂直向下)。 如果我按S
它将停止。
我的问题是我必须在哪里进行更改以更正此轮换?
这是它应该开始的方式,它应该能够一直向左和向右水平旋转并在任一侧停止:
感谢您的任何帮助!
编辑代码:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
public class Turret{
private int omega; //rotation speed
private int width = 16;
private int height = 12;
private int currAngle;
private Player playa;
public Turret(Player p){
omega = 0;
playa = p;
currAngle = 0;
}
public void keyHasBeenPressed(KeyEvent e){
int key = e.getKeyCode();
if(key == KeyEvent.VK_A){
omega = 1; //rotate anti-clockwise
}
if(key == KeyEvent.VK_D){
omega = -1; //rotate clockwise
}
if(key == KeyEvent.VK_S){
omega = 0;
}
}
public void rotate(){
//angle of rotation is between 90 (negative x-axis) and -90 ( positive x-axis)
if(currAngle + omega < 90 && currAngle + omega > -90){
currAngle += omega;
}
}
public void show(Graphics2D g2d){
g2d.setColor(Color.GREEN);
AffineTransform old = g2d.getTransform();
g2d.translate(playa.getCenterXcoord(),playa.getCenterYcoord());
g2d.rotate(Math.toRadians(-currAngle));
g2d.translate(-playa.getCenterXcoord(), -playa.getCenterYcoord());
g2d.fillOval(playa.getCenterXcoord() - width/2,
playa.getYcoord() - height/2, width, height);
g2d.setTransform(old);
}
public int getAngle() { return currAngle; }
}
我已将其固定,但某些角度对我而言仍然没有意义。
假设您有来自组件或图像的Graphics2D
:
- 获取基础(红色)对象的中心:getX()+ getWidth()/ 2,getY()+ getHeight()/ 2;
- 做Graphics.translate(-xCenter,-YCenter);
- Graphics.rotate(炮塔旋转);
- 现在已经旋转了图形对象,请向后平移:(getWidth()/ 2,getHeight()/ 2)
- 从步骤0绘制图像
您也可以使用AffineTransform
进行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.