gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:41:56 24 4
gpt4 key购买 nike

我正在制作我自己的太空入侵者版本。我在屏幕底部有一个射手,敌人从上方接近。我的射手可以沿着屏幕底部的 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; }
}

我已经修复了它,但有些角度对我来说仍然没有意义。

最佳答案

假设您有一个来自组件或图像的 Graphics2D:

  1. (前提条件):将绘画放在一起以绘制您的炮塔,就像您在图像中所示的那样。
  1. Get the center of the base (red) object: getX() + getWidth() / 2, getY() + getHeight() / 2;
  2. Do Graphics.translate(-xCenter, -YCenter);
  3. Graphics.rotate(turret rotation);
  4. Now that the graphics object has been rotated, translate back: (getWidth() / 2, getHeight() / 2)
  5. Draw the image from step 0

您也可以使用 AffineTransform 来完成此操作。

关于java - 如何使用 Graphics2D 和 AffineTransform 围绕不断变化的原点旋转椭圆形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29457809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com