You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Key Listener实现图像旋转?(小行星飞船开发需求)

如何通过Key Listener实现飞船旋转(小行星程序)

核心思路

要实现飞船旋转,需要给飞船添加角度属性,通过键盘左右键控制角度变化,再利用Graphics2D的旋转功能,以飞船中心为原点绘制旋转后的图像。

步骤1:修改Spaceship类,添加旋转相关逻辑

你的Spaceship类需要补充角度属性、旋转方法和正确的绘制逻辑:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.AffineTransform;

public class Spaceship {
    private int x, y;
    private Image image;
    private double angle; // 旋转角度(弧度)

    public Spaceship(int x, int y, ImageIcon icon) {
        this.x = x;
        this.y = y;
        this.image = icon.getImage();
        this.angle = 0; // 初始角度为0(朝右)
    }

    public void draw(Graphics2D g2) {
        // 保存当前绘图状态,避免影响其他元素
        AffineTransform originalTransform = g2.getTransform();

        // 把坐标系平移到飞船中心
        int centerX = x + image.getWidth(null) / 2;
        int centerY = y + image.getHeight(null) / 2;
        g2.translate(centerX, centerY);

        // 旋转坐标系
        g2.rotate(angle);

        // 绘制飞船,让图像中心与坐标系原点对齐
        g2.drawImage(image, -image.getWidth(null)/2, -image.getHeight(null)/2, null);

        // 恢复原来的绘图状态
        g2.setTransform(originalTransform);
    }

    // 顺时针旋转(右键触发)
    public void rotateRight() {
        angle += Math.toRadians(5); // 每次转5度,转成弧度
        angle %= Math.PI * 2; // 角度归一化,避免数值过大
    }

    // 逆时针旋转(左键触发)
    public void rotateLeft() {
        angle -= Math.toRadians(5);
        if (angle < 0) {
            angle += Math.PI * 2; // 保证角度为正
        }
    }

    // 可选:添加朝旋转方向移动的方法
    public void moveForward(int speed) {
        x += speed * Math.cos(angle);
        y += speed * Math.sin(angle);
        // 可添加屏幕边界检测,防止飞船飞出
    }

    // Getter和Setter
    public int getX() { return x; }
    public void setX(int x) { this.x = x; }
    public int getY() { return y; }
    public void setY(int y) { this.y = y; }
}

步骤2:修改SpaceInvaders类的键盘监听逻辑

在keyPressed方法中调用飞船的旋转方法:

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        ship.rotateRight();
    } else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        ship.rotateLeft();
    } else if (e.getKeyCode() == KeyEvent.VK_UP) {
        ship.moveForward(3); // 可选:按上键朝当前方向前进
    }
}

关键细节说明

  • 旋转原点:必须以飞船中心为旋转点,否则飞船会绕左上角偏移。通过translate把坐标系移到中心,再旋转即可解决。
  • 弧度转换:Graphics2D.rotate()接收的是弧度值,所以用Math.toRadians()把角度(比如5度)转成弧度。
  • 状态恢复:使用AffineTransform保存和恢复绘图状态,避免旋转操作影响小行星等其他元素的绘制。

内容的提问来源于stack exchange,提问作者Aejt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:45:25