【问题标题】:Sprite doesn't move in the right direction, in Java 2D game在 Java 2D 游戏中,Sprite 没有朝着正确的方向移动
【发布时间】:2016-03-16 03:03:37
【问题描述】:

正在开发 Java 2D 游戏。

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

它没有按照我希望它移动的角度移动。它以一个似乎与 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) {}



}

【问题讨论】:

    标签: java swing sprite game-engine


    【解决方案1】:

    为什么会这样:

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

    什么时候应该:

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

    也像 HAL9000 说的别忘了转换成弧度。

    【讨论】:

      【解决方案2】:

      你的angle 是度数,那么

      Math.sin(angle);
      

      应该变成

      Math.sin(Math.toRadians(angle));
      

      因为罪的论点必须用弧度表示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 2013-04-18
        • 1970-01-01
        相关资源
        最近更新 更多