动态弹球的实现 加入了多线程技术--javaSE游戏准备工作
任务描述:实现了动态弹球的功能,对于有弹球功能的SE游戏奠定了基础。
package 运用线程技术的小球; import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;//不清楚这个有什么用
import java.util.*;
import javax.swing.*; public class Bounces { public static void main(String[] args) {
// TODO Auto-generated method stub JFrame j = new BounceFrame(); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); j.setVisible(true); } } class BallRunnable implements Runnable//线程是Thread(Runnable target) 要使用线程 你必须要实现Runnable接口 { private Ball ball; private Component component ; private static final int step = 300000; private static final int delay = 1; public BallRunnable(Ball aball,Component acomponent)
{
ball = aball; component = acomponent; } public void run() { try{ for(int i = 0 ; i <= step ; i++) {
ball.move(component.getBounds()); component.repaint();//面板不断刷新 Thread.sleep(delay); }
}catch(InterruptedException e){} }
} class Ball
{//实现一个小球类 这个小球包含的方法 包括move() private double x = 0; private double y = 0 ; private double dx = 1; private double dy = 1; private static final int XSIZE =15; private static final int YSIZE =15; public void move(Rectangle2D bounds) { x = x + dx; y = y + dy; if(x < bounds.getMinX()) {
x = bounds.getMinX(); dx = -dx; } if(x+XSIZE>=bounds.getMaxX())
{
x = bounds.getMaxX()-XSIZE; dx = - dx; } if(y < bounds.getMinY()) {
y = bounds.getMinY(); dy = -dy; } if(y+YSIZE>=bounds.getMaxY())
{
y = bounds.getMaxY()-YSIZE; dy = - dy; } }//关于小球如何移动 public Ellipse2D getShape() {
return new Ellipse2D.Double(x,y,XSIZE,YSIZE);
}//返回此时的小球的绘画位置
} class BallPanel extends JPanel
{
private ArrayList<Ball> balls = new ArrayList<Ball>(); //定义了一个集合 这个集合是Ball类型的存储 这个知识点很关键 管存储的作用 public void add(Ball b) {
balls.add(b);//将Ball的对象加载进去 }//这就是重写JPanel中的add方法 实现集合加入要更新的小球的重要一步 public void paint(Graphics g)
{ super.paintComponent(g); Graphics2D g2 = (Graphics2D) g;//转换成2D的绘图模式了 for(Ball b :balls) { g2.fill(b.getShape());//这时的g2重新绘制小球的全部信息 fill是 专门绘制图形的方法
} } } class BounceFrame extends JFrame
{ private BallPanel panel; public BounceFrame() { setTitle("小球"); panel = new BallPanel(); panel.setBackground(Color.BLUE); add(panel,BorderLayout.CENTER); JPanel buttonPane = new JPanel(); setBounds(200,200,700,500); addButton(buttonPane,"start",new ActionListener(){ public void actionPerformed(ActionEvent event) { addBall();
}
}); addButton(buttonPane,"Close",new ActionListener(){ public void actionPerformed(ActionEvent event)
{ System.exit(0);
}
}); add(buttonPane,BorderLayout.SOUTH);
} public void addButton(Container c,String title,ActionListener listener)
{
JButton b = new JButton(title); c.add(b); b.addActionListener(listener); }//这个算是变形吧 学习思想 public void addBall()
{ Ball ball = new Ball(); panel.add(ball); Runnable r = new BallRunnable(ball,panel); Thread t = new Thread(r);//Thread(Runnable target) t.start();//启动线程 实质上是启动的run()方法
}
}
动态弹球的实现 加入了多线程技术--javaSE游戏准备工作的更多相关文章
- iOS开发之多线程技术
本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...
- Java多线程技术:实现多用户服务端Socket通信
目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...
- iOS多线程技术方案
iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...
- C#多线程技术总结(异步)
我这里针对现有的C#多线程技术进行一个汇总,一是复习,二是方便索引,文章部份知识点来源于网络,非本人原创. 一.并行(异步): 1.System.Threading.Tasks命名空间下的(TPL): ...
- iOS多线程技术
iOS多线程技术主要分配NSThread.NSOperation和GCD.下边来简单的介绍一下吧. 随性一点,就不按照顺序来了.所以先介绍一下NSOperation. ---------------- ...
- 多线程技术 NSThread & NSOperation & GCD
多线程:在iOS开发中,用到多线程的处理问题的时候有很多,比如异步下载数据时刷新界面等等. 引入多线程来处理问题的关键就是,基于多线程可以使界面更加流畅,防止界面假死. 界面假死:比如你单击一个按钮来 ...
- iOS的三种多线程技术NSThread/NSOperation/GCD
1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...
- 多线程技术在iOS开发中的使用
进程和线程 要使用多线程,首先需要理解进程和线程这2个概念.这里我简单的说一下. 所谓进程对应的是一个应用程序,负责开辟内存空间供应用程序使用,但是进程不能执行任务(指令).一个进程至少包含一条线程, ...
- Java多线程技术学习笔记(二)
目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...
随机推荐
- final, finally, finalize 的区别
1.final 用于声明属性, 方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.内部类要访问局部变量, 局部变量必须定义成 final 类型, 例如, 一段代码…… 2.finally ...
- C++ : 类型的别名和对象的别名
#include <iostream>using namespace std; class human{public: void Talk(); ~human(){cout&l ...
- [Swust OJ 385]--自动写诗
题目链接:http://acm.swust.edu.cn/problem/0385/ Time limit(ms): 5000 Memory limit(kb): 65535 Descripti ...
- BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )
打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算.对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了... -------------- ...
- IOS 页面之间的传值(主讲delegate)
IOS的Delegate,通俗一点说就是页面之间的传值. 总结一下现在知道的IOS页面之间传值的方式有三种 1.使用NSNotification发送通知的传值 主要是通过NSNotificationC ...
- 内核加载与linux的grub
计算机系统的启动是一个复杂的过程,启动过程大致可以分为以下几个阶段: +------计算机系统启动流程----------------------------- ------------------- ...
- (图文教程)帝国cms7.0列表页模板调用多说评论次数
多说是站长朋友们常用的一款社会化评论插件.这里为大家介绍一下帝国列表页调用多说评论次数的方法. 文章由谢寒执笔.博客地址:www.cnblogs.com/officexie/: 1.首先在内容页模板中 ...
- 怎么给没链接的flash加超链接
最近开始准备设计一个广告条,本想用阿里妈妈的的banner marker来设计,却遗憾的发现,banner marker已经实行收费模式了. 我不得不启用另一款在线banner生成工具,百度旗下的&q ...
- 贫血模型or领域模型
参考: http://lifethinker.iteye.com/blog/283668 http://www.uml.org.cn/mxdx/200907132.asp http://www.itu ...
- 在原有3306端口mysqld服务的情况再搭建第二个3308端口的mysql实例
1 download the tar.gz [root@472322 tmp]# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6 ...