2015-04-05 62 views
0

我正在制作我自己的太空入侵者版本。我在屏幕底部有一个射手和从上方接近的敌人。我的射手可以沿屏幕底部的X轴移动,效果非常好。然而,我必须给它一个基于按下按键的射手中心旋转的炮塔。如何使用Graphics2D和AffineTransform围绕不断变化的原点旋转椭圆形?

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

我得到它固定的,但一些角仍然没有道理给我。

+0

我看着这段代码,我无法停止思考,“为什么没有射手和炮塔类?”你正在努力做到这一点。 – CandiedOrange 2015-04-05 13:42:04

+0

@CandiedOrange我把射手和炮塔分开了,它帮助了很多。谢谢 – Loupi 2015-04-06 07:18:25

回答

1

假设你有一个Graphics2D无论是从一个组件或图像:

  1. (前提):放在一起画画画你的炮塔,就像你在你的形象已经证明。
  1. 获取碱(红色)物体的中心:的getX()+的getWidth()/ 2,的getY()+的getHeight()/ 2;
  2. Do Graphics.translate(-xCenter,-YCenter);
  3. Graphics.rotate(炮塔旋转);
  4. 现在的图形对象已旋转,平移回:(的getWidth()/ 2,的getHeight()/ 2)
  5. 步骤绘制图像0

你可以用做AffineTransform也是如此。

+0

但是为什么它从y轴转到y轴而不是x转到x? – Loupi 2015-04-05 14:17:40

+0

@Loupi我不明白你的问题 – ControlAltDel 2015-04-05 14:55:15

+0

如果我以红色球体的中心为原点,我希望绿色塔楼只在象限1和2内旋转,此时它正在象限1和4内旋转。所以我的角度是错误的,但我不知道他们错在哪里 – Loupi 2015-04-05 15:03:41