【问题标题】:Rotating an image nuisance旋转图像令人讨厌
【发布时间】:2012-09-02 01:49:50
【问题描述】:

好吧,伙计们,我正在尝试制作小行星类型的游戏,我需要能够旋转图像,以便船的前部跟随我的鼠标。我已经找了几个小时了,找到了一些东西,但没有一个能满足我的需求。

如果有人知道怎么做,请分享!

提前致谢

这是我现在的代码

package Asteroids;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

    import javax.swing.ImageIcon;
    import javax.swing.JFrame;

    @SuppressWarnings("serial")
    public class Asteroids extends JFrame implements Runnable, MouseListener,
            MouseMotionListener, KeyListener {

        private Image dbImage;
        private Graphics dbg;
        int x, y, mx, my;
        int a, b, c, degree;
        double scale = 1.0;
        ImageIcon shipIcon = new ImageIcon(this.getClass().getClassLoader()
                .getResource("AstroidsShip.png"));
        Image ship = shipIcon.getImage();

        public static void main(String[] args) {
            Asteroids frame = new Asteroids();
            Thread thread = new Thread(frame);
            thread.start();
        }

        public Asteroids() {
            addMouseListener(this);
            addMouseMotionListener(this);
            addKeyListener(this);

            setTitle("Astroids");
            setSize(500, 500);
            setBackground(Color.WHITE);
            setResizable(false);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);

            x = getWidth() / 2 - 10;
            y = getHeight() - getHeight() / 2;
        }

        public void run() {
            while (true) {
                try {

                } catch (Exception e) {

                }
            }
        }

        public void paint(Graphics g) {
            dbImage = createImage(getWidth(), getHeight());
            dbg = dbImage.getGraphics();
            paintComponent(dbg);
            g.drawImage(dbImage, 0, 0, this);
        }

        public void paintComponent(Graphics g) {
            g.drawString("POS: " + mx + ", " + my, 10, 40);
            System.out.println(getAngle());
            g.drawImage(ship, x, y, this);
            g.drawLine(x + 12, y + 10, mx, my);
            repaint();
        }

        public int getAngle() {
            a = mx - (x + 12);
            b = (y - 10) - my;
            return degree = (int) Math.toDegrees(Math.atan2(b, a));
        }

        @Override
        public void keyTyped(KeyEvent e) {

        }

        @Override
        public void keyPressed(KeyEvent e) {

        }

        @Override
        public void keyReleased(KeyEvent e) {

        }

        @Override
        public void mouseDragged(MouseEvent e) {

        }

        @Override
        public void mouseMoved(MouseEvent e) {
            mx = e.getX();
            my = e.getY();
        }

        @Override
        public void mouseClicked(MouseEvent e) {

        }

        @Override
        public void mousePressed(MouseEvent e) {

        }

        @Override
        public void mouseReleased(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {

        }

        @Override
        public void mouseExited(MouseEvent e) {

        }
    }

【问题讨论】:

  • 这个人可能会帮助你:youtube.com/watch?v=4wWLEeQSXLQ&feature=relmfu
  • 我刚刚看了那个视频,我已经知道如何移动这样的对象了。我需要做的是旋转我的图像,即船,使其前面始终注视着鼠标。

标签: java image swing java-2d image-rotation


【解决方案1】:

您可以使用Java2D。它允许旋转图像并对图像进行许多其他很酷的操作。它还获得了硬件加速支持(通过 DirectX 或 OpenGL)。

Java2D 内置在 JRE 中。

【讨论】:

  • 我会,但问题是我不确定如何使用 2D。我刚开始学习 Java,我编写了一个名为 XliteRSPS xlitersps.com 的代码,它是一个 RuneScape 私人服务器,所以我并不真正处理图形,因为它们都在游戏客户端中。
  • 这里有一些示例代码:javareference.com/jrexamples/viewexample.jsp?id=88 - 它适用于您已经在游戏中使用的 Graphics 类。
  • 好吧,我有点明白如何使用它了。我现在遇到的问题是当我逆时针绕过它时它是顺时针旋转的。你知道是否有办法让它以另一种方式旋转或单位圆会?
【解决方案2】:

在您的 paintComponent 方法中,您可以使代码如下所示:

public void paintComponent(Graphics g) {
    g.drawString("POS: " + mx + ", " + my, 10, 40);
    System.out.println(getAngle());
    Graphics2D g2d = new (Graphics2D)g;
    g2d.translate(X, Y);
    g2d.rotate(DEGREES);
    g2d.drawImage(ship, 0, 0, WIDTH, HEIGHT, this); 
    g.drawLine(x + 12, y + 10, mx, my);
    repaint();
}

对于更复杂的使用,您可以创建一个包含所有船舶图纸计算的方法:

public void paintComponent(Graphics g) {
    g.drawString("POS: " + mx + ", " + my, 10, 40);
    System.out.println(getAngle());
    drawShip(g);
    g.drawLine(x + 12, y + 10, mx, my);
    repaint();
}

public void drawShip(Graphics g){
    Graphics2D g2d = (Graphics2D)g;
    g2d.translate(X, Y);
    g2d.rotate(DEGREES);
    g2d.drawImage(ship, 0, 0, WIDTH, HEIGHT, this);
}

【讨论】:

    【解决方案3】:

    一种方法是使用来自the methods of AffineTransform 之一的旋转实例,该实例接受 X、Y 坐标的锚点。

    【讨论】:

    • @trashgod 嘿.. 小行星怎么会出现在场地中间?不公平!不过很有趣.. ;)
    • 能量护盾留作练习。 :-)
    猜你喜欢
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多