繁体   English   中英

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

[英]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

  1. (前提条件):就像您在图像中所显示的那样,将绘画组合在一起以绘画您的炮塔。
  1. 获取基础(红色)对象的中心:getX()+ getWidth()/ 2,getY()+ getHeight()/ 2;
  2. 做Graphics.translate(-xCenter,-YCenter);
  3. Graphics.rotate(炮塔旋转);
  4. 现在已经旋转了图形对象,请向后平移:(getWidth()/ 2,getHeight()/ 2)
  5. 从步骤0绘制图像

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM