`
CrazyMizzz
  • 浏览: 24229 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

java 线程弹球小游戏

阅读更多
最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善

这里是提纲
1.线程弹球游戏实现
1.实现界面需要使用哪些API类
JFrame
JPanel
JButton
FlowLayout
Graphics2D
Thread
Color
ActionListener
ActionEvent
MouseListener
MouseEvent
BorderLayout
2.实现界面步骤
3.给按钮添加监听器,传递centerPanel
4.定义小球类
5.点击添加按钮,创建小球,让小球运动起来

2.练习
1.绘制立体球
             实现的代码是这样
              for (int i = 0; i != 100; i++) {
g.setColor(new Color(i, i, i));
g.fillOval(x - r + i / 2, y - r + i / 2, r * 2 - i, r * 2 - i);

      }
2.球体碰撞
            在BallListener类中定义三个数组队列分别保存小球的坐标,x,y,半径R
,作为ball类构造函数的形参传过去,在ball的peng函数中计算是否碰撞,只要计算两个小球圆心的距离之和小于等于两个小球的半径之和就可以了。每个小球每次都要和其他的所有小球进行比较。
3.如何移除
            这个还没想到,之后补上
4.如何暂停
            在Ball类的构造函数中传一个布尔型的isrun参数,值为true,如果点暂停,isrun变成false.在run函数中进行判断,若isrun为true则线程继续,否则线程暂停。



      下面为具体代码,仍有很多BUG,之后完善了再改

    
package MMM0528;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;

import javax.swing.JPanel;

public class ball extends Thread {
	private int x;
	private int y;
	private int r;
	private Color color;
	private int xspeed;
	private int yspeed;
	private JPanel centerpanel;
	private Graphics2D g;
	public static boolean isrun;
	public boolean isremove ;
	private ArrayList arrayx;
	private ArrayList arrayy;
	private ArrayList arrayr;
	private int i;
	
	public ball(int x, int y, int r, int xspeed, int yspeed,
			JPanel centerpanel, boolean isrun,int i,ArrayList arrayx,ArrayList arrayy,ArrayList arrayr) {
		
		this.x = x;
		this.y = y;
		this.r = r;

		this.xspeed = xspeed;
		this.yspeed = yspeed;
		this.centerpanel = centerpanel;
		this.g = (Graphics2D) centerpanel.getGraphics();
		this.isrun = isrun;
		this.i=i;
		
		this.arrayx = arrayx;
		this.arrayy = arrayy;
		this.arrayr = arrayr;

		// 设置取表画笔的锯齿状
		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
	}

	public void run() {
		while (true) {
			if (balllistener.getisrun() == true) {
				this.peng();
				this.draw(g);
				this.move();
				this.peng();
				try {
					Thread.sleep(30);
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
			}
		}
	}

	public void draw(Graphics2D g) {

		// 擦除上一次绘制的小球
//		g.setColor(Color.white);
//		g.fillOval(x - r - 10, y - r - yspeed + xspeed, r * 2 + 10, r * 2 + 10);

		// 绘制新的小球
		for (int i = 0; i != 100; i++) {
			g.setColor(new Color(i, i, i));
			g.fillOval(x - r + i / 2, y - r + i / 2, r * 2 - i, r * 2 - i);

		}
	}

	public void remove(Graphics2D g) {
		g.setColor(Color.white);
		g.fillOval(x - r - 1, y - r - yspeed - 1, r * 2 + 2, r * 2 + 3);
		g.fillOval(x - r, y - r, r * 2, r * 2);
	}

	public void move() {
		x += xspeed;
		y += yspeed;
		arrayx.set(i,x);
		arrayy.set(i,y);
		if (y >= (centerpanel.getHeight() - r)) {
			yspeed = -yspeed;
		} else if (y <= r) {
			yspeed = -yspeed;
		} else if (x <= r) {
			xspeed = -xspeed;
		} else if (x >= (centerpanel.getWidth() - r)) {
			xspeed = -xspeed;
		}
		
		
		
	}

	public void peng() {
		
		for (int j = 0; j < arrayx.size(); j++) {
			if(j==i){
				j++;
				continue;
			}
			double dis;
			int xx, yy;
			xx = (int) arrayx.get(j);
			yy = (int) arrayy.get(j);
			dis = Math.sqrt(Math.abs((xx - x)) * Math.abs((xx - x)) + Math.abs((yy - y)) * Math.abs((yy - y)));
			int R = (int) arrayr.get(j);
			R += r;
			int dist = (int) dis;
			if (dist == R) {
				System.out.println(xx);
//				if (x >= xx && y >= yy) {
//					xspeed = -xspeed;
//					yspeed = -yspeed;
//				}else if (x >= xx && y < yy) {
//					xspeed = -xspeed;
//				}else if (x < xx && y >= yy) {
//					yspeed = -yspeed;
//				}else if (x < xx && y < yy) {
					xspeed = -xspeed;
					yspeed = -yspeed;
//				}
			}
		}

	}

	// public void collide(){
	//
	// }

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getR() {
		return r;
	}

	public void setR(int r) {
		this.r = r;
	}

	public Color getColor() {
		return color;
	}

	public void setColor(Color color) {
		this.color = color;
	}

	public int getXspeed() {
		return xspeed;
	}

	public void setXspeed(int xspeed) {
		this.xspeed = xspeed;
	}

	public int getYspeed() {
		return yspeed;
	}

	public void setYspeed(int yspeed) {
		this.yspeed = yspeed;
	}

	public static void setisrun() {
		isrun = true;
	}

}

package MMM0528;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JPanel;

public class balllistener implements ActionListener {
	static boolean isrun=true;
	private static int i=0;
	private JPanel centerPanel;
	private Graphics2D g;
	private ArrayList arrayx =new ArrayList();
	private ArrayList arrayy =new ArrayList();
	private ArrayList arrayr =new ArrayList();
	public balllistener(JPanel centerPanel) {
		this.centerPanel = centerPanel;
		g = (Graphics2D)centerPanel.getGraphics();//强制转型

//		g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
//				RenderingHints.VALUE_ANTIALIAS_ON);
	}

	public void actionPerformed(ActionEvent e) {
		//判断点击的是否添加按钮
		if(e.getActionCommand().equals("添加")){
//			System.out.println("添加");
			Random rand = new Random();
			int x = rand.nextInt(centerPanel.getWidth());
			int y = 50;
			int r = 40-rand.nextInt(20);
			
			int xspeed = rand.nextInt(10)-5;
			int yspeed = rand.nextInt(10)-5;
			//创建小球对象
			arrayx.add(x);
			arrayy.add(y);
			arrayr.add(r);
			
			ball balll = new ball(x,y,r,xspeed,yspeed,centerPanel,true,i,  arrayx,  arrayy,  arrayr);
			i++;
			
			balll.start();//启动线程
			
		}else if(e.getActionCommand().equals("移除")){
//			System.out.println("移除");
		}else if(e.getActionCommand().equals("暂停")){
			isrun=false;
		}
	}
	public static boolean getisrun(){
		return isrun;
	}
	
	public void setisrun(){
		isrun=true;
	}
	
	public static int getI(){
		return i;
	}

}

package MMM0528;

import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TanqiuUI extends JFrame {

	public static void main(String[] args) {
		TanqiuUI tq = new TanqiuUI();
		tq.intUI();
	}

	public void intUI() {
		this.setTitle("弹球游戏");
		this.setSize(500, 500);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);
		this.setResizable(false);
		BorderLayout bl = new BorderLayout();
		this.setLayout(bl);
		/*
		 * 北边的按钮
		 */
		JPanel panelnorth = new JPanel();
		JButton butadd = new JButton("添加");
		JButton butremove = new JButton("移除");
		JButton butpause = new JButton("暂停");
		panelnorth.add(butadd);
		panelnorth.add(butremove);
		panelnorth.add(butpause);
		this.add(panelnorth, BorderLayout.NORTH);
		/*
		 * 添加中间的画板
		 */
		JPanel panelcent = new JPanel();
		panelcent.setBackground(Color.WHITE);
		this.add(panelcent, BorderLayout.CENTER);
		/*
		 * 创建监听类对象
		 */
		balllistener bl1 = new balllistener(panelcent);
		/*
		 * 调用事件监听方法
		 */
		butadd.addActionListener(bl1);
		butremove.addActionListener(bl1);
		butpause.addActionListener(bl1);

		this.setVisible(true);
	}
}
分享到:
评论

相关推荐

    java弹球小游戏,多线程

    Java弹球小游戏是一款基于Java编程语言开发的简单游戏,它运用了多线程技术来实现游戏的流畅运行。在这个游戏中,通常会有至少两个线程在同时工作:一个是控制游戏主循环,另一个则处理用户输入或其他特定的游戏逻辑...

    JAVA编写的多线程小弹球测试

    在“JAVA编写的多线程小弹球测试”项目中,开发者利用Java语言创建了一个生动有趣的多线程应用,即一个模拟小弹球运动的程序。这个程序的特点是弹球会随机出现、随机选择颜色,并且在碰到边界时能自动反弹,充分展示...

    Java多线程弹球

    Java做的弹球图形界面小游戏使用awt.*可以创建多个小球.

    java经典小游戏弹球程序

    在游戏开发领域,虽然不如专门的游戏引擎那么流行,但Java同样可以创造出有趣且互动性强的小游戏。"弹球程序"就是一个很好的例子,它展示了Java在实现简单但引人入胜的休闲游戏方面的潜力。 "打砖块"是一款经典的...

    弹球小游戏java实现.zip

    通过这个弹球小游戏的开发,你可以深入理解Java的面向对象编程、GUI设计、多线程、事件处理以及基本的物理模拟。这不仅是提升编程技能的好途径,也是对软件工程实践经验的积累。无论是作为课程设计的一部分,还是...

    Java程序设计实验报告2(弹球游戏)

    ### Java程序设计实验报告2(弹球游戏):关键技术知识点详解 #### 1. Swing图形用户界面编程 Swing是Java中的一个用于构建GUI应用程序的轻量级组件工具包,它提供了比AWT更丰富的组件集,允许开发者创建更加美观、...

    JAVA 手机弹球小游戏

    【JAVA 手机弹球小游戏】是一款基于JAVA编程语言开发的移动平台休闲娱乐游戏,它在手机上模拟了经典的弹球玩法,为用户带来轻松愉快的游戏体验。此游戏的实现涉及多个关键知识点,包括图形界面设计、游戏逻辑控制、...

    Java 弹球小游戏

    在本项目中,“Java 弹球小游戏”是一个利用Java编程语言开发的互动游戏,它具有多线程特性,使得每个弹球都能独立运动。通过点击“add”按钮,玩家可以增加新的弹球到游戏中,每个新加入的弹球都会拥有自己独立的...

    弹球小游戏源码

    【弹球小游戏源码】是一款基于Java编程语言开发的小型游戏项目,主要涵盖了游戏逻辑、图形界面和事件处理等核心知识点。在这个项目中,开发者利用Java的Swing库或者JavaFX库来创建用户界面,通过Java的面向对象编程...

    Java程序设计实验报告2(弹球游戏)[1]1.pdf

    Java 程序设计实验报告之弹球游戏实现 本实验报告的目的是掌握 ...本实验报告实现了一个完整的弹球游戏,掌握了 Java 语言的图形用户界面编程、事件处理、多线程编程等技术,并培养了独立查找资料、解决问题的能力。

    弹球游戏(java程序)

    【标题】:“弹球游戏(Java程序)”是一款基于Java编程语言开发的桌面游戏,它利用了Swing库和多线程技术来实现动态的弹球运动效果。 【描述】:该程序是在Eclipse集成开发环境中创建的,利用了SwingDesigner工具...

    java编写弹球小程序

    本项目是一个基于Java编写的弹球小游戏,它为初学者提供了一个实际操作和学习Java语言的良好平台。下面将详细介绍这个弹球游戏涉及的Java知识点。 1. **Java基础语法**:游戏的核心代码会涉及到变量声明、条件语句...

    Java弹球小游戏.zip

    Java弹球小游戏是一款基于Java编程语言开发的简单娱乐软件,旨在帮助初学者了解游戏开发的基础知识,同时也为有经验的开发者提供一个回顾基础的平台。这个项目包含了一系列的Java源代码文件,允许用户直接运行体验...

    经典项目Java小游戏 - 弹力球

    设计一个Java弹球小游戏的思路如下: 创建游戏窗口:使用Java图形库(如Swing或JavaFX)创建一个窗口,作为游戏的可视化界面。 绘制游戏界面:在游戏窗口中绘制游戏所需的各个元素,包括弹球、挡板、得分等。 ...

    Android studio 小游戏,弹球小游戏

    【Android Studio小游戏:弹球小游戏】是基于Android开发平台,使用Android Studio集成开发环境创建的一款简单而有趣的休闲游戏。这个游戏通常包含一个弹球和多个障碍物,玩家通过控制挡板来反射弹球,避免弹球掉落...

    java弹球游戏源码已编译

    Java弹球游戏是一款基于Java编程语言开发的简单游戏,它主要展示了如何利用Java Swing或JavaFX库创建图形用户界面(GUI)以及如何处理线程来实现动态的游戏效果。在这个游戏中,一个小球会在屏幕内弹来弹去,碰到...

    java弹球程序弹球程序

    根据提供的信息,我们可以总结出以下有关Java弹球程序的关键知识点: ### Java弹球程序概述 Java弹球程序是一个基于Swing框架的简单图形用户界面(GUI)...这些类共同作用,形成了一个简单但功能完备的Java弹球游戏。

    java桌面弹球

    "Java桌面弹球"是一款基于Java编程语言开发的桌面游戏,它通过模拟物理弹射机制,为用户提供了简单而有趣的娱乐体验。在这个游戏中,玩家通常需要控制一个挡板来反弹小球,避免小球落下屏幕,同时通过碰撞消除屏幕上...

    java 桌面弹球

    Java 桌面弹球是一款基于Java编程语言开发的小型游戏,它利用Java的图形用户界面(GUI)库,如Swing或JavaFX,来创建一个互动的弹球游戏。这个游戏通常包括一个桌面背景,一个可移动的挡板,以及在屏幕上弹跳的弹球...

Global site tag (gtag.js) - Google Analytics