雪碧没有';在Java 2D游戏中,不要朝正确的方向移动

雪碧没有';在Java 2D游戏中,不要朝正确的方向移动,java,swing,sprite,game-engine,Java,Swing,Sprite,Game Engine,正在开发一个Java 2D游戏 精灵应该以特定的角度移动,按左右键进行设置,然后按向上箭头键 它不会以我想要的角度移动。它以90度不同的角度移动。怎么了 事物的相关方法类 import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.ImageIcon; public class Thing { Image image; int

正在开发一个Java 2D游戏

精灵应该以特定的角度移动,按左右键进行设置,然后按向上箭头键

它不会以我想要的角度移动。它以90度不同的角度移动。怎么了

事物的相关方法

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

    }

}
董事会级别的相关方法:

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) {}



}

您的
角度
以度为单位,然后

Math.sin(angle);
应该成为

Math.sin(Math.toRadians(angle));
因为sin的参数必须用弧度表示。

为什么:

        dy = 5 * Math.sin(angle);
        dx = 5 * Math.sin(90-angle);
何时应该:

        dy = 5 * Math.sin(angle);
        dx = 5 * Math.cos(angle);
正如HAL9000所说,不要忘记转换为弧度