JAVA学习日志 坦克游戏 解决了对象数组的问题,检测碰撞,随机下落速度,计时,线程终止
2014-06-20 15:32
567 查看
import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /** * 一个关于坦克的游戏,测试Frame、键盘监听、动画处理。 * * @author冯世磊 * */ public class MyTankGame extends Frame { Image background = GameUnit.getImage("image/back.jpg"); Image myTankImg = GameUnit.getImage("image/tank1.gif"); ammo[] a = new ammo[10]; Image ImageBuffer = null; Graphics GraImage = null; PaintThread pt=new PaintThread(); int x = 400, y = 260, n = 4;// 坦克初始坐标 public boolean threadSwith=true; public double time=0; public String str; /** * 用于启动窗口的方法launchFrame */ public void launchFrame() { for (int i = 0; i < 10; i++) { //初始化炸弹对象 a[i] = new ammo(); } setSize(900, 330);//窗体大小 setLocation(100, 100); setTitle("坦克大逃亡 -作者:冯世磊"); setVisible(true); pt.start();//开启重画线程; addWindowListener(new WindowAdapter() { // 监听关闭操作 @Override public void windowClosing(WindowEvent e) { System.exit(0); } // }); this.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case 37: { x -= 5; myTankImg = GameUnit.getImage("image/tank1.gif"); break; } // left case 39: { x += 5; myTankImg = GameUnit.getImage("image/tank2.gif"); break; } // right } } }); } public void update(Graphics g) { // 覆盖update方法,截取默认的调用过程 ImageBuffer = createImage(this.getWidth(), this.getHeight()); // 创建图形缓冲区 GraImage = ImageBuffer.getGraphics(); // 获取图形缓冲区的图形上下文 paint(GraImage); // 用paint方法中编写的绘图过程对图形缓冲区绘图 GraImage.dispose(); // 释放图形上下文资源 g.drawImage(ImageBuffer, 0, 0, this); // 将图形缓冲区绘制到屏幕上 } @SuppressWarnings("deprecation") @Override // 重写paint类,用于在画面上重画图形 public void paint(Graphics g) { g.drawImage(background, 0, 0, null); g.drawImage(myTankImg, x, y, null); time=time+0.04;//根据线程计算时间 // System.out.print(String.valueOf(time)); g.setColor(Color.white); g.drawString("您已经坚持了:"+String.valueOf(time)+"秒", 50,100); for (int i = 0; i < 10; i++) { //炸弹的先是个数 a[i].show(g); a[i].run(3); /** * 检测碰撞 */ if(a[i].y>260){ //判断炸弹的y坐标时候到达坦克的位置 if(a[i].x>(x+5) && a[i].x<(x+myTankImg.getWidth(null)-5)){//判断炸弹的x坐标时候在坦克范围内 background = GameUnit.getImage("image/over.jpg"); g.drawImage(background, 0, 0, null); g.drawString("您已经坚持了:"+String.valueOf(time)+"秒", 50,100); threadSwith=false; try { pt.interrupt();//当炮弹和坦克发生碰撞的时候终止线程 pt.join(); } catch (InterruptedException e) { System.out.print("游戏结束"); } } } } } public static void main(String[] args) { MyTankGame gf = new MyTankGame(); // 建立一个坦克游戏对象 gf.launchFrame();// 开始画窗口 } /** * 建立一个线程,用于实现重画Paint方法。 * * @author Administrator * */ class PaintThread extends Thread { // 为Paint方法建立一个线程 public void run() { while (threadSwith) { repaint();// 重画 try { Thread.sleep(40); } catch (InterruptedException e) { System.out.println("线程退出"); }// 间隔40毫秒重画一次约每秒刷新25次 } } } }
import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import java.math.*; import javax.imageio.ImageIO; public class GameUnit { /** * * @param path URL路径 * @return 图片 */ public static Image getImage(String path){ URL u=GameUnit.class.getClassLoader().getResource(path); BufferedImage img=null; try { img=ImageIO.read(u); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return img; } } /** * 炸弹的类 * @author Administrator * */ class ammo{ int x=0,y=10; Image b=GameUnit.getImage("image/ammo.gif"); int ran=(int)(Math.random()*5);//ran随即速度参数 /** * 用来显示ammo * @param g 调用paint方法 */ public void show(Graphics g){ if (x==0){ x=(int)(Math.random()*900); } g.drawImage(b,x,y,null); } public boolean run(int speed){//下降 ,如果超过下界就返回false if(y<=330) { y+=ran+speed; //下降速度为随即参数加上设定参数 return true; }else{ y=0; x=(int)(Math.random()*900); //重新初始化出现位置 return false; } } }
相关文章推荐
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- java学习之如何解决和检测端口冲突问题
- java学习日志---File实例:实现复制整个文件夹、解决listFiles()为null问题
- 深入学习理解java:高效的解决死锁问题的线程通讯方式:Semaphore 和 BlockingQueue
- JAVA学习提高之----解决插入数据库时遇到的引号问题
- 如果我是国王:关于解决 Java 编程语言线程问题的建议
- 如何解决Java线程同步中的阻塞问题
- 使用JRockit作为工具检测并解决JAVA内存泄漏问题的一次实战.doc
- 如果我是国王:关于解决 Java 编程语言线程问题的建议
- java 网络编程【7】 如何检测和解决端口冲突问题?
- Windows下解决TerminateThread终止线程导致死锁问题
- 碰撞检测问题及解决
- java学习笔记---第一个applet程序以及一个小问题的解决
- Java中按照行读取和写入文件 日志常用操作 解决中文乱码问题
- java web开发中遇到的问题及解决方案(个人学习日志,持续更新)
- Java访问数据库速度瓶颈问题分析解决
- Java访问数据库的速度瓶颈问题的分析及解决
- java笔记:熟练掌握线程技术---基础篇之解决资源共享的问题(中)--中篇
- JAVA学习之一——在DOS环境下编译遇到的问题及解决方法
- 学习java第一天---------------一些待解决的问题