雪碧没有';在Java 2D游戏中,不要朝正确的方向移动
正在开发一个Java 2D游戏 精灵应该以特定的角度移动,按左右键进行设置,然后按向上箭头键 它不会以我想要的角度移动。它以90度不同的角度移动。怎么了雪碧没有';在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
事物的相关方法
类
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所说,不要忘记转换为弧度