【问题标题】:How do I make a rectangle rotate to face cursor?如何使矩形旋转以面对光标?
【发布时间】:2013-05-27 02:30:31
【问题描述】:

我希望为我的年终项目(在高中学习计算机科学)制作一个非常基本的游戏,但找不到任何关于如何使我正在绘制的矩形面向光标的答案。这个网站过去非常有用,但这是我的第一个问题,希望你们能提供帮助。

dir = Math.toRadians(Math.atan2(yy1,xx1)/2*Math.PI);

我假设这部分代码是问题所在,或者,

g2d.rotate(dir,xx,yy);

这个。我应该使用仿射变换吗?如果可以,如何使用?

提前致谢。

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.awt.image.*;

public class W extends Applet implements KeyListener, MouseMotionListener {
int xx=100,yy=100,xx1,yy1,wid,hig;
String key;
Rectangle rect1;
double dir, trueing=0;

Image offImage;
Graphics offGraphics;

public void init() {
    setSize(800,600);
    addKeyListener(this);
    addMouseMotionListener(this);
}

public void update(Graphics g) {
     if (offGraphics == null) {
        offImage = createImage(800,600);
        offGraphics = offImage.getGraphics();
    }

    offGraphics.setColor(Color.WHITE);
    offGraphics.fillRect(0,0,800,600);

    Graphics2D g2d = (Graphics2D)offGraphics;
    offGraphics.setColor(Color.BLACK);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

    g2d.rotate(dir,xx,yy);

    g2d.draw(new Rectangle(xx, yy, 10, 10));

    offGraphics.setColor(getForeground());
    g.drawImage(offImage, 0, 0, this);

}

public void paint(Graphics g) {
    update(g);
}

public void Game(){

}

public void keyPressed(KeyEvent ke){
    if (ke.getKeyCode() == KeyEvent.VK_UP){
        yy--;
        key = "u";
        System.out.println(key+xx+"-"+yy);
        repaint();
    }
    if (ke.getKeyCode() == KeyEvent.VK_DOWN){
        yy++;
        key = "d";
        System.out.println(key+xx+"-"+yy);
        repaint();
    }
    if (ke.getKeyCode() == KeyEvent.VK_LEFT){
        xx--;
        key = "l";
        System.out.println(key+xx+"-"+yy);
        repaint();
    }
    if (ke.getKeyCode() == KeyEvent.VK_RIGHT){
        xx++;
        key = "r";
        System.out.println(key+xx+"-"+yy);repaint();
        repaint();
    }
}

public void keyReleased(KeyEvent e) {
}

public void keyTyped(KeyEvent e) {
}

public void mouseMoved(MouseEvent e) {
    xx1=e.getX();
    yy1=e.getY();
    showStatus( "Mouse at (" + xx1 + "," + yy1 + ")" );
    dir = Math.toRadians(Math.atan2(yy1,xx1)/2*Math.PI);

    repaint();

}

public void mouseDragged(MouseEvent e) {
}

}

【问题讨论】:

  • 1) 为什么要编写小程序?如果是由于规范。老师请发给Why CS teachers should stop teaching Java applets。 2) 为什么选择 AWT 而不是 Swing?请参阅Swing extras over AWT 上的这个答案,因为有很多放弃使用 AWT 组件的充分理由。如果您需要支持较旧的基于 AWT 的 API,请参阅 Mixing Heavyweight and Lightweight Components
  • 有什么问题?它不工作吗?它工作不正常吗?
  • 谢谢 生病去学习摇摆我想,我们的老师只是把课程作业交给了,不,它不起作用,当你移动鼠标时矩形会旋转。

标签: java applet rotation awt transform


【解决方案1】:

我认为您的程序中缺少一些东西。

您不会重置轮换。完成旋转后,绘制要旋转的对象,然后使用 AffineTransform 重置旋转

AffineTransform reset = new AffineTransform();
reset.rotate(0,0,0);

然后您可以应用变换来仅旋转单个对象。

g2d.rotate(dir,xx,yy);
g2d.draw(new Rectangle(xx, yy, 10, 10));
g2d.setTransform(reset);

当您计算对象应旋转的角度时,我建议您使用:

xx1 = e.getX();
yy1 = e.getY();
dir = Math.toRadians(Math.atan2(yy - yy1, xx - xx1));

我这么说主要是因为我不明白你的数学试图完成什么。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多