以前学习每个知识点时,觉得还行,但是直到学习了多线程技术后,我们开始做一些简单的小游戏,第一次听的时候还是能听懂的 但是自己去写的时候麻烦来了 写不出 ,所以这几天转换一下思路 不在意怎么写 而是先分析游戏需要什么,这样做的效果还是很明显的 ,所以贴出来分享一下
线程创建小球及移动
1,创建小界面类;游戏区域和控制区域
2,创建创建监听器,监听按钮,去除按钮的焦点(按钮默认是有焦点的),游戏结束后要清除队列中的小球 否则小球在原来小球的基础上会再创建小球
3,设置按钮文本的变换
4,创建小球类,线程暂停
a, 小球的属性:
小球左上角的点
小球的大小
小球移动的距离
小球的颜色
b, 在小球类的构造方法中初始化小球
使用随机数来决定小球的大小
在结束游戏重新开始的时候也要初始化小球的暂停与停止.否则会出现停止后不能开始等问题
小球的大小
小球出现的坐标
小球移动的距离
随机小球的颜色
c,小球只能在游戏区域移动
左边界=< x >=右边界,否则就往相反方向跑
上边界=< x >=下边界,否则就往相反方向跑
将移动的距离赋值给x,y
d,绘制自己的属性
颜色
大小
e,判断如果没有结束和暂停, 线程每10毫秒执行一次,
f,创建两个属性 暂停和停止;默认是false
创建三个方法
继续
false
暂停
true
停止
true
5,在设置按钮文本的位置调用暂停,继续,停止的方法
6,创建线程刷新游戏区域
代码如下:
package com.Thread0712;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
/**
* 创建游戏的界面类
*
* @author Administrator
*
*/
public class BallUI extends JFrame {
JPanel panel;
JButton startbtn;
// 创建队列保存小球
public static ArrayList<Ball> balllist = new ArrayList<Ball>();
public static void main(String[] args) {
new BallUI();
}
// 创建构造方法
public BallUI() {
this.setTitle("线程游戏");
this.setSize(500, 400);
this.setDefaultCloseOperation(3);
this.setLayout(new FlowLayout());
// 游戏界面区域
panel = new Mypanel();
this.add(panel);
// 游戏的控制区域
JPanel bottom = creatbottom();
this.add(bottom);
this.setVisible(true);
}
// 游戏类
class Mypanel extends JPanel {
public Mypanel() {
this.setBackground(Color.WHITE);
// 创建边框线
this.setPreferredSize(new Dimension(400, 300));
LineBorder lineB = new LineBorder(Color.BLUE);
this.setBorder(lineB);
}
// 重绘容器
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < balllist.size(); i++) {
Ball ball = balllist.get(i);
ball.Draw(g);
}
}
}
// 游戏控制区域
public JPanel creatbottom() {
// 创建控制区域的容器
JPanel bottom = new JPanel();
// 创建控制区域的大小
bottom.setPreferredSize(new Dimension(400, 50));
// 创建按钮
startbtn = new JButton("开始游戏");
JButton overbtn = new JButton("结束游戏");
// 将按钮添加到容器中
bottom.add(startbtn);
bottom.add(overbtn);
BtnListener BtnLis = new BtnListener();
startbtn.addActionListener(BtnLis);
overbtn.addActionListener(BtnLis);
return bottom;
}
// 创建监听器
class BtnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 获得默认按钮
String comamnd = e.getActionCommand();
if ("开始游戏".equals(comamnd)) {
// 创建小球在游戏界面
for (int i = 0; i < 5; i++) {
// 创建小球
Ball ball = new Ball();
// 启动小球线程
ball.start();
// 将小球装到容器中
balllist.add(ball);
}
// 启刷新界面的线程
UpdateThreadPanel ut = new UpdateThreadPanel(panel);
ut.start();
startbtn.setText("暂停游戏");
} else if ("暂停游戏".equals(comamnd)) {
Ball.pauseball();
startbtn.setText("继续游戏");
} else if ("继续游戏".equals(comamnd)) {
Ball.repauseball();
startbtn.setText("结束游戏");
} else if ("结束游戏".equals(comamnd)) {
Ball.stopball();
//清除队列
balllist.clear();
startbtn.setText("开始游戏");
}
}
}
}
package com.Thread0712;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
/**
* 创建小球的类
*
* @author Administrator
*
*/
public class Ball extends Thread {
int x, y;// 小球最左边的点坐标
int width, height; // 小球的大小
Color color;// 小球的颜色
int xc, yc;// 小球移动水平和垂直移动的距离
int arr[] = { -1, 1 };// 小球移动
static boolean ispauseball =false;//是否暂停
static boolean isstop = false;//是否结束
Random rd = new Random();
// 使用构造函数来初始化
public Ball() {
drawball();
}
// 初始化小球的方法
public void drawball() {
ispauseball = false;
isstop = false;
// 随机小球的大小
width = rd.nextInt(70) + 30;
height = rd.nextInt(70) + 30;
// 随机小球的位置
x = rd.nextInt(400 - width);
y = rd.nextInt(300 - height);
// 随机小球的颜色
color = new Color(rd.nextInt(255), rd.nextInt(255), rd.nextInt(255));
// 小球的移动
xc = rd.nextInt(3) - 1;
yc = rd.nextInt(3) - 1;
// 判断小球在移动时取得随机数是否都为0
if (xc == 0 && yc == 0) {
yc = arr[rd.nextInt(2)];
}
}
// 判断小球的边界
public void move() {
if (x <= 0 || x >= 400 - width) {
xc = -xc;
}
if (y <= 0 || y >= 300 - height) {
yc = -yc;
}
x += xc;
y += yc;
}
//暂停
public static void pauseball(){
ispauseball = true;
}
//继续
public static void repauseball(){
ispauseball = false;
}
//结束
public static void stopball(){
isstop = true;
}
// 绘制小球
public void Draw(Graphics g) {
g.setColor(color);
g.fillOval(x, y, width, height);
}
@Override
public void run() {
while (!isstop) {
if(!ispauseball){
move();
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.Thread0712;
//刷新窗体类
import javax.swing.JPanel;
public class UpdateThreadPanel extends Thread{
private JPanel panel;
public UpdateThreadPanel(JPanel panel){
this.panel = panel;
}
public void run(){
while (!Ball.isstop) {
if(!Ball.ispauseball){
panel.repaint();
}
try{
Thread.sleep(10);
}catch(Exception e){
e.printStackTrace();
}
}
}
}