gpt4 book ai didi

java - 物体在当前面向方向上的旋转和移动; java

转载 作者:太空宇宙 更新时间:2023-11-04 13:18:07 24 4
gpt4 key购买 nike

所以我正在尝试用 java 构建一个自上而下的太空射击游戏。

我是个新手,但我已经很好地掌握了它,并完善了乒乓球制作。我的主要问题是我似乎无法降低轮换。

我希望能够按向右或向左箭头键,并让一个基本矩形沿着用户输入的方向绕其中心旋转。

一旦我按下了它,我希望能够向前或向后按箭头键,使其朝当前面向的方向移动。

到目前为止,我尝试过的所有操作都会影响框架中的所有内容,而不仅仅是单个对象。来自as2,旋转和对象在java中非常不同。

有人可以帮我解释一下我该怎么做吗?

package spaceroyalgame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.geom.AffineTransform;



public class SpaceRoyalGame extends JPanel implements KeyListener {
static double shipRotation=0, shipRotationSpeed=0, shipSpeed=0, TOPSPEED= 20;

static int shipy=50, shipx=50, shipWidth = 10, shipHeight = 20;
static int WorldWidth = 700, WorldHeight = 700;
static boolean slowdown = true;

public static void main(String[] args) throws InterruptedException {
SpaceRoyalGame game = new SpaceRoyalGame();

JFrame frame = new JFrame();
frame.add(game);
frame.setSize(WorldWidth,WorldHeight);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addKeyListener(game);


while(true){
game.moveShip();

game.repaint();

Thread.sleep(10);
}

}



public void moveShip(){
if (shipSpeed != 0) {
shipx += shipSpeed;
}
if (shipRotationSpeed != 0) {
shipRotation += shipRotationSpeed;
}
}


public void paint (Graphics g){
super.paint(g);
setBackground(Color.black);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.white);
Rectangle ship = new Rectangle(shipx,shipy,100,50);

g2d.rotate(Math.toRadians(shipRotation));
g2d.draw(ship);
g2d.fill(ship);


}

@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
slowdown = false;

if (keyCode == KeyEvent.VK_W) {
//System.out.println("W is pressed");
shipSpeed = -2;

}
if (keyCode == KeyEvent.VK_S) {
//System.out.println("S is pressed");
shipSpeed = 2;
}
if (keyCode == KeyEvent.VK_A) {
System.out.println("A is pressed");
shipRotationSpeed = 1;
shipRotation += shipRotationSpeed * (shipSpeed/TOPSPEED);

}
if (keyCode == KeyEvent.VK_D) {
System.out.println("D is pressed");
shipRotationSpeed = -1;
shipRotation += shipRotationSpeed * (shipSpeed/TOPSPEED);

}
}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {
shipRotationSpeed = 0;

shipSpeed = 0;

}

}

最佳答案

尝试使用Vectors 。由于“A”和“D”键正在修改您当前的角度,因此您应该保留一个变量来跟踪角度。

从那里:

x += speed * cos(θ)
y += speed * sin(θ)

此外,如果您希望能够加速/减速:

Δx = speed * cos(θ) * Δt + 1/2 * acceleration * Δt^2
Δy = speed * * sin(θ) * Δt + 1/2 * acceleration * Δt^2

Δt 是最后一帧之间的时间。

可能值得一看 Physics/Kinematics

关于java - 物体在当前面向方向上的旋转和移动; java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33354429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com