java - 在 Java 2D 游戏中, Sprite 没有朝正确的方向移动

标签 java swing sprite game-engine

正在开发 Java 2D 游戏。

Sprite 应该在特定的角度移动,通过按左右键设置,然后按向上箭头键。

它没有按照我希望它移动的角度移动。它移动的角度似乎相差 90 度。怎么了?

Thing类的相关方法

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.ImageIcon;

public class Thing {

    Image image;
    int width,height;
    double x,y,dx,dy,angle;

    public Thing(){

        image = new ImageIcon(this.getClass().getResource("image.png")).getImage();
        width = image.getWidth(null);
        height = image.getHeight(null);

        dx = 0;
        dy = 0;

        angle=90;

        x = 250;
        y = 250;

    }
    public void move(){
        x += dx;
        y += dy;
    }

    public void keyPressed(KeyEvent e){

        int key = e.getKeyCode();

        if(key==KeyEvent.VK_LEFT)angle-=5;
        if(key==KeyEvent.VK_RIGHT)angle+=5;
        if(key==KeyEvent.VK_UP){

            dy = 5 * Math.sin(angle);
            dx = 5 * Math.sin(90-angle);

        }

    }

    public void keyReleased(KeyEvent e){

        int key = e.getKeyCode();

        if(key==KeyEvent.VK_UP){
            setDY(0);
            setDX(0);
        }

    }

}

Board类相关方法:

package learningMovement;

import java.util.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.Timer;

public class Board extends JPanel implements ActionListener, KeyListener {

    Thing t;

    Timer timer;

    public Board(){
        timer = new Timer(10,this);
        t = new Thing();
        setFocusable(true);
        timer.start();
        addKeyListener(this);
    }

    public void paintComponent(Graphics g)
    {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.rotate(Math.toRadians(t.getAngle()),t.getX()+(t.getWidth()/2),t.getY()+(t.getHeight()/2));
        g2d.drawImage(t.getImage(),(int)t.getX(),(int)t.getY(),this);

    }

    public void actionPerformed(ActionEvent e){

        t.move();
        repaint();

    }

    @Override
    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if(key==KeyEvent.VK_LEFT)t.keyPressed(e);
        if(key==KeyEvent.VK_RIGHT)t.keyPressed(e);
        if(key==KeyEvent.VK_UP)t.keyPressed(e);

    }

    public void keyReleased(KeyEvent e) {

        int key = e.getKeyCode();

        if(key==KeyEvent.VK_LEFT)t.keyReleased(e);
        if(key==KeyEvent.VK_RIGHT)t.keyReleased(e);
        if(key==KeyEvent.VK_UP)t.keyReleased(e);

    }

    public void keyTyped(KeyEvent arg0) {}



}

最佳答案

为什么会这样:

        dy = 5 * Math.sin(angle);
        dx = 5 * Math.sin(90-angle);

什么时候应该是:

        dy = 5 * Math.sin(angle);
        dx = 5 * Math.cos(angle);

也像 HAL9000 所说不要忘记转换为弧度。

关于java - 在 Java 2D 游戏中, Sprite 没有朝正确的方向移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20867772/

相关文章:

java - 如何解决 ClassNotFoundException?

java - 如何在运行时更改 sql 查询?

java - gxt 2.3 网格过滤器不起作用

java - 如何在不破坏其默认实现的情况下为 JPanel 实现 MouseWheelListener?

java - 任务开始后更新进度条最大值

asp.net - Sprite 图像质量差

java - 在java中的抽象表模型中定义下拉组合框

java - 在 JTextField java 中使用 ENTER 键

css - 输入[类型 ="button"] Sprite 悬停有过渡问题

javascript - 在 pixi.js 中初始加载后访问纹理