如何围绕不断变化的原点使用Graphics2D和AffineTransform旋转椭圆?

时间:2015-04-05 13:30:40

标签: java graphics2d java-2d affinetransform

我正在创建自己的太空入侵者版本。我在屏幕底部有一个射手和从上面接近的敌人。我的射手可以沿着屏幕底部的x轴移动完美。但是我必须根据按下的按键给它一个围绕射击者中心旋转的炮塔。

将x轴旋转0度(正向旋转角度朝正y轴):

炮塔应从射击者头部的顶部开始(即90度)。如果我按A它应该继续向左旋转(逆时针),如果我按D它应该继续向右旋转(顺时针)。如果按S,它应该停止旋转。允许最大旋转180度(从正x轴到负x轴)。

到目前为止我的代码我的炮塔从0度开始(指向正x方向)。如果我按A它会旋转到90度(垂直),如果我按D它会一直旋转到-90度(垂直向下)。如果按S,它就会停止。

我的问题是我必须在哪里进行更改以纠正此轮换?

它应该如何开始,它应该能够一直水平向左和向右旋转并停在任何一侧:

enter image description here

感谢您的帮助!

编辑代码:

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; }
}

我修好了,但有些角度对我来说仍然没有意义。

1 个答案:

答案 0 :(得分:1)

假设您有一个来自Component或Image的Graphics2D

  1. (前提条件):把你的炮塔画在一起,就像你在图像中所显示的一样。
  2.   
        
    1. 获取基础(红色)对象的中心:getX()+ getWidth()/ 2,getY()+ getHeight()/ 2;
    2.   
    3. 执行Graphics.translate(-xCenter,-YCenter);
    4.   
    5. Graphics.rotate(炮塔旋转);
    6.   
    7. 现在图形对象已经旋转,转换回来:(getWidth()/ 2,getHeight()/ 2)
    8.   
    9. 从步骤0中提取图像
    10.   

    您也可以使用AffineTransform执行此操作。