我正在制作我自己的太空入侵者版本。我在屏幕底部有一个射手和从上方接近的敌人。我的射手可以沿屏幕底部的X轴移动,效果非常好。然而,我必须给它一个基于按下按键的射手中心旋转的炮塔。如何使用Graphics2D和AffineTransform围绕不断变化的原点旋转椭圆形?
以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; }
}
我得到它固定的,但一些角仍然没有道理给我。
我看着这段代码,我无法停止思考,“为什么没有射手和炮塔类?”你正在努力做到这一点。 – CandiedOrange 2015-04-05 13:42:04
@CandiedOrange我把射手和炮塔分开了,它帮助了很多。谢谢 – Loupi 2015-04-06 07:18:25