主要功能:

1.w,a,s,d八个方向移动,j射击

2.默认会右有5个敌机,敌机会有一个随机方向,并一直按着这个方向移动,碰到边界会发生反弹

3.每个飞机只能发5个子弹,只有玩家的子弹才能对敌机造成伤害。

4.用ArrayList存放子弹,repaint的时候遍历重绘

5.用ConcurrentHashMap存放飞机,用HaskMap的话,当遍历的时候如果改变HaskMap的元素的话就会有一个Concurrent异常,而ConcurrentHashMap会自己检查变化。

OSC@GIT地址:http://git.oschina.net/A_yes/PlaneGame

遇到的问题:

plane类:

问题:在按键触发时执行,但是飞机的移动不顺滑即按住一个方向它会顿一下才继续向前。

解决方法:给飞机类加个Runnable接口,用线程来处理飞机移动,给4个方向boolean标志。

完整代码:

package com.ztc.plane;import javax.swing.*;
import java.awt.*;/*** Created by ztc on 15-11-29.*/
public class Plane implements Runnable{//坐标double x,y;double speed;Image img;//移动方向,存活状态boolean up,down,left,right,alive;//发射子弹数int bulletSum;String name;public void setUp(boolean up) {this.up = up;}public void setDown(boolean down) {this.down = down;}public void setLeft(boolean left) {this.left = left;}public void setRight(boolean right) {this.right = right;}public Plane(){}public void setAlive(boolean alive) {this.alive = alive;}public Plane(String path,double x,double y,double speed,String name){this.x=x;this.y=y;this.speed=speed;this.alive=true;this.name=name;img=Util.getImage(path);}public void draw(Graphics g){g.drawImage(img,(int)x,(int)y,null);}public void move(boolean up,boolean down,boolean left,boolean right){if(up&&y-speed>0)y-=speed;if(down&&y+speed<Constant.GrameHeight-new ImageIcon(img).getIconHeight())y+=speed;if(left&&x-speed>0)x-=speed;if(right&&x+speed<Constant.GrameWidht-new ImageIcon(img).getIconWidth())x+=speed;}public Rectangle getRect(){return new Rectangle((int)x,(int)y,new ImageIcon(img).getIconWidth(),new ImageIcon(img).getIconHeight());}public void boom(Graphics g) {for (int i = 3; i > 0; i--) {g.drawImage(Util.getImage("assets/boom0" + i + ".png"), (int) x, (int) y, null);}}public int getBulletSum() {return bulletSum;}public void setBulletSum(int bulletSum) {this.bulletSum = bulletSum;}public Bullet shot(){Bullet bullet=null;if(alive&&bulletSum<Constant.BulletSum) {bullet = new Bullet("assets/bullet02.png", (int) x - 7 + new ImageIcon(img).getIconWidth() / 2, (int) y-15, Constant.BulletSpeed, 0.5,name);new Thread(bullet).start();bulletSum++;}return bullet;}@Overridepublic void run() {while(true){move(up,down,left,right);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}

Enemy类:

Enemy类继承Plane类,所以它的移动只要重写run函数。

随机角度:double o=new Random().nextDouble()*Math.PI*2;

问题:遇到边界后镜面反弹;

解决方法:以随机出来的方向与垂直向下的方向的夹角为要计算的角度,显然若碰到垂直的边则o= Math.PI*2-o碰到水平方向则o=Math.PI-o;

完整代码:

package com.ztc.plane;import javax.swing.*;
import java.util.Random;/*** Created by ztc on 15-11-30.下午1:22*/
public class Enemy extends Plane{//轨迹String track;double o=new Random().nextDouble()*Math.PI*2;public Enemy(){}public Enemy(String path,double x,double y,double speed,String name,String track){super(path,x,y,speed,name);this.track=track;}//随机方向,遇边镜面反射public void myTrack(){x-=speed*Math.sin(o);y-=speed*Math.cos(o);if(x<0||x>Constant.GrameWidht-new ImageIcon(img).getIconWidth()){o= Math.PI*2-o;}if(y<0||y>Constant.GrameHeight-new ImageIcon(img).getIconHeight()-100){o=Math.PI-o;}}public void run(){while(true){myTrack();if(alive&&bulletSum<Constant.BulletSum) {Bullet bullet = new Bullet("assets/bullet01.png", (int) x - 7 + new ImageIcon(img).getIconWidth() / 2, (int) y + new ImageIcon(img).getIconHeight(), Constant.BulletSpeed, 0,name);new Thread(bullet).start();Util.bullets.add(bullet);bulletSum++;}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}
}

Bullet类:

问题:刚开始时把移动写了一个方法在repaint的时候调用,速度很怪异

解决:加Runnable借口,移动写在run里

package com.ztc.plane;import javax.swing.*;
import java.awt.*;
import java.util.Random;/*** Created by ztc on 15-11-29.下午12:35*/
public class Bullet implements Runnable{//坐标double x=200,y=200;double speed;Image img;//方向(0,1)double direct;double o=new Random().nextDouble()*Math.PI*2;boolean alive;String owner;public boolean isAlive() {return alive;}public void setAlive(boolean alive) {this.alive = alive;}public Bullet(){}public Bullet(String path,double x,double y,double speed,double direct,String owner){this.x=x;this.y=y;this.speed=speed;this.direct=direct;this.alive=true;this.owner=owner;img=Util.getImage(path);}public void draw(Graphics g){g.drawImage(img,(int)x,(int)y,null);}public String getOwner() {return owner;}//随机方向,遇边镜面反射public void drawRandom(Graphics g){g.drawImage(img,(int)x,(int)y,null);x-=speed*Math.sin(o);y-=speed*Math.cos(o);if(x<0||x>Constant.GrameWidht){o=Math.PI*2-o;}if(y<0||y>Constant.GrameHeight){o=Math.PI-o;}}public Rectangle getRect(){return new Rectangle((int)x,(int)y,new ImageIcon(img).getIconWidth(),new ImageIcon(img).getIconHeight());}@Overridepublic void run() {while(true){x+=speed*Math.sin(direct*Math.PI*2);y+=speed*Math.cos(direct*Math.PI*2);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}if(y<0||x<0||y>Constant.GrameHeight||x>Constant.GrameWidht) {alive=false;break;}}}
}

【Java小项目】打飞机相关推荐

  1. java小项目之:植物大战僵尸,这个僵尸不太冷!内附素材源码

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  2. java小项目家庭记账程序

    文章目录 java小项目家庭记账程序 **1.项目目标:** 2.项目需求: 3.具体思路: 4.具体代码: 1.页面: 2.Option_1类: 3.Option_2类: 4.Option_3类: ...

  3. java小项目影院系统

    java小项目,影院管理系统 http://download.csdn.net/detail/github_32658299/9632276 下面是两个关键的类 1.这是电影院测试类,用来读取用户输入 ...

  4. 我是一只小僵尸java,Java小项目之:植物大战僵尸,这个僵尸不太冷!内附素材...

    Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...

  5. Java小项目中WEB-INF下jsp页面如何访问?

    Java小项目中WEB-INF下jsp页面如何访问? - 今天又是充满希望的一天 - CSDN博客 关闭 今天又是充满希望的一天 目录视图 摘要视图 订阅 var username = "H ...

  6. java小项目租车系统_Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的"呱呱租车系统" 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金 ...

  7. Java小项目——家庭记账项目

    学习Java已经过了半个月左右了,所学的知识已经能够写一些小程序或者小项目,虽然它可能没有那么高级,但是也能检验你之前所学的全部内容.所以今天就与大家分享一下我的小项目经验. 一.需求说明 该软件能够 ...

  8. Java小项目-银行用户管理系统

    文章目录 前言 一. 功能 二. 代码 银行卡数据 转账流水数据 用户数据 BanksController UserController BanksDao RecordDao UserDao Bank ...

  9. Java小项目另一个水果摊

    文章目录 前言 一.包和表截图 二.源代码 1.JDBC连接Mysql数据 管理员界面:增删查改 用户界面 :查找水果 建立断开连接 2.GUI窗口界面 开始选择界面 用户购买水果界面 管理员登录界面 ...

  10. java小项目水果摊

    介绍 刚学完java 集合和IO流,想做了一个简单的小项目来练手,于是我就运用一些基础知识做了这个水果摊.水果摊的主要功能有: 进货 查看水果列表 购买水果 查看购物车 结账 退出 都是一些简单的功能 ...

最新文章

  1. teamcity plugin中读取js和css文件的方法
  2. 好多Javascript日期选择器呀-6
  3. 快速目标检测--YOLO-LITE: A Real-Time Object Detection Algorithm Optimized for Non-GPU Computers
  4. 单选按钮组 事件的实现
  5. SQL Server DBA常见面试 笔试问题
  6. eclipse egit 报错 The current branch is not configured for pull No value for key branch.master
  7. Mysql优化之执行计划查看
  8. PAT乙级(1023 组个最小数)
  9. 计算机文字排版竞赛标准,文字录入与排版高手竞赛方案(Word2010).doc
  10. java生成excel中文乱码,JSP应用导出Excel报表的简单实现以及中文乱码彻底解决(HTML)...
  11. python 全部缩进一行_Python成为专业人士笔记–程序行空白及tab缩进的作用
  12. angularjs directive指令 link在渲染完成之后执行
  13. petshop 数据库
  14. java 将map转List对象
  15. Java加密:四、非对称加密算法
  16. windows 命令行代理设置
  17. mysql分页合并同类项,人教版初三数学复习目录(全)
  18. Qt写的json代码生成器
  19. c#没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))”
  20. background-position百分比格子速记法

热门文章

  1. SMOTE-IPF:通过带滤波的重采样方法解决不平衡分类中的噪声和边界样本问题
  2. 二维码生成插件qrious(纯JS)
  3. Android下拉列表显示
  4. UML 工具: JUDE 5.5.2
  5. Java小白的入门面试笔记--线程局部变量之灵魂四问
  6. 电子制作——锂电池大功率充电器
  7. python scrapy 简单教程_python之scrapy入门教程
  8. 软件测试:docker知识
  9. 神州战神电脑关闭触摸板
  10. 混部之殇-论云原生资源隔离技术之CPU隔离