package com.ljs.plane;
import com.ljs.obj.*;
import com.ljs.utils.GameUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
//创建简单桌面窗口
//普通类继承JFrame类,便可以创建桌面窗口
public class GameWin extends JFrame {
//游戏状态:0未开始;1游戏中;2暂停;3通关失败;通关成功
//定义一个变量,来记录游戏画面的重绘次数
int count = 1;
//我方战机每击落一架飞机,我方分数+1,定义变量score记录分数
public static int score = 0;
//当出现一百架敌机之后,敌方boss才出现,所以要先定义一个变量记录敌机出现的架数
public static int enemyCount = 0;
//双缓存技术代码实现;首先定义一个变量
Image offScreenImage = null;
int width = 600;
int height = 600;
//创建我方飞机对象
public PlaneObj planeObj = new PlaneObj(GameUtils.planeImg,290,550,20,30,0,this);
//创建敌方boss对象
public BossObj bosseObj = null;
/* //创建我方战斗机子弹的对象,子弹的位置是和战斗机的位置相关联的,但稍微有点偏移,这种做饭只能添加一发子弹
ShellObj shellObj = new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this);*/
//先定义游戏的起始状态
public static int state = 0;
//在窗口类中获得背景类的对象
BgObj bgObj = new BgObj(GameUtils.bgImg,0,-2000,2); //y为什么设置为-2000
public void launch(){
//将所有要绘制的游戏物体都添加到gameObjList集合中去
GameUtils.GameObjList.add(bgObj);
GameUtils.GameObjList.add(planeObj);
//GameUtils.GameObjList.add(bosseObj);
//设置窗口是否可见
this.setVisible(true); //默认是false
//设置窗口大小
this.setSize(width,height);
//设置窗口的位置,这里我们将窗口放在屏幕的中央
this.setLocationRelativeTo(null);
//设置窗口的标题
this.setTitle("打飞机");
//采用空格键实现暂停功能,所以要添加键盘监听事件
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//空格键的代号为32
if (e.getKeyCode() == 32){
switch (state){
case 1:
state = 2;
break;
case 2:
state = 1;
break;
default:
}
}
}
});
//添加鼠标监听事件
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//在鼠标点击事件中我们添加一个判断条件
//游戏未开始的情况下点击鼠标左键;e.getButton() == 1表示点击鼠标左键
if (e.getButton() == 1 && state == 0){
//此时点击左键后,游戏需要将游戏状态更改为游戏中
state = 1;
//使用repaint方法,这样它会重新调用paint方法
repaint();
}else if (e.getButton() == 1 && state == 3){
//更改游戏状态state为初始状态,重置分数score,敌机数量,删除物体
state = 0;
score = 0;
enemyCount = 0;
GameUtils.removeList.addAll(GameUtils.enemyObjList);
GameUtils.removeList.addAll(GameUtils.bulletObjList);
GameUtils.removeList.addAll(GameUtils.shellObjList);
GameUtils.removeList.add(bosseObj); //删除boss物体
bosseObj = null; //删除boss对象
//若重新开始,则在下一次绘制之前将碰撞的物体从GameObjList集合中删除
GameUtils.GameObjList.removeAll(GameUtils.removeList);
repaint();
}else if (e.getButton() == 1 && state == 4){
//更改游戏状态state为初始状态,重置分数score,敌机数量,删除物体
state = 0;
score = 0;
enemyCount = 0;
GameUtils.removeList.addAll(GameUtils.enemyObjList);
GameUtils.removeList.addAll(GameUtils.bulletObjList);
GameUtils.removeList.addAll(GameUtils.shellObjList);
GameUtils.removeList.add(bosseObj); //删除boss物体
bosseObj = null; //删除boss对象
//若重新开始,则在下一次绘制之前将碰撞的物体从GameObjList集合中删除
GameUtils.GameObjList.removeAll(GameUtils.removeList);
repaint();
}
}
});
//背景图不断下移,需要重复调用paint方法
while(true){
if (state == 1){
createObj();//当游戏状态处于游戏中时,才能批量创建敌机和子弹
repaint();
}
try {
Thread.sleep(25); //一秒钟这个repaint方法会调用40次
} catch(InterruptedException e) {
e.printStackTrace();
}
} //但是加上while循环之后窗口中的文字会出现闪烁的问题,这是因为窗口中的元素都是绘制出来的,每一次循环都要重新绘制一遍
//在这里我们使用缓存的方式来解决元素闪烁的问题,大致思路是先重新创建一个空的图片,把所有元素先绘制在空的图片上,把绘制好的图片一次性绘制到主窗口中,这被称为双缓存技术
}
@Override
//重写paint()方法,用画笔g绘制桌面窗口背景图片
public void paint(Graphics g){
//初始化双缓存对象、
if (offScreenImage == null){
offScreenImage = createImage(width,height);
}
//获取offScreenImage的画笔对象
Graphics gImage = offScreenImage.getGraphics();
//然后填充出一个宽600长600的区域
gImage.fillRect(0,0,600,600);
//游戏的初始页面
if (state == 0){
gImage.drawImage(GameUtils.bgImg,0,0,null);
gImage.drawImage(GameUtils.bossImg,220,120,null);
gImage.drawImage(GameUtils.explodeImg,270,350,null);
GameUtils.drawWord(gImage,"点击开始游戏",Color.yellow,40,180,300);
/*//设置字体颜色
gImage.setColor(Color.yellow);
//设置字体样式
gImage.setFont(new Font("仿宋",Font.BOLD,40));
gImage.drawString("点击开始游戏",180,300);*/
}
//游戏开始
if (state == 1){
/*g.drawImage(GameUtils.bgImg,0,0,null);
g.drawImage(GameUtils.bossImg,220,120,null);
g.drawImage(GameUtils.explodeImg,270,350,null);
//设置字体颜色
g.setColor(Color.yellow);
//设置字体样式
g.setFont(new Font("仿宋",Font.BOLD,40));
g.drawString("游戏开始",220,300);*/
/* bgObj.paintSelf(gImage);
//让飞机的对象调用自己的paintSelf()方法,将我方飞机元素绘制进预先规划出的区域中
planeObj.paintSelf(gImage);*/
/*//让子弹对象调用自己的paintSelf()方法,将自己绘制进预先的画面中
shellObj.paintSelf(gImage);*/
GameUtils.GameObjList.addAll(GameUtils.explodeList);
for (int i = 0;i
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
java课程设计大作业,java、算法练手项目,适合初学java、数据结构的同学拿来学习研究,基于java、GUI开发的小游戏,程序都经过测试,可以直接运行,资源含程序运行所需的源码、资源文件等全部数据,有需要的可放心下载使用。 java课程设计大作业,java、算法练手项目,适合初学java、数据结构的同学拿来学习研究,基于java、GUI开发的小游戏,程序都经过测试,可以直接运行,资源含程序运行所需的源码、资源文件等全部数据,有需要的可放心下载使用。 java课程设计大作业,java、算法练手项目,适合初学java、数据结构的同学拿来学习研究,基于java、GUI开发的小游戏,程序都经过测试,可以直接运行,资源含程序运行所需的源码、资源文件等全部数据,有需要的可放心下载使用。
资源推荐
资源详情
资源评论
收起资源包目录
java-飞机大战小游戏.zip (54个子文件)
java-plane_game-master
src
com
ljs
obj
BulletObj.java 972B
BgObj.java 466B
PlaneObj.java 2KB
ExplodeObj.java 931B
EnemyObj.java 2KB
BossObj.java 2KB
GameObject.java 2KB
ShellObj.java 993B
utils
GameUtils.java 2KB
plane
GameWin.java 13KB
out
production
Java_plane
com
ljs
obj
PlaneObj$1.class 854B
ShellObj.class 1KB
BulletObj.class 1KB
EnemyObj.class 2KB
ExplodeObj.class 1KB
BossObj.class 2KB
BgObj.class 708B
PlaneObj.class 2KB
GameObject.class 3KB
utils
GameUtils.class 2KB
plane
GameWin$2.class 1KB
GameWin$1.class 812B
GameWin.class 5KB
.idea
project-template.xml 89B
description.html 97B
uiDesigner.xml 9KB
vcs.xml 235B
misc.xml 403B
modules.xml 260B
.gitignore 38B
encodings.xml 159B
imgs
bg.jpg 362KB
shell.png 4KB
bullet.png 4KB
enemy.png 3KB
explode
e2.gif 565B
e7.gif 1KB
e5.gif 1KB
e6.gif 1KB
e8.gif 1KB
e14.gif 814B
e10.gif 1KB
e3.gif 846B
e9.gif 1KB
e11.gif 1KB
e15.gif 460B
e16.gif 280B
e1.gif 312B
e12.gif 1KB
e4.gif 1KB
e13.gif 1022B
plane.png 1KB
boss.png 20KB
Java_plane.iml 425B
共 54 条
- 1
资源评论
白话机器学习
- 粉丝: 1w+
- 资源: 7673
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Vue的ids-web前端设计源码分享
- 基于Python和JavaScript的graduate_design_back_end机票预订系统后端源码
- 基于TensorFlow的SqueezeDet卷积神经网络对象检测设计源码
- 三相逆变模型预测控制 1三相两电平逆变仿真; 2采用有限控制集模型预测控制(FCS-MPC)算法; 3运行时一定要首
- 基于Java语言的“小马哥技术周报”SEO优化设计源码
- 基于Flask框架的flask-MyBlog个人博客网站设计源码
- 三段式电流保护方案设计及仿真分析,MATLAB Simulink 原始参数、要求见图1 利用Simulink搭建仿真模型见图2
- 智能车竞赛介绍、竞赛案例、智能车开发技术、技术.docx
- 基于Python的点对点连接工具服务端设计源码
- 基于Python的ChinaEnergyInformationCracker能源信息爬虫设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功