- 步驟 :
- 1、建立視窗對象Ui
- 2、背景的繪制
- 3、鍵盤的監聽事件
-
-顯示接口
-
-添加監聽事件
- 4、将己方魚放上去
- 5、讓小魚移動
- 6、其他的魚并引導(先建立集合将魚裝起來,獲得每個對象,畫圖)
- 7、吃魚
- 8、被吃
package 大魚吃小魚;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class Ui extends JFrame implements KeyListener {
FishPanel fishPanel = new FishPanel();//建立打開界面 魚 對象
public Ui() {
this.setTitle( "大魚吃小魚" );//标題
//this.setBounds(100,20,1440,900);//設定大小
this.setSize( 1440 , 900 );//設定視窗大小
//設定窗體關閉背景随之關閉
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );//預設關閉
this.setLocationRelativeTo( null );//視窗居中
this.add(fishPanel);//生成背景界面
fishPanel.action();//生成其他魚的工具
this.setVisible( true );//畫面顯示
this.addKeyListener( this );
}
public static void main(String [] args) {
new Ui();//建立對象
}
@Override
public void keyTyped(KeyEvent e) {
// TODO 自動生成的方法存根
}
@Override
public void keyPressed(KeyEvent e) { //鍵盤按壓走keyPressed方法
// TODO 自動生成的方法存根
System.out.println(0);
//System.out.println( e.getKeyCode() );
fishPanel.move(e.getKeyCode());
}
@Override
public void keyReleased(KeyEvent e) {
// TODO 自動生成的方法存根
//fishPanel.move(e.getKeyCode());
}
}
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());
}
}
}
魚的父類
package 大魚吃小魚;
import java.awt.Graphics;
import java.awt.Image;
public class Fish {
int x,y;//己魚的初始位置
int length,height;//己魚的寬和高
boolean isMoveLeft = true;//己魚的初始方向
Image image;//己魚的圖檔
Image[] img = new Image[10];
//裁剪大小的範圍
int sx1,sy1;
int sx2,sy2;
int zhanLi;
int step;
int count;
//繪制
public void draw(Graphics g) {
}
public void move() {
}
}
繪制各種魚
有mini魚、middle魚、big魚、super魚
- mini魚
package 大魚吃小魚;
import java.awt.Graphics;
import javax.swing.ImageIcon;
/**
1. 最小魚
2. @author jin
3. */
public class MiniFish extends Fish{
public MiniFish() {
int r = (int)(Math.random()*2);//取随機值,要麼1,要麼0
if(r == 0) {
isMoveLeft = false;
//朝向左移,從右邊進
x = -68;
}else {
isMoveLeft = true;
//朝向右移,從右邊進
x = 1440;
}
y = (int)(Math.random()*900);//y取随機值
length = 68;
height = 55;
zhanLi = 1;
//界面坐标
step = 0;
image = new ImageIcon("images/fish08.png").getImage();
}
/**
* 繪制最小魚的功能,向左向右移動
*/
public void draw(Graphics g) {
super.draw(g);
if( isMoveLeft ) {
//己魚方向向左
sy1=height*step;
sx1=0;
sy2=height*step+height;
sx2=length;
//畫最小魚的圖
g.drawImage(image, x--, y, x+length, y+height, sx1, sy1, sx2, sy2, null);
}else {
//己魚方向向右
sx2=0;
sy2=height*step;
sx1=length;
sy1=height*step+height;
//畫最小魚的圖
g.drawImage(image, x++, y, x+length, y+height, sx1, sy1, sx2, sy2, null);
}
}
public void move() {
// TODO Auto-generated method stub
if(step<1){
step++;
}else
step=0;
}
}
- middle魚
package 大魚吃小魚;
/**
* 中等下魚
* @author jin
*
*/
import java.awt.Graphics;
import javax.swing.ImageIcon;
public class MiddleFish extends Fish {
public MiddleFish() {
int r = (int)(Math.random()*2);//取随機值,要麼1,要麼0
if(r == 0) {
isMoveLeft = false;
//朝向左移,從右邊進
x = -68;
}else {
isMoveLeft = true;
//朝向右移,從右邊進
x = 1440;
}
y = (int)(Math.random()*900);//y取随機值
length = 96;
height = 29;
zhanLi = 2;
//界面坐标
step = 0;
image = new ImageIcon("images/fish12.png").getImage();
}
/**
* 繪制中等魚的功能,向左向右移動
*/
public void draw(Graphics g) {
super.draw(g);
if( isMoveLeft ) {
//己魚方向向左
sy1=height*step;
sx1=0;
sy2=height*step+height;
sx2=length;
//畫最小魚的圖
g.drawImage(image, x--, y, x+length, y+height, sx1, sy1, sx2, sy2, null);
}else {
//己魚方向向右
sx2=0;
sy2=height*step;
sx1=length;
sy1=height*step+height;
//畫最小魚的圖
g.drawImage(image, x++, y, x+length, y+height, sx1, sy1, sx2, sy2, null);
}
}
public void move() {
// TODO Auto-generated method stub
int step = 0;
if(step<2) {
step++;
}else
step=0;
}
}
- big魚
package 大魚吃小魚;
import java.awt.Graphics;
import javax.swing.ImageIcon;
/**
* 中等上魚
* @author jin
*
*/
public class bigFish extends Fish {
public bigFish() {
int r = (int)(Math.random()*2);//取随機值,要麼1,要麼0
if(r == 0) {
isMoveLeft=false;
//朝向左移,從右邊進
x=-310;
}else {
isMoveLeft=true;
//朝向右移,從右邊進
x=1440;
}
y=(int)(Math.random()*900);
length= 310;
height= 104;
zhanLi=3;
//界面坐标
step=0;
image = new ImageIcon("images/fish03.png").getImage();
}
/**
* 繪制最小魚的功能,向左向右移動
*/
public void draw(Graphics g){
if(isMoveLeft) {//左移
sy1=height*step;
sx1=0;
sy2=height*step+height;
sx2=length;
g.drawImage(image, x--, y, x+length, y+height, sx1, sy1, sx2,sy2, null);
}
else {//右移
sx2=0;
sy2=height*step;
sx1=length;
sy1=height*step+height;
g.drawImage(image, x++, y, x+length, y+height, sx1, sy1, sx2,sy2, null);
}
}
public void move() {
// TODO Auto-generated method stub
if(step<8){
step++;
}else
step=0;
}
}
- super魚
package 大魚吃小魚;
import java.awt.Graphics;
import javax.swing.ImageIcon;
public class superFish extends Fish {
public superFish() {
int r = (int)(Math.random()*2);//取随機值,要麼1,要麼0
if(r == 0) {
isMoveLeft=false;
//朝向左移,從右邊進
x=-380;
}else {
isMoveLeft=true;
//朝向右移,從右邊進
x=1440;
}
y=(int)(Math.random()*900);
length= 380;
height= 210;
zhanLi=4;
//界面坐标
step=0;
image = new ImageIcon("images/fish17.png").getImage();
}
/**
* 繪制最小魚的功能,向左向右移動
*/
public void draw(Graphics g){
if(isMoveLeft) {//左移
sy1=height*step;
sx1=0;
sy2=height*step+height;
sx2=length;
g.drawImage(image, x--, y, x+length, y+height, sx1, sy1, sx2,sy2, null);
}
else {//右移
sx2=0;
sy2=height*step;
sx1=length;
sy1=height*step+height;
g.drawImage(image, x++, y, x+length, y+height, sx1, sy1, sx2,sy2, null);
}
}
public void move() {
// TODO Auto-generated method stub
if(step<1) {
step++;
}else
step=0;
}
}
代碼所需要的圖檔
-
遊戲界面
images/start.png
-
遊戲運作界面
images/bg.jpg
-
super魚
images/fish17.png
-
big魚
images/fish03.png
-
middle魚
images/fish12.png
-
自己魚和mini魚
images/fish08.png