gpt4 book ai didi

java - 如何在 Java 中暂停和恢复一个简单的游戏

转载 作者:行者123 更新时间:2023-12-03 12:56:58 25 4
gpt4 key购买 nike

我用java做了一个简单的游戏,关于“网球背景”和“网球”,球是随机自动移动的,

我的游戏由两个文件组成,第一个文件前 Jpanel 和第二个文件 JFrame ,

我的问题是:我需要通过点击鼠标来控制“停止和恢复”球,
我试图在线程运行循环期间放置 wait(),但它失败了,我不知道是什么原因! ,所以请检查我的代码,然后告诉我有什么问题,以及在我的简单游戏中“暂停和恢复”线程的真正方法是什么!

网球.java 文件(其中包含线程):

/*
* tennis.java
*
* Created on Nov 15, 2011, 3:35:28 PM
*/
package io;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;


public class tennis extends javax.swing.JPanel implements Runnable{

BufferedImage ball;
BufferedImage bg;
int ball_h = 0;
int ball_w = 0;
int height = 0;
int width = 0;
int yPos = -1;
int xPos = 10;
int pause = 20;

// Move Speed
int xMov = 5;
int yMov = 10;
boolean clicked = false;
int play = 0;

Thread runner;

/** Creates new form tennis */
public tennis() throws IOException {

ball = ImageIO.read(new File("tennis/ball.png"));
bg = ImageIO.read(new File("tennis/bg.jpg"));
ball_h = 50;
ball_w = 50;
height = 600 - ball_h;
width = 800 - ball_w;

runner = new Thread(this);
runner.start();

}

public void start(){
if(play == 0){

play = 1;
clicked = true;

}else{
play = 0;
clicked = true;
}

System.out.println(play);
}

public void stop(){
runner = null;
}




@Override
public void paint(Graphics g){
Graphics2D g2D = (Graphics2D) g;

g2D.drawImage(bg, 0, 0, 800,600, this);
g2D.drawImage(ball, xPos, yPos,50,50, this);
}


/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);
}// </editor-fold>
// Variables declaration - do not modify
// End of variables declaration

@Override
public void run() {

while(runner == runner){



if(xPos >= (width))
{
xMov *= -1;
}



xPos += xMov;

if(xPos < 1)
{
xMov *= -1;
}

if(yPos >= (height-ball_h))
{
yMov *= -1 ;
}



yPos += yMov;

if(yPos < 1)
{
yMov *= -1 ;
}

repaint();



try {
if(play == 1){
Thread.sleep(pause);
}else{
synchronized(this){
while(play == 0){
wait();
}
}
}

} catch (InterruptedException ex) {
Logger.getLogger(tennis.class.getName()).log(Level.SEVERE, null, ex);
}

}
}

}

Tennis3D.java 文件(用于启动游戏和定义线程的框架):
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/*
* Tennis3D.java
*
* Created on Nov 15, 2011, 3:42:42 PM
*/
package io;

import io.tennis;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Tennis3D extends javax.swing.JFrame implements MouseListener{

tennis tennis;

/** Creates new form Tennis3D */
public Tennis3D() {
super("Tennis3D");
setSize(800,600);


try {
tennis = new tennis();
add(tennis);
tennis.addMouseListener(this);
} catch (IOException ex) {
Logger.getLogger(Tennis3D.class.getName()).log(Level.SEVERE, null, ex);
}


setVisible(true);

}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
);

pack();
}// </editor-fold>

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
Tennis3D tennis = new Tennis3D();
}
// Variables declaration - do not modify
// End of variables declaration

@Override
public void mouseClicked(MouseEvent e) {
tennis.start();
}

@Override
public void mousePressed(MouseEvent e) {

}

@Override
public void mouseReleased(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseExited(MouseEvent e) {

}
}

感谢您的帮助 :)

最佳答案

这是对 Nerdtron 在上述评论中所写内容的支持。通常游戏循环看起来像这样

 while (!game.isOver())
{
if (!game.isPaused())
game.update() // this moves your ball, players, etc
}

关于java - 如何在 Java 中暂停和恢复一个简单的游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8299010/

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