package code;
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;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Java中的游戏面板: JPanel
* 自定义游戏面板
* 1、写一个类,继承JPanel
* 2、写一个构造方法,初始化(确定)面板的属性
*
* 画图片的步骤:
* 1、在类中定义图片,并取名
* 2、在构造方法中,调用工具初始化图片
* 3、在画图方法,paint中,画图片
*/
public class GamePanel extends JPanel {
//1、定义背景图
BufferedImage bg;//背景图
//创建英雄机
Hero hero = new Hero();
//创建僚机
Wingman wingman = new Wingman();
//创建导弹
Bomb bomb = new Bomb();
// //创建敌机
// Enemy enemy = new Enemy();
//创建敌机的集合
List<Enemy> ens = new ArrayList<Enemy>();//<Enemy>为范型规定为Enemy
//创建子弹集
List<Bullet> bul = new ArrayList<Bullet>();
//创建金币集
List<Money> mon = new ArrayList<Money>();
//定义金币数
int score=0;
//定义击杀量
int num=0;
//设置游戏开关
boolean gameover;//游戏开始时gameover为false
boolean wingmanDie;
boolean bombHoo=false;
boolean bombRun=false;
/**
* 开始游戏的方法
*/
public void startGame(){
//创建并启动一个线程,控制游戏场景中物体活动(木偶,皮影)
//固定格式
//new Tread(){public void run(){...线程需要做的...}}.star();
new Thread(){
public void run(){
//要一直做某事,写一个死循环,让游戏一直运行
while(true){
if(!gameover) {
//调用敌机入场的方法
enemyEnter();
//调用让敌机移动的方法
enemyMove();
//这里设置为按空格射击
// //发射子弹
// shoot();
//让子弹飞
bulletMove();
//判断子弹是否击中敌机
shootEnemy();
//判断僚机是否捡到金币
catchMoney();
//让金币飞
moneyMove();
//判断敌机是否撞到了英雄机
hit();
//导弹启动
if(bombRun){
BombRUN();
}
//每执行一次,休息一会
//线程休眠 sleep(毫秒数)
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//重绘,刷新画布
repaint();
}
}
}.start();
}
/**
* 导弹启动
*/
protected void BombRUN(){
bomb.run();
if(!bombHoo && bomb.y>=250){
for(int i=0;i<ens.size();i++) {
Enemy en = ens.get(i);
int x = en.x;
int y = en.y;
//1、敌机死亡(消失:从敌机集合中删除)
ens.remove(en);
//生成金币
Money m = new Money(x, y);
mon.add(m);
//击杀数加一
num += 1;
}
bombHoo=true;
bombRun=false;
}
if(bombHoo){
Random rd = new Random();
bomb.x= rd.nextInt(480 - bomb.w);
bomb.y = -bomb.h;
}
bombHoo=false;
}
/**
* 检测敌机是否撞到英雄机
*/
protected void hit(){
//遍历敌机
for(int i=0;i<ens.size();i++){
//获取敌机
Enemy e=ens.get(i);
//如果敌机被英雄机撞到
if(e.hitBy(hero)){
int ensx=e.x;
int ensy=e.y;
//1、删除敌机
ens.remove(e);
//2、英雄机血量减少
hero.hp--;
//3、生成金币
Money m = new Money(ensx,ensy);
mon.add(m);
//4.击杀数加一
num+=1;
//5、当英雄机血量清零是游戏结束
if(hero.hp<=0){
gameover = true;
}
}
if(e.hitBy(wingman) && !wingmanDie){
//1、删除敌机
ens.remove(e);
//2、英雄机血量减少
wingman.hp--;
//3、增加分数
score+=1;
//4、增加击杀数
num+=1;
//5、当英雄机血量清零是游戏结束
if(wingman.hp<=0){
wingmanDie=true;
}
}
}
}
/**
* 检测僚机是否捡到金币
*/
protected void catchMoney(){
//遍历每一个金币,将金币与僚机经行位置比较
for(int i=0;i<mon.size();i++){
//获取该敌机
Money m = mon.get(i);
//判断该子弹是否击中敌机
if(m.catchBy(wingman)){
//如果金币被僚机捡到
//1、金币死亡(消失:从敌机集合中删除)
mon.remove(m);
//2、分数加一
score+=1;
}
}
}
/**
* 检测子弹是否集中敌机
*/
protected void shootEnemy(){
//遍历所有的敌机,不知道是哪一个子弹大到了飞机所以要遍历
for(int i=0;i<bul.size();i++){
//获取每一个子弹
Bullet b = bul.get(i);
//每拿一颗子弹,就判断一下这颗炸弹是否击中敌机
ko(b);
}
}
/**
*判断子弹是否击中敌机
*/
private void ko(Bullet b){
//遍历每一个敌机,将子弹与敌机经行位置比较
for(int i=0;i<ens.size();i++){
//获取该敌机
Enemy e = ens.get(i);
//判断该子弹是否击中敌机
if(e.shootBy(b)){
//如果敌机被子弹击中
//记录死亡位置
int x=e.x;
int y=e.y;
//1、敌机死亡(消失:从敌机集合中删除)
ens.remove(e);
//2、删除子弹
bul.remove(b);
//生成金币
Money m = new Money(x,y);
mon.add(m);
//击杀数加一
num+=1;
}
}
}
/**
* 让子弹飞
*/
protected void bulletMove(){
//遍历所有子弹
for(int i=0; i<bul.size();i++){
//获取每一个子弹
Bullet bullet = bul.get(i);
//让子弹飞
bullet.move();
}
}
/**
* 让金币飞
*/
protected void moneyMove(){
for(int i=0; i<mon.size();i++){
//获取每一个子弹
Money money = mon.get(i);
//让子弹飞
mone
homework of Java.zip
需积分: 5 108 浏览量
2021-07-05
22:28:37
上传
评论 8
收藏 626KB ZIP 举报
Ultimo2023
- 粉丝: 7835
- 资源: 8
最新资源
- 基于matlab实现Markov算法根据原始文本的统计规律生成随机文本
- 基于matlab实现relief算法的详细说明 有程序有例子 适合初学者.rar
- 2024年 第15届蓝桥杯 EDA组 省赛 真题
- 酒丸Q版及正比人物插画系统课2024年
- DnsTools 1.2.3绿色便携版
- 基于matlab实现的中文字符的识别代码.rar
- 在Python中使用turtle绘制分形天线,用户可以选择通过单线或正方形绘制它
- 基于matlab实现的中colorbar的设置 源程序代码.rar
- 基于matlab实现的运动估计代码.里面有源图像和运行结果.对写论文应该有帮助.rar
- 基于matlab实现的夜间车牌识别程序.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0