如何在Java中暂停和恢复一个简单的游戏
我用java做了一个简单的游戏,是关于“网球背景”和“网球”的,球是自动随机移动的 我的游戏由两个文件组成,第一个文件为Jpanel,第二个文件为JFrame 我的问题是:我需要通过点击鼠标来控制“停止和恢复”球, 我试图在线程运行循环期间放置wait(),但失败了,我不知道原因是什么,因此,请检查我的代码,然后告诉我什么是错误的,什么是真正的方法“暂停和恢复”线程在我的简单游戏 tennis.java文件(包含线程):如何在Java中暂停和恢复一个简单的游戏,java,multithreading,actionlistener,java-3d,Java,Multithreading,Actionlistener,Java 3d,我用java做了一个简单的游戏,是关于“网球背景”和“网球”的,球是自动随机移动的 我的游戏由两个文件组成,第一个文件为Jpanel,第二个文件为JFrame 我的问题是:我需要通过点击鼠标来控制“停止和恢复”球, 我试图在线程运行循环期间放置wait(),但失败了,我不知道原因是什么,因此,请检查我的代码,然后告诉我什么是错误的,什么是真正的方法“暂停和恢复”线程在我的简单游戏 tennis.java文件(包含线程): /* *tennis.java * *创建于2011年11月15日下午3:
/*
*tennis.java
*
*创建于2011年11月15日下午3:35:28
*/
包io;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.imageio.imageio;
公共类网球扩展javax.swing.JPanel实现Runnable{
缓冲成像球;
缓冲图像背景;
int ball_h=0;
int ball_w=0;
整数高度=0;
整数宽度=0;
int yPos=-1;
int xPos=10;
int pause=20;
//移动速度
int xMov=5;
int-yMov=10;
布尔值=假;
int play=0;
螺纹流道;
/**创造网球新形式*/
公共网球比赛是个例外{
ball=ImageIO.read(新文件(“networks/ball.png”);
bg=ImageIO.read(新文件(“netsines/bg.jpg”);
球h=50;
球w=50;
高度=600-球高度;
宽度=800-球头宽度;
流道=新螺纹(此);
runner.start();
}
公开作废开始(){
如果(播放==0){
play=1;
单击=真;
}否则{
play=0;
单击=真;
}
系统输出打印LN(播放);
}
公共停车场(){
runner=null;
}
@凌驾
公共空间涂料(图g){
Graphics2D g2D=(Graphics2D)g;
g2D.drawImage(bg,0,0,800600,this);
g2D.drawImage(ball、xpo、yPos、50,50,this);
}
/**此方法从构造函数中调用,以
*初始化表单。
*警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
//
私有组件(){
javax.swing.GroupLayout=newjavax.swing.GroupLayout(this);
这个.setLayout(布局);
layout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,400,短。最大值)
);
layout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0,300,短。最大值)
);
}//
//变量声明-不修改
//变量结束声明
@凌驾
公开募捐{
while(runner==runner){
如果(xPos>=(宽度))
{
xMov*=-1;
}
xPos+=xMov;
如果(xPos<1)
{
xMov*=-1;
}
如果(yPos>=(高度球高度))
{
yMov*=-1;
}
yPos+=yMov;
if(yPos<1)
{
yMov*=-1;
}
重新油漆();
试一试{
如果(播放==1){
线程。睡眠(暂停);
}否则{
已同步(此){
while(play==0){
等待();
}
}
}
}捕获(中断异常例外){
Logger.getLogger(netsing.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
}
Tennis3D.java文件(用于启动游戏和定义线程的框架):
/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
/*
*Tennis3D.java
*
*创建于2011年11月15日下午3:42:42
*/
包io;
网球;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.io.IOException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
公共类Tennis3D扩展javax.swing.JFrame实现MouseStener{
网球;
/**创建新表单Tennis3D*/
公共田纳西3D(){
超级(“Tennis3D”);
设置大小(800600);
试一试{
网球=新网球();
加上(网球),;
网球。阿德穆塞利斯滕纳(本);
}捕获(IOEX异常){
Logger.getLogger(Tennis3D.class.getName()).log(Level.SEVERE,null,ex);
}
setVisible(真);
}
/**此方法从构造函数中调用,以
*初始化表单。
*警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
//
私有组件(){
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
javax.swing.GroupLayout=newjavax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(布局);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment
/*
* 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);
}
}
}
}
/*
* 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) {
}
}
while (!game.isOver())
{
if (!game.isPaused())
game.update() // this moves your ball, players, etc
}
initGame();
while(!gameOver)
{
readInput();
update(deltaTime);
draw();
}
for(GameObject go : myObjectList)
{
go.update(deltaTime);
}
for(GameObject go : myObjectList)
{
if(go.isActive())
{
go.update(deltaTime);
}
}
final int PAUSE = 1;
final int RUNNING = 2;
public enum State {
RUNNING,
PAUSE
}
switch(state){
case PAUSE:
Thread.sleep(100);
break;
case RUNNING:
// do something entertaining
break;
}