java实现飞机大战小游戏
短信预约 -IT技能 免费直播动态提醒
本文实例为大家分享了java实现飞机大战游戏的具体代码,供大家参考,具体内容如下
MyPanel类
package P;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import javax.sql.RowSetInternal;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
//xx.2
//创建面板类,继承面板,实现移动监听事件
public class MyPanel extends JPanel implements MouseMotionListener {
//private ImageIcon bjImage = new ImageIcon("img/bj.png");
//英雄机图片
private ImageIcon heroImage = new ImageIcon("img/头.png");
//显示logo
//private ImageIcon logoImage = new ImageIcon("img/头.png");
//英雄机的宽高
private int width = heroImage.getIconWidth();
private int height = heroImage.getIconHeight();
//英雄机的坐标
private int x=180;
private int y=880;
//创建一个敌机的集合,用于展示多个敌机
List<Enemy> enemys = new ArrayList<>();
//存储子弹集合
List<Bullet> bullets = new ArrayList<>();
//存储爆炸对象集合
List<Bomb> bombs = new ArrayList<>();
//存储英雄机爆炸集合
List<HeroDead> heroDeads = new ArrayList<>();
private int number;//统计当前得分
private int m;//统计剩余血条量
// MyPanel jp = new MyPanel() {
// {
// setBackground(Color.gray);// 设置面板背景颜色
// }
public MyPanel() {
//在构造方法中准备10个敌机
for(int i=0;i<10;i++){
enemys.add(new Enemy());
}
}
@Override
public void paint(Graphics g) { //用于绘制图片区域
super.paint(g);
//在窗口左侧展示打飞机得分
//设置字体: 参数1:字体家族, 参数2:字体样式:加粗 参数3:字体大小
g.setFont(new Font("宋体", Font.BOLD, 30));
g.drawString("当前得分:"+number, 5, 30);
g.drawString("发量(万根):"+(5-m), 5, 80);
//g.drawImage(null, x, y, getBackground(), getFocusCycleRootAncestor());
//绘制英雄机图片 参数1,图片 参数2和3:坐标
g.drawImage(heroImage.getImage(), x, y, null);
//g.drawImage(logoImage.getImage(), 19, 22, null);
//在绘图中显示10辆敌机
for(int i=0;i<enemys.size();i++){
Enemy enemy = enemys.get(i); //获取敌机对象
enemy.drawImage(g); //然后分别展示
}
//展示子弹集合的图片
for (int i = 0; i < bullets.size(); i++) {
Bullet bullet = bullets.get(i); //取出子弹对象
bullet.drawImage(g);
}
//展示爆炸集合的图片
for(int i=0;i<bombs.size();i++){
Bomb bomb = bombs.get(i);
bomb.drawImage(g);
}
//展示英雄机的销毁图片
for(int i=0;i<heroDeads.size();i++){
HeroDead heroDead = heroDeads.get(i);
heroDead.drawImage(g);
}
}
@Override
public void mouseDragged(MouseEvent e) {
//System.out.println("鼠标移动并拖拽触发");
//鼠标拖拽时,需要将英雄机也带着移动(只需改变x轴和y轴)
x = e.getX()-width/2; //英雄机的移动,随着鼠标触发移动的
y = e.getY()-height/2; //鼠标指定到英雄机中间位置
repaint(); //重新绘制图片
}
@Override
public void mouseMoved(MouseEvent e) {
//System.out.println("鼠标移动的触发..");
//鼠标移动时,需要将英雄机也带着移动(只需改变x轴和y轴)
x = e.getX()-width/2; //英雄机的移动,随着鼠标触发移动的
y = e.getY()-height/2; //鼠标指定到英雄机中间位置
repaint(); //重新绘制图片
}
//L-4. 创建子弹类Bullet,操作与敌机类类似
public void init() {
//定义一个标记,循环了自定义的次数后,才去添加,这样子弹数量会变少
int flag = 0;
while(true) { //循环地跑,模拟依次移动的效果
flag++; //
if(flag==50) { //控制子弹数量
bullets.add(new Bullet(x+width/2, y)); //就是从英雄级的x,y轴位置发射子弹的
flag=0; //又回到0,依次计算15次
//System.out.println("子弹数量:"+ bullets.size());
}
//展示子弹,让子弹飞起来
for(int i=0;i<bullets.size();i++) {
Bullet bullet = bullets.get(i); //取出对象
if(i%2!=0)//设置子弹左右发射
bullet.move();
else
bullet.move1();//移动子弹位置
//如果子弹移动到y轴为0,则移除掉
if(bullet.getY()<0){
bullets.remove(bullet); //移除子弹对象
}
}
//xx.3.
//敌机循环移动..
for(int i=0;i<enemys.size();i++) {
Enemy en = enemys.get(i);
en.move(); //循环地移动每一架敌机y轴位置
//超出屏幕范围后,需要移除,并重新添加一个对象
if(en.getY()>GameMain.HEIGHT) {
//int count1=enemys.size();
enemys.remove(en); //移除对象
enemys.add(new Enemy()); //重新再创建对象
}
//L 3-4
//在敌机的循环中,再继续循环子弹; 需要判断是否有子弹和敌机重叠了,
//则移除敌机对象,重新添加,移除子弹;如果有则添加爆炸对象
for(int j=0;j<bullets.size();j++){
Bullet bu = bullets.get(j);
if(isHit(en,bu)){ //碰撞的判断
enemys.remove(en); //移除敌机,并重新new一个
enemys.add(new Enemy());
bullets.remove(bu); //移除子弹
//添加的爆炸位置和敌机位置一致
bombs.add(new Bomb(en.getX(), en.getY()));
number += 10; //爆炸后,累加得分
}
}
//zz-6
//判断英雄机与敌机的碰撞(英雄机的消亡)
if(isHit(en)){
System.out.println("进入英雄机爆炸...");
//敌机的对象移除
enemys.remove(en);
//英雄机爆炸图片位置应该与英雄机重叠
heroDeads.add(new HeroDead(x, y));
for(m=0;m<=heroDeads.size();m++) {
while(heroDeads.size()==5) {
return;
}
}
//游戏结束,跳出死循环
}
}
//L-5
//将爆炸的所有对象,过一段时间则干掉
for(int i=0;i<bombs.size();i++){
Bomb bomb = bombs.get(i);
bomb.move(); //计算次数,统一循环多少次后,再干掉
if(bomb.getCount()>6){
bombs.remove(bomb); //在循环的一定范围后,可以移除爆炸了
}
}
//xx.2
//每次的移动都需要停顿一下
try {
Thread.sleep(6); //单位:毫秒 睡眠6毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
repaint(); //重新绘制图片
}
}
//zz-6
//英雄机与敌机的碰撞
private boolean isHit(Enemy en) {
//英雄机的碰撞区域
Rectangle rect = new Rectangle(x, y, width, height);
//碰撞点的位置,是在敌机的中心点
Point point = new Point(en.getX()+en.getWidth()/2, en.getY()+en.getHeight()/2);
return rect.contains(point);
}
//L-5
private boolean isHit(Enemy en, Bullet bu) {
//填充敌机的碰撞区域
Rectangle rect = new Rectangle(en.getX(), en.getY(), en.getWidth(), en.getHeight());
//将子弹的位置设置在中间
Point point = new Point(bu.getX()+bu.getWidth()/2, bu.getY()+bu.getHeight()/2);
//如果位置有重叠,返回true
return rect.contains(point);
}
}
HeroDead类
package P;
import java.awt.Graphics;
import javax.swing.ImageIcon;
public class HeroDead {
private ImageIcon heroImage = new ImageIcon("img/爆炸.gif");
private int width = heroImage.getIconWidth();
private int height = heroImage.getIconHeight();
private int x;
private int y;
public ImageIcon getHeroImage() {
return heroImage;
}
public void setHeroImage(ImageIcon heroImage) {
this.heroImage = heroImage;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public HeroDead(int x,int y){
this.x=x;
this.y=y;
}
public void drawImage(Graphics g) {
g.drawImage(heroImage.getImage(), x, y, null);
}
}
GameMain类
package P;
import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
//游戏入口类
public class GameMain {
static final int WIDTH = 860; //设置静态常量,作为状态值使用
static final int HEIGHT = 660;
public static void main(String[] args) {
JFrame jFrame = new JFrame(); //实例化顶级窗口类
jFrame.setSize(WIDTH, HEIGHT); //设置宽高像素
jFrame.setTitle("小秃头历险记"); //设置标题
jFrame.setLocationRelativeTo(null); //设置居中效果
//JFrame.EXIT_ON_CLOSE: 状态值 3
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口的同时,把程序关闭
//在窗口中,加入面板
MyPanel pl = new MyPanel();
pl.setBackground(Color.pink);
pl.setBorder(BorderFactory.createLineBorder(Color.cyan, 3));
jFrame.add(pl); //添加面板组件
jFrame.addMouseMotionListener(pl); //添加鼠标移动事件
jFrame.setVisible(true); //使窗口可视化
pl.init(); //在面板中循环将组件跑起来
}
}
Enemy类
package P;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.ImageIcon;
//创建敌机类
public class Enemy {
//创建敌机图片,宽高,坐标等属性
private ImageIcon enemyImage = new ImageIcon("img/错误.png");
private int width = enemyImage.getIconWidth();
private int height = enemyImage.getIconHeight();
private int x;
private int y;
public ImageIcon getEnemyImage() {
return enemyImage;
}
public void setEnemyImage(ImageIcon enemyImage) {
this.enemyImage = enemyImage;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Enemy(){
//创建随机类,在窗口宽高范围内随机
Random random = new Random();
//随机出来的敌机位置可以显示一半图片
x = random.nextInt(GameMain.WIDTH-width/2);
y = -random.nextInt(GameMain.HEIGHT-height/2); //初始敌机位置为负数
}
public void drawImage(Graphics g) {
//绘制敌机图片
g.drawImage(enemyImage.getImage(), x, y, null);
}
public void move() {
y +=2; //控制y轴速度
}
}
Bullet类
package P;
import java.awt.Graphics;
import javax.swing.ImageIcon;
//创建子弹类
public class Bullet {
//创建属性,子弹图片,宽高,位置
private ImageIcon bulletImage = new ImageIcon("img/aaa.gif");
private int width = bulletImage.getIconWidth();
private int height = bulletImage.getIconHeight();
private int x;
private int y;
public ImageIcon getBulletImage() {
return bulletImage;
}
public void setBulletImage(ImageIcon bulletImage) {
this.bulletImage = bulletImage;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Bullet(int x,int y) { //x,y轴位置从外面传入(等于英雄级的位置)
this.x = x;
this.y = y;
}
public void drawImage(Graphics g) {
g.drawImage(bulletImage.getImage(), x, y, null);
}
public void move() {
x-=1;
y -= 2; //让子弹y轴从下往上递减
}
public void move1() {
x+=1;
y -= 2; //让子弹y轴从下往上递减
}
}
爆炸类bomb类
package P;
import java.awt.Graphics;
import javax.swing.ImageIcon;
//创建爆炸的实体了
public class Bomb {
//爆炸的图片,宽高,位置属性
private ImageIcon bombImage=new ImageIcon("img/zz.png");
private int width = bombImage.getIconWidth();
private int height = bombImage.getIconHeight();
private int x;
private int y;
private int count; //记录多少次数后爆炸
public ImageIcon getBombImage() {
return bombImage;
}
public void setBombImage(ImageIcon bombImage) {
this.bombImage = bombImage;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public Bomb(int x,int y){
this.x = x;
this.y = y;
}
public void drawImage(Graphics g) {
g.drawImage(bombImage.getImage(), x, y, null);
}
public void move() {
count++;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341