【Java小项目】打飞机
主要功能:
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小项目】打飞机相关推荐
- java小项目之:植物大战僵尸,这个僵尸不太冷!内附素材源码
Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...
- java小项目家庭记账程序
文章目录 java小项目家庭记账程序 **1.项目目标:** 2.项目需求: 3.具体思路: 4.具体代码: 1.页面: 2.Option_1类: 3.Option_2类: 4.Option_3类: ...
- java小项目影院系统
java小项目,影院管理系统 http://download.csdn.net/detail/github_32658299/9632276 下面是两个关键的类 1.这是电影院测试类,用来读取用户输入 ...
- 我是一只小僵尸java,Java小项目之:植物大战僵尸,这个僵尸不太冷!内附素材...
Java小项目之:植物大战僵尸! <植物大战僵尸>是由PopCap Games开发的一款益智策略类单机游戏,于2009年5月5日发售,这款游戏可谓是无人不知无人不晓. 在我身边,上到40岁 ...
- Java小项目中WEB-INF下jsp页面如何访问?
Java小项目中WEB-INF下jsp页面如何访问? - 今天又是充满希望的一天 - CSDN博客 关闭 今天又是充满希望的一天 目录视图 摘要视图 订阅 var username = "H ...
- java小项目租车系统_Java学习笔记三十:Java小项目之租车系统
Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的"呱呱租车系统" 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金 ...
- Java小项目——家庭记账项目
学习Java已经过了半个月左右了,所学的知识已经能够写一些小程序或者小项目,虽然它可能没有那么高级,但是也能检验你之前所学的全部内容.所以今天就与大家分享一下我的小项目经验. 一.需求说明 该软件能够 ...
- Java小项目-银行用户管理系统
文章目录 前言 一. 功能 二. 代码 银行卡数据 转账流水数据 用户数据 BanksController UserController BanksDao RecordDao UserDao Bank ...
- Java小项目另一个水果摊
文章目录 前言 一.包和表截图 二.源代码 1.JDBC连接Mysql数据 管理员界面:增删查改 用户界面 :查找水果 建立断开连接 2.GUI窗口界面 开始选择界面 用户购买水果界面 管理员登录界面 ...
- java小项目水果摊
介绍 刚学完java 集合和IO流,想做了一个简单的小项目来练手,于是我就运用一些基础知识做了这个水果摊.水果摊的主要功能有: 进货 查看水果列表 购买水果 查看购物车 结账 退出 都是一些简单的功能 ...
最新文章
- teamcity plugin中读取js和css文件的方法
- 好多Javascript日期选择器呀-6
- 快速目标检测--YOLO-LITE: A Real-Time Object Detection Algorithm Optimized for Non-GPU Computers
- 单选按钮组 事件的实现
- SQL Server DBA常见面试 笔试问题
- eclipse egit 报错 The current branch is not configured for pull No value for key branch.master
- Mysql优化之执行计划查看
- PAT乙级(1023 组个最小数)
- 计算机文字排版竞赛标准,文字录入与排版高手竞赛方案(Word2010).doc
- java生成excel中文乱码,JSP应用导出Excel报表的简单实现以及中文乱码彻底解决(HTML)...
- python 全部缩进一行_Python成为专业人士笔记–程序行空白及tab缩进的作用
- angularjs directive指令 link在渲染完成之后执行
- petshop 数据库
- java 将map转List对象
- Java加密:四、非对称加密算法
- windows 命令行代理设置
- mysql分页合并同类项,人教版初三数学复习目录(全)
- Qt写的json代码生成器
- c#没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))”
- background-position百分比格子速记法