我试图用Java制作恐龙游戏,而我试图使我按下空格时的角色跳起来,我该如何去做呢?我想知道如何重绘玩家(圆圈)以使其Y值更改为降低它,使其看起来像玩家在跳跃。 ---免责声明这是我的第二篇文章,所以对我容易。 ---
package main;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
public class mainGame extends JPanel implements ActionListener, KeyListener {
JFrame frame;
Timer t = new Timer(5, this);
double x = 750, y = 290, velX = 2, velY = 2, playerX = 10, playerY = 310;
boolean gameOver = false;
long jumpingTime = 200;
public void actionPerformed(ActionEvent e) {
if (x == 30) {
gameOver = true;
} else {
x -= velX;
if (x == 0) {
x = 750;
}
}
}
@Override
public void keyTyped(KeyEvent keyEvent) {
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_SPACE) {
repaint(playerY - 20);
new Thread(new thread()).start();
}
}
@Override
public void keyReleased(KeyEvent keyEvent) {
int keyCode = keyEvent.getKeyCode();
if (keyCode == KeyEvent.VK_SPACE) {
repaint((long) (playerY += 20));
new Thread(new thread()).start();
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Rectangle2D cact = new Rectangle2D.Double(x, y, 20, 40);
g2.fill(cact);
Ellipse2D player = new Ellipse2D.Double(playerX, playerY, 20, 20);
g2.fill(player);
g.drawLine(0, 330, 740, 330);
t.start();
if (gameOver) {
g.setFont(new Font("TimesRoman", Font.PLAIN, 40));
g.drawString("Game Over!", 280, 200);
}
repaint();
}
public class thread implements Runnable {
@Override
public void run() {
try {
Thread.sleep(jumpingTime);
} catch (Exception e) {
e.printStackTrace();
new Thread(this).start();
System.exit(0);
}
}
}
public static void main(String[] args) {
mainGame mG = new mainGame();
JFrame frame = new JFrame("Dino Game With AI");
frame.getContentPane().add(new mainGame());
frame.setSize(750, 400);
frame.setBackground(Color.white);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.addKeyListener(mG);
}
}
答案 0 :(得分:0)
我能想到的最简单的事情是您正在使用的框架。首先,放弃您的“线程”课程。它什么也没做。
您执行的动作是您的“事件循环”,这意味着它被重复调用并执行游戏逻辑。
int jumpState = 0;
public void actionPerformed(ActionEvent e) {
if (x == 30) {
gameOver = true;
} else {
x -= velX;
if (x == 0) {
x = 750;
}
}
//Jump logic.
if(jumpState > 0){
playerY = 20 - 20 * jumpState;
jumpState--;
}
repaint();
}
跳转状态是您从关键侦听器更新的字段。例如,在关键的发布代码中。
@Override
public void keyReleased(KeyEvent keyEvent) {
int keyCode = keyEvent.getKeyCode();
if (keyCode == KeyEvent.VK_SPACE) {
//start a jump if not already jumping.
if(jumpState==0){
jumpState = 5;
}
}
}
想法是,释放空格键,并将jumpState
设置为5。现在事件循环正在运行,看到jumpState
的值为5,因此它相应地定位了玩家的身高,并降低jumpState
,最终jumpState为0,玩家不再跳跃。该值可以根据您希望玩家跳多久而改变。
此外,从t.start()
中删除paintComponent
时,仅当您要开始玩游戏时才调用t.start()。 paintComponent
经常被随机调用。