package 大鱼吃小鱼;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
/**
*
* 背景的绘制
*
*/
public class FishPanel extends JPanel {
//0:游戏加载;1:游戏开始;2:游戏暂停;3:游戏结束
int state = 0;//游戏状态
Image bkImg = new ImageIcon("images/bg.jpg").getImage();
Image over = new ImageIcon("images/bg.jpg").getImage();
Image zan = new ImageIcon("images/bg.jpg").getImage();
Image start = new ImageIcon("images/start.png").getImage();
ArrayList<Fish> fishs = new ArrayList<Fish>();//装其他鱼的集合
int miniFish = 0 , middleFish = 0 , bigFish = 0 ,superFish = 0 ;//各种鱼在初始界面鱼的数量
int score = 0;//初始分数
public FishPanel() {
myFish = new MyFish();
//music = new Music();
oldzhanLi=myFish.zhanLi;
}
MyFish myFish = new MyFish();//己方鱼
int oldzhanLi = myFish.zhanLi;
/**
* 绘制的方法
* g 画笔对象
*/
public void paint(Graphics g) {//画图必备路径
super.paint(g);// g 画笔对象
System.out.println("zzzzz");
//绘制游戏背景界面
switch(state) {
case 0://游戏加载
g.drawImage(start, 0, 0, 1440, 900, 0, 0, 500,300, null);
break;
case 1://游戏开始
drawBackGround(g);//背景绘制
drawMyFish(g);//绘制己方的小鱼
drawFishs(g);//绘制其他的鱼
g.setColor(Color.white);
Font f = new Font("黑体",Font.BOLD,20);
g.setFont(f);
g.drawString("当前得分:"+score, 15, 20);//"当前分数"在界面的位置
g.drawString("战斗力:"+myFish.zhanLi, 200, 20);//"战斗力"在界面的位置
break;
case 2://游戏暂停
g.drawImage(zan, 0, 0, null);
break;
case 3://游戏结束
//g.drawImage(over, 0, 0, null);break;
drawBackGround(g);//背景绘制
drawMyFish(g);//绘制己方的小鱼
drawFishs(g);//绘制其他的鱼
g.drawString("当前得分:"+score, 15, 20);//"当前分数"在界面的位置
g.drawString("战斗力:"+myFish.zhanLi, 200, 20);//"战斗力"在界面的位置
g.setColor(Color.white);//"游戏结束"的字体颜色
Font ff = new Font("黑体",Font.BOLD,50);//"游戏结束"字体为黑体,粗细为BOLD,大小为50
g.setFont(ff);
g.drawString("游戏结束",600 ,450);//"游戏结束"在界面的位置
break;
}
}
/**
* 绘制其他的方法
* @param g
*/
private void drawFishs(Graphics g) {
// TODO 自动生成的方法存根
for(int i = 0 ; i < fishs.size() ; i ++ ) {
Fish fish = fishs.get(i);
fish.draw(g);
}
}
/**
* 绘制游戏开始的背景
* @param g
*/
private void drawBackGround(Graphics g) {
// TODO 自动生成的方法存根
g.drawImage(bkImg, 0, 0, 1440, 900, 0, 0, 2048, 1024, null);
}
/**
* 绘制己方小鱼的方法
* @param g
*/
private void drawMyFish(Graphics g) {
// TODO 自动生成的方法存根
myFish.draw(g);
}
/**
* 键盘监听事件执行的方法
*/
public void move(int keycode) {
switch(keycode) {
case KeyEvent.VK_SPACE:
//空格键,进入游戏开始的界面
if(state == 0) {
state = 1;
}
break;
case KeyEvent.VK_LEFT:
//左键
if(state == 1) {//当游戏结束时鱼不能动
myFish.moveLeft();//己鱼
repaint();//敌方鱼
}
break;
case KeyEvent.VK_RIGHT:
//右键
if(state == 1) {//当游戏结束时鱼不能动
myFish.moveRight();//己鱼
repaint();//敌方鱼
}
break;
case KeyEvent.VK_UP:
//上键
if(state == 1) {//当游戏结束时鱼不能动
myFish.moveUp();//己鱼
repaint();//敌方鱼
}
break;
case KeyEvent.VK_DOWN:
//下键
if(state == 1) {//当游戏结束时鱼不能动
myFish.moveDown();//己鱼
repaint();//敌方鱼
}
break;
}
}
/**
* 定时器的方法:
* 创建其他鱼
* 不断的改变其他鱼的位置
*/
int index=1;
public void action() {
Timer timer=new Timer();
timer.schedule(new TimerTask() {
public void run() {
if(state == 1) {
//创建其他鱼,不断的改变其他鱼的位置
createFishs();
//吃鱼
hitFish();
//当鱼跑出圈外,我们要删除集中的鱼
repaint();
}
}
},20,10);//鱼生成周期
}
/**
* 吃鱼
*/
private void hitFish() {
// TODO 自动生成的方法存根
for( int i = 0 ; i < fishs.size() ; i ++ ) {
Fish fish = fishs.get(i);
//检查碰撞:如果是true则执行碰撞,否则没有参数碰撞
if( hit(fish) ) {
//产生碰撞:第一种情况吃掉其他鱼;第二种情况己方鱼被吃游戏结束
if(myFish.zhanLi >= fish.zhanLi) {
//自己鱼能吃掉敌方鱼,变强
switch(fish.zhanLi) {
case 1 ://吃最小鱼加一分
score ++;
break;
case 2 ://吃中下等鱼加二分
score += 2;
break;
case 3 ://吃中上等鱼加五分
score += 5;
break;
case 4 ://吃大鱼加十分
score += 10;
break;
}
//升级
if(score >= 5) {
myFish.zhanLi = 2;
}
if(score >= 25) {
myFish.zhanLi = 3;
}
if(score >= 45) {
myFish.zhanLi = 4;
}
//其他鱼要消失
fishs.remove(i);
//自己鱼变大
if(myFish.zhanLi > oldzhanLi) {
myFish.x1 = (int)(myFish.x1*1.1);
myFish.y1 = (int)(myFish.y1*1.1);
oldzhanLi = myFish.zhanLi;
}
}else {
//自己鱼被吃,游戏结束
//游戏状态分 0:游戏加载;1:游戏开始;2:游戏暂停;3:游戏结束
state = 3;//游戏结束
}
}
}
}
/**
* 检查碰撞:如果是true则执行碰撞,否则没有参数碰撞
* @param fish
* @return
*/
private boolean hit(Fish fish) {
// TODO 自动生成的方法存根
//找出自己鱼的坐标和其他鱼的坐标
int x = myFish.x + (myFish.x1 - myFish.x)/2;//己方鱼的x中心
int y = myFish.y + (myFish.y1 - myFish.y)/2;//己方鱼的y中心
if(x >= fish.x && x <= fish.x + fish.length) {
if(y >= fish.y && y <= fish.y + fish.height) {
return true;
}
}
return false;
}
/**
* 生成敌方鱼对象的速率
*/
private void createFishs() {
// TODO 自动生成的方法存根
if(miniFish ++ % 200 == 0) {//生成最小的鱼的速度
fishs.add(new MiniFish());
}
if(middleFish ++ % 400 == 0) {//生成中等下的鱼的速度
fishs.add(new MiddleFish());
}
if((bigFish ++ % 1000) == 0) {//生成中等上的鱼的速度
fishs.add(new BigFish());
}
if((superFish++%5000)==0) {//生成大的鱼的速度
fishs.add(new SuperFish());
}
}
}
小码叔
- 粉丝: 5128
- 资源: 5464
最新资源
- kernel-devel-4.19.90-89.11.v2401.ky10.x86-64.rpm
- kernel-4.19.90-89.11.v2401.ky10.x86-64.rpm
- Unity游戏中高效的UI管理系统设计与实现
- Linux无窗口系统的图形界面demo程序(kmscube)
- 本报告基于电商平台的订单数据进行深入分析,旨在通过数据挖掘和可视化手段,洞察电商业务的运营状况,识别市场趋势,优化产品策略,并提出针对性的营销策略建议 报告涵盖数据预处理、财务分析、产品分析、市场分析
- C#ASP.NET企业展会网站源码数据库 Access源码类型 WebForm
- UDS ISO-14229协议中文翻译
- SSM威宁草海旅游(附源码+数据库)24776
- 系统源码A057-基于SpringBoot的失物招领平台的设计与实现
- 爬虫专栏第二篇:Requests 库实战:从基础 GET 到 POST 登录全攻略
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈