Java飛機大戰
本次的飛機大戰是我進入大學以來第一次大部分靠自己的思路寫出來的專案,雖然代碼質量可能不是很高,但是這次專案完成給我帶來的成就感真的很大很大,
飛機大戰專案總結
1、游戲開始界面

2、游戲運行界面

3、游戲結束界面

1)解決問題
敵機:大型敵機、中型敵機、小型、boss機
我方:英雄機
背景:天空
2)各個物件所具備的功能和特征
大敵機:有五條生命,從天空上方出現往下走,被擊毀后英雄機加五十分
小敵機:有一條生命,從天空上方出現往下走,被擊毀后英雄機加十分
中型機:有二條生命,從天空上方出現往下走,被擊毀后英雄機加二十分
boss機:英雄機1000毫秒以后出現,有五種火力值會隨著生命值的減少和逐漸增加火力
值,有100條生命被擊毀后加1000分,
英雄機:初始生命有三條,初始火力為零,英雄機隨著滑鼠的位置移動,火力大于零后能發
射三發子彈、大于1000后能發射五發,
天空:一個向下移動的背景板什么功能也沒有
2)補給:當英雄機撿到補給時生命值加一火力值加一(有三個火力等級,當火力等級為三
生命值為三時再拾取補給將不在增加),當英雄級撞到敵機或被敵方子彈打中時火力值減一
生命值減一
3)計分器:每擊殺一個小型飛機、中型飛機、大型飛機分數加十、二十、五十,當擊殺boss
時分數增加500.
4)引入了不同的爆炸效果
5)游戲敵機移動的速度會隨著時間的增加而增加(即難度會隨著時間的遞增而遞增)敵機
速度最大值為5.
6)游戲有開始界面和結束界面引入了暫停按鈕
7)引入音效:有背景音樂、小、大型飛機、boss爆炸音效和子彈發射的音效
8)連接資料庫:通過連接資料庫記錄每次獲取的分數進行了一個排序,相當于引入了一個
排行榜(記錄前十的分數)
9)游戲難度會隨著時間的增加而遞增(敵機移動速度會增加,當速度達到5時將不會再
增加)
專案經歷(我):我做飛機大戰的程序個人覺得比較曲折,起初我是選擇在網上找視瞥澩跟著老師一起敲完這個專案,但是當我做到飛機能夠發射子彈這一步時該視頻就得付費觀看了,所以我只能因此放棄這個方法另找資源繼續敲下去,但是因為類名和物件名等都已經確定下來,所以如果不是對先前的代碼的每一句話都有著一定的了解那么即便我找到了別的源代碼我也很難能繼續寫下去,所以我們組的進度在這里停頓了許久,因為代碼的生澀難懂我甚至產生過放棄的想法跟著別的源代碼再從頭開始敲一遍,因此我也非常感謝我的搭檔在那段時間給予我潛移默化的鼓勵(前期功能的實作我們兩個都自己敲了一份代碼,但是因為進度的停頓所以當時他的進度遠遠在我前面),再那段時間他教了我很多東西,例如在英雄機碰撞減少火力值和生命值可以參考之前英雄級發射子彈與敵機碰撞的代碼,聽起來這是不一樣的功能,但是實際上他們的思路可以說是一模一樣的,于是我便以這種方法一直擴展功能才能完善到如今這個模樣,
專案經歷(隊友):本次java課程設計我們選擇的是飛機大戰,對于第一次做這樣課程設計的我來說,有點慌張,但同時又有點激動,因為這也是一個讓我們能力提高很多的機遇,
剛開始我們是毫無頭緒的,聽到別人一個下午就把課設的很多界面寫完了,我心里就很著急,但是又無能為力,畢竟我能力有些欠缺,只能不停的找博客看代碼,慢慢的,我們的飛機大戰雛形基本完成,功能也基本實作,但也只是實作了一部分的基本要求,
“亮點是什么?”這個問題一直圍繞我們很久,我們經過無數次思考,最終決定加入其他型別飛機,,,,,,,最后為了實作這些功能,我們不得不將前面一部分代碼推翻,找其他方法去實作,
最終經過我們不斷地修正,飛機大戰基本實作,但仍存在一點點bug,而后面大部分時間,我們都是在不停的找bug,最侄訓本實作我們的想法后,我們兩個都很開心,
這次課設,我們不僅掌握了java界面設計方面的方法、多執行緒的運用,更是鍛煉了團隊協作能力,也鍛煉了我們java的界面設計能力,今后對于這樣的課設,我們也會認真對待,爭取做出亮點十分突出的東西!
識訓(我):這次的飛機大戰是我第一次用Java寫專案,從中的識訓個人感覺是很大的,我從中學會image對圖片的引入,見識了多執行緒連續繪畫圖片讓地圖子彈飛機移動起來,然后各種坐標的計算來給子彈的發射位置,敵機的出現和移動規律構圖等等,更大的識訓是這是我第一次有著自己的想法寫下來的代碼,并沒有看網上的代碼寫下來了幾個類,例如引入多種敵機還有火力值增加等,靠著自己所學知識完完全全實作的功能真的給我的成就感特別特別多,很滿足這次的Java專案設計,但如果時間充足的話我還是希望能夠實作一個關卡功能和多種英雄級角色,讓游戲功能變得更加完善
識訓(隊友):第一次用java完成一個專案,程序中曲折也挺多的,但同時我們也識訓了很多,多執行緒的運用,繪圖方法的運用,以及各種物品之間的互動功能的判斷等等,這無疑讓我在Java界面設計上的能力得到了一次鍛煉,不僅僅是編程方面的能力,我的自學能力也得到了一定的鍛煉,對于不太理解的方法,我都是查找博客,通過消化別人的方法,然后按照自己的理解來解決問題,
對于我們的飛機大戰,我覺得是還不錯,但我覺得我們可以做得更好,我們的設想遠不止于此,相信我們也會在假期通過對java的深入理解,不斷完善我們的飛機大戰,
下面是攜帶上我這次飛機大戰的代碼:
Airdrop類
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;
public class Airdrop {
//設定飛機大小
public int width = 50;
public int length = 50;
public int x;
public int y;
//匯入補給圖片
public Image images = Toolkit.getDefaultToolkit().getImage("src/圖片/airdrop.png");
public Mypanel mypanel;
public Airdrop(Mypanel mypanel) {
this.mypanel=mypanel;
Random r=new Random();
x=r.nextInt(BaseFrame.framewidth-width);
y=0;
}
public void drawSelf(Graphics g){
g.drawImage(images,x,y,width,length,null);
Player p=mypanel.player;
for(int i=0;i<mypanel.airdrops.size();i++){
Airdrop a=mypanel.airdrops.get(i);
if(((a.x-p.x<=a.width/2+p.width/2&&a.x>=p.x)||(p.x-a.x<=a.width/2+p.width/2&&a.x<=p.x))&&((a.y-p.y<=a.length/2+p.length/2&&a.y>=p.y)||(p.y-a.y<=a.length/2+p.length/2&&a.y<=p.y))){
{
mypanel.airdrops.remove(a);
if(mypanel.player.fire<3)
{
mypanel.player.fire++;//飛機撿到補給火力加一
mypanel.player.life++;//飛機檢到補給生命值加一
}
}
}
}
if(mypanel.time%6==0){
y+=2;
if(y>=BaseFrame.framelength){
mypanel.airdrops.remove(this);
}
}
}
}
BaseFrame類
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class BaseFrame extends JFrame implements ActionListener {
public static int framewidth = 345;
public static int framelength = 575;
public Mypanel mypanel;
public JButton jb=new JButton(“排行”);
public JButton jb2=new JButton(“暫停”);
JLayeredPane lay=new JLayeredPane();
public FrameMouseListener frameMouseListener;// 滑鼠監聽器
public void setTouchListener() {
frameMouseListener = new FrameMouseListener();
frameMouseListener.baseFrame = this;
this.addMouseMotionListener(frameMouseListener);// 注冊監聽器
}
public BaseFrame() {
this.setTitle("飛機大戰");
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(framewidth, framelength);
this.setLocationRelativeTo(null);
this.setLayout(null);
mypanel = new Mypanel(this);
mypanel.setSize(345, 575);
//this.add(mypanel);
lay.add(mypanel,JLayeredPane.DEFAULT_LAYER);
this.setLayeredPane(lay);
jb.setBounds(345/2-35, 400-20, 70, 40);
jb.addActionListener(this);
lay.add(jb,JLayeredPane.MODAL_LAYER);
jb2.setBounds(305-30, 0, 60, 20);
jb2.addActionListener(this);
lay.add(jb2,JLayeredPane.MODAL_LAYER);
mypanel.bg.loop();
// 設定監聽器
// setTouchListener();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==jb) {
//new Score();
}
else if(e.getSource()==jb2) {
try {
mypanel.drawaleThread.sleep(10000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
package project;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class Bomb {
public int x;
public int y;
public int count=0;
Image boom= Toolkit.getDefaultToolkit().getImage(“src/圖片/bom3.png”);
public int width=boom.getWidth(null);
public int length=boom.getHeight(null);
public Bomb(int bx,int by){
this.x=bx;
this.y=by;
}
public void drawSelf(Graphics g){
g.drawImage(boom,x,y,width,length,null);
this.count++;
}
}
Bullet類
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class Bullet {
public Mypanel mypanel;
public int width=6;
public int length=14;
public int x;
public int y;
//存放所有的子彈圖片物件
public Image[] image=new Image[] {
Toolkit.getDefaultToolkit().getImage("src/圖片/ammo.png")
};
public int imageindex=0;
public Bullet(Mypanel mypanel){
this.mypanel=mypanel;
}
//畫子彈
public void drawSelf(Graphics g){
g.drawImage(image[imageindex],x,y,width,length,null);
mypanel.hero_bullet.play();
for(int i=0;i<mypanel.bullets.size();i++){
Bullet b=mypanel.bullets.get(i);
for(int j=0;j<mypanel.enemies.size();j++){
enemy e=mypanel.enemies.get(j);
if(((e.x-b.x<=e.width/2+b.width/2&&e.x>=b.x)||(b.x-e.x<=e.width/2+b.width/2&&e.x<=b.x))&&((e.y-b.y<=e.length/2+b.length/2&&e.y>=b.y)||(b.y-e.y<=e.length/2+b.length/2&&e.y<=b.y))){
mypanel.bullets.remove(b);
}
}
}
if(mypanel.time%1==0){
imageindex++;
if(imageindex>=this.image.length)
imageindex=0;
y--;
if(y<0){
//子彈到界面外,移除該子彈
mypanel.bullets.remove(this);
}
}
}
}
**DrawaleThread類
package project;
public class DrawaleThread extends Thread{//動態背景執行緒
public Mypanel mypanel;
public DrawaleThread(Mypanel mypanel){
this.mypanel=mypanel;
}
public void run(){
while(true){
this.mypanel.repaint();
try{
this.currentThread().sleep(1);
} catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
enemy類
package project;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;
public class enemy {
public int width = 40;
public int length = 25;
public int x;
public int y;
//public int speed=1;
//public int addspeed=5000;
public int eindex = 0;
public Image images = Toolkit.getDefaultToolkit().getImage("src/圖片/enemy.png");//匯入小飛機圖片
//public Image images01 = Toolkit.getDefaultToolkit().getImage("src/圖片/bom1.png");//匯入小飛機爆炸圖片
public Mypanel mypanel;
public enemy(Mypanel mypanel) {
this.mypanel=mypanel;
Random r=new Random();
x=r.nextInt(BaseFrame.framewidth-width);
y=0;
}
//如果子彈碰撞到敵機敵機消失
public void drawSelf(Graphics g){
g.drawImage(images,x,y,width,length,null);
for(int i=0;i<mypanel.bullets.size();i++){
Bullet b=mypanel.bullets.get(i);
for(int j=0;j<mypanel.enemies.size();j++){
enemy e=mypanel.enemies.get(j);
if(((e.x-b.x<=e.width+b.width&&e.x>=b.x)||(b.x-e.x<=e.width+b.width&&e.x<=b.x))&&((e.y-b.y<=e.length+b.length&&e.y>=b.y)||(b.y-e.y<=e.length+b.length&&e.y<=b.y))){
{
//g.drawImage(images01,e.x,e.y,e.width,e.length,null);
mypanel.enemies.remove(e);
mypanel.bullets.remove(b);
mypanel.bombs.add(new Bomb(e.x,e.y));
mypanel.enemy_bomb.play();//引入敵機爆炸音效
mypanel.score+=10;
}
}
}
}
if(mypanel.time%6==0){
y+=mypanel.speed;
if(mypanel.time%mypanel.addspeed==0)
{
if(mypanel.speed<4)
mypanel.speed+=1;
mypanel.addspeed=50000*mypanel.speed;
if(y>BaseFrame.framelength){
mypanel.enemies.remove(this);
}
}
}
/*for(int j=0;j<mypanel.enemies.size();j++) {
enemy e=mypanel.enemies.get(j);
if(((e.x-mypanel.player.x<=e.width+mypanel.player.width&&e.x>=mypanel.player.x)||(mypanel.player.x-e.x<=e.width+mypanel.player.width&&e.x<=mypanel.player.x))&&((e.y-mypanel.player.y<=e.length+mypanel.player.length&&e.y>=mypanel.player.y)||(mypanel.player.y-e.y<=e.length+mypanel.player.length&&e.y<=mypanel.player.y))){
{
mypanel.player.life--;
if(mypanel.player.fire>1)
mypanel.player.fire=1;
if(mypanel.player.life==0)
mypanel.player.start_over=-1;
}
}
}*/
}
}
enemy01類
package project;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;
public class enemy01 {
public int width = 40;
public int length = 25;
public int x;
public int y;
public int life=0;//記錄敵機血量
public int imageindex=0;
//public int speed=1;
//public int addspeed=5000;
public int eindex = 0;
//public Image images = Toolkit.getDefaultToolkit().getImage("src/圖片/airplane0.png");
public Image[] images=new Image[]{
Toolkit.getDefaultToolkit().getImage("src/圖片/airplane0.png"),
Toolkit.getDefaultToolkit().getImage("src/圖片/airplane1.png")
};
public Mypanel mypanel;
public enemy01(Mypanel mypanel) {
this.mypanel=mypanel;
Random r=new Random();
x=r.nextInt(BaseFrame.framewidth-width);
y=0;
}
//如果子彈碰撞到敵機敵機消失
public void drawSelf(Graphics g){
g.drawImage(images[imageindex],x,y,width,length,null);
if(mypanel.time%500){
imageindex++;
if(imageindeximages.length){
imageindex=0;
}
}
for(int i=0;i<mypanel.bullets.size();i++){
Bullet b=mypanel.bullets.get(i);
for(int j=0;j<mypanel.enemies01.size();j++){
enemy01 e=mypanel.enemies01.get(j);
if(((e.x-b.x<=e.width+b.width&&e.x>=b.x)||(b.x-e.x<=e.width+b.width&&e.x<=b.x))&&((e.y-b.y<=e.length+b.length&&e.y>=b.y)||(b.y-e.y<=e.length+b.length&&e.y<=b.y))){
{
life++;
//mypanel.enemies01.remove(e);
mypanel.bullets.remove(b);
//mypanel.score+=20;
if(life==2)//中型型飛機血量為2,當有兩發子彈打中時移除該物件
{
mypanel.enemies01.remove(e);
mypanel.bom1.play();
mypanel.bombs.add(new Bomb(e.x,e.y));
mypanel.score+=20;
life=0;
}
}
}
}
}
if(mypanel.time%10==0){
y+=mypanel.speed;
if(mypanel.time%mypanel.addspeed==0)
{
if(mypanel.speed<4)
mypanel.speed++;
mypanel.addspeed=50000*mypanel.speed;
if(y>BaseFrame.framelength){
mypanel.enemies01.remove(this);
}
}
}
}
}
enemy02類
package project;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;
public class enemy02 {
public int width = 150;
public int length = 102;
public int x;
public int y;
public int life=100;//記錄敵機血量
public int eindex = 0;
public Image images = Toolkit.getDefaultToolkit().getImage("src/圖片/boss.png");
// public Image images01 = Toolkit.getDefaultToolkit().getImage(“src/圖片/plane02.jpg”);
//public Image images02 = Toolkit.getDefaultToolkit().getImage(“src/圖片/plane03.jpg”);
public Mypanel mypanel;
public enemy02(Mypanel mypanel) {
this.mypanel=mypanel;
x=mypanel.bgimage.getWidth(mypanel)/2;
y=0;
}
//如果子彈碰撞到敵機敵機消失
public void drawSelf(Graphics g) throws Exception{
g.drawImage(images,x,y,width,length,null);
for(int i=0;i<mypanel.bullets.size();i++){
Bullet b=mypanel.bullets.get(i);
enemy02 e=mypanel.boss;
if(enull) break;
int ex=e.x+e.width/2,ey=e.y+e.length/2;
int bx=b.x+b.width/2,by=b.y+b.length/2;
if(Math.abs(ex-bx)<e.width/2+b.width/2&&Math.abs(ey-by)<e.length/2+b.length/2){
e.life–;
//System.out.println(e.life);
if(e.life0){
mypanel.bombs.add(new Bomb(e.x, e.y));
mypanel.boss=null;
mypanel.score+=1000;
mypanel.all_bomb.play();
}
mypanel.bullets.remove(b);
}
}
if(mypanel.time%100==0){
y++;
if(y>BaseFrame.framelength){
y=0;
}
}
}
}
enemy03類
package project;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;
public class enemy03 {
public int width = 40;
public int length = 25;
public int x;
public int y;
public int life=0;//記錄敵機血量
public int imageindex=0;
//public int speed=1;
//public int addspeed=5000;
public int eindex = 0;
//public Image images = Toolkit.getDefaultToolkit().getImage("src/圖片/airplane0.png");
public Image[] images=new Image[]{
Toolkit.getDefaultToolkit().getImage("src/圖片/bigairplane0.png"),
Toolkit.getDefaultToolkit().getImage("src/圖片/bigairplane1.png")
};
public Mypanel mypanel;
public enemy03(Mypanel mypanel) {
this.mypanel=mypanel;
Random r=new Random();
x=r.nextInt(BaseFrame.framewidth-width);
y=0;
}
//如果子彈碰撞到敵機敵機消失
public void drawSelf(Graphics g){
g.drawImage(images[imageindex],x,y,width,length,null);
if(mypanel.time%500){
imageindex++;
if(imageindeximages.length){
imageindex=0;
}
}
for(int i=0;i<mypanel.bullets.size();i++){
Bullet b=mypanel.bullets.get(i);
for(int j=0;j<mypanel.enemies03.size();j++){
enemy03 e=mypanel.enemies03.get(j);
if(((e.x-b.x<=e.width+b.width&&e.x>=b.x)||(b.x-e.x<=e.width+b.width&&e.x<=b.x))&&((e.y-b.y<=e.length+b.length&&e.y>=b.y)||(b.y-e.y<=e.length+b.length&&e.y<=b.y))){
{
life++;
//mypanel.enemies01.remove(e);
mypanel.bullets.remove(b);
//mypanel.score+=20;
if(life==5)//大型飛機血量為5,當有五發子彈打中時移除該物件
{
mypanel.enemies03.remove(e);
mypanel.bom2.play();//引入敵機爆炸音效
mypanel.bombs.add(new Bomb(e.x,e.y));
mypanel.score+=50;
life=0;
}
}
}
}
}
if(mypanel.time%10==0){
y+=mypanel.speed;
if(mypanel.time%mypanel.addspeed==0)
{
if(mypanel.speed<4)
mypanel.speed++;
mypanel.addspeed=50000*mypanel.speed;
if(y>BaseFrame.framelength){
mypanel.enemies03.remove(this);
}
}
}
/*if(mypanel.time%10==0){
if(time)
x--;
if(x==0)
x++;
}*/
}
}
EnemyBullet類
package project;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class EnemyBullet {// boss子彈
public Mypanel mypanel;
public int width = 6;
public int length = 14;
public int x;
public int y;
public int diretion;//0-往左下,1-直接下落,2-往右下
public Image image = Toolkit.getDefaultToolkit().getImage(“src/圖片/bullet1.png”);
public EnemyBullet(Mypanel mypanel) {
this.mypanel = mypanel;
}
public void drawSelf(Graphics g) {
g.drawImage(image, x, y, width, length, null);
for (int i = 0; i < mypanel.eBullets.size(); i++) {
EnemyBullet b = mypanel.eBullets.get(i);
Player e=mypanel.player;
if(((e.x-b.x<=e.width/2+b.width/2&&e.x>=b.x)||(b.x-e.x<=e.width/2+b.width/2&&e.x<=b.x))&&((e.y-b.y<=e.length/2+b.length/2&&e.y>=b.y)||(b.y-e.y<=e.length/2+b.length/2&&e.y<=b.y))){
mypanel.eBullets.remove(b);
e.nlife--;
e.fire--;
}
if(e.nlife==0){
mypanel.state=0;
}
}
if(mypanel.time%2==0){
y++;
if(diretion==0){
x--;
}
else if(diretion==2){
x++;
}
if(y>BaseFrame.framelength||x<0||x>BaseFrame.framewidth){
mypanel.enemies.remove(this);
}
}
}
}
FrameMouseListener類
package project;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class FrameMouseListener implements MouseMotionListener,MouseListener {
public BaseFrame baseFrame;
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
baseFrame.mypanel.player.x=e.getX()-baseFrame.mypanel.player.width/2;
baseFrame.mypanel.player.y=e.getY()-baseFrame.mypanel.player.length/2;
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
}
Main類
package project;
public class Main {
public static void main(String[] args){
BaseFrame a=new BaseFrame();
}
}
Mypanel類
package project;
import javax.swing.JApplet;
import javax.swing.JPanel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.net.MalformedURLException;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Random;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
public class Mypanel extends JPanel implements MouseMotionListener,MouseListener{
public Image bgimage;
public Image endimage;
public Image startimage;
public int time=0;//時間
public int top=0;//圖片位置移動
public int state=2;
public int score=0;
public int speed=1;
public BaseFrame baseframe;
public int addspeed=5000;
//創建執行緒
public DrawaleThread drawaleThread;
public Player player;
public enemy03 enemy;
public enemy02 boss;
public ArrayList<Bullet> bullets=new ArrayList<Bullet>();
public ArrayList<EnemyBullet> eBullets=new ArrayList<EnemyBullet>();
public ArrayList<enemy> enemies=new ArrayList<enemy>();
public ArrayList<Airdrop> airdrops=new ArrayList<Airdrop>();//小飛機
public ArrayList<enemy01> enemies01=new ArrayList<enemy01>();//中型飛機
public ArrayList<enemy03> enemies03=new ArrayList<enemy03>();//大型飛機
public ArrayList<Bomb> bombs=new ArrayList<Bomb>();//引入爆炸效果
java.applet.AudioClip all_bomb,enemy_bomb,bg,hero_bomb,hero_bullet,bom1,bom2;//宣告java.applet.AudioClip型別的參考用來儲存音頻
public Mypanel(BaseFrame baseframe){
this.baseframe=baseframe;
bgimage=Toolkit.getDefaultToolkit().getImage("src/圖片/background.png");
endimage=Toolkit.getDefaultToolkit().getImage("src/圖片/gameover.png");
startimage=Toolkit.getDefaultToolkit().getImage("src/圖片/start.png");
drawaleThread=new DrawaleThread(this);
drawaleThread.start();
player=new Player(this);
this.addMouseListener(this);
this.addMouseMotionListener(this);
try{
all_bomb = JApplet.newAudioClip(new File("src/music/all_bomb.wav").toURI().toURL());
enemy_bomb = JApplet.newAudioClip(new File("src/music/enemy_bomb.wav").toURI().toURL());
bg = JApplet.newAudioClip(new File("src/music/bg01.mp3").toURI().toURL());
hero_bomb = JApplet.newAudioClip(new File("src/music/hero_bomb.wav").toURI().toURL());
hero_bullet = JApplet.newAudioClip(new File("src/music/hero_bomb.wav").toURI().toURL());
bom1= JApplet.newAudioClip(new File("src/music/10804.wav").toURI().toURL());
bom2 = JApplet.newAudioClip(new File("src/music/10804.wma").toURI().toURL());
hero_bullet = JApplet.newAudioClip(new File("src/music/hero_bomb.wav").toURI().toURL());
}catch(MalformedURLException e){
e.printStackTrace();
}
}
@Override
public void paintComponent(Graphics g){
if(state==2){
super.paintComponent(g);
g.drawImage(startimage,0,0,startimage.getWidth(this),startimage.getHeight(this),null);
}else if(state==1){
//bg.loop();;
//繪制背景圖
super.paintComponent(g);
g.drawImage(bgimage,0,top-bgimage.getHeight(this),bgimage.getWidth(this),bgimage.getHeight(this),null);
g.drawImage(bgimage,0,top,bgimage.getWidth(this),bgimage.getHeight(this),null);
//根據時間來移動圖片
time++;
if(time==1000*1000*10){
time=0;
}
if(time%10==0){
top++;
if(top>=this.bgimage.getHeight(this)){
top=0;
}
}
//分數
String sc="分數:"+String.valueOf(score);
g.setFont(new Font("TimesRoman", Font.BOLD, 24));
g.setColor(Color.RED);
g.drawString(sc,2,20);
//生命值
String lf="生命:"+String.valueOf(player.nlife);
g.setFont(new Font("TimesRoman", Font.BOLD, 24));
g.setColor(Color.RED);
g.drawString(lf,2,45);
//繪制戰機圖
player.drawSelf(g);
//創建子彈
if(time%200==0){
if(player.fire==1){
Bullet bullet=new Bullet(this);
bullet.x=player.x+player.width/2-bullet.width/2;
bullet.y=player.y;
bullets.add(bullet);
}
else if(player.fire==2)
{
Bullet bullet1=new Bullet(this);
bullet1.x=this.player.x+this.player.width/2-bullet1.width/2;
bullet1.y=this.player.y-15;
this.bullets.add(bullet1);
Bullet bullet2=new Bullet(this);
bullet2.x=this.player.x+this.player.width/2-bullet2.width-5;
bullet2.y=this.player.y;
this.bullets.add(bullet2);
Bullet bullet3=new Bullet(this);
bullet3.x=this.player.x+this.player.width/2+bullet3.width;
bullet3.y=this.player.y;
this.bullets.add(bullet3);
}
else if(player.fire==3)
{
Bullet bullet1=new Bullet(this);
bullet1.x=this.player.x+this.player.width/2-bullet1.width/2;
bullet1.y=this.player.y-30;
this.bullets.add(bullet1);
Bullet bullet2=new Bullet(this);
bullet2.x=this.player.x+this.player.width/2-bullet2.width-8;
bullet2.y=this.player.y-15;
this.bullets.add(bullet2);
Bullet bullet3=new Bullet(this);
bullet3.x=this.player.x+this.player.width/2+bullet3.width+5;
bullet3.y=this.player.y-15;
this.bullets.add(bullet3);
Bullet bullet4=new Bullet(this);
bullet4.x=this.player.x+this.player.width/2+bullet4.width*2-33;
bullet4.y=this.player.y;
this.bullets.add(bullet4);
Bullet bullet5=new Bullet(this);
bullet5.x=this.player.x+this.player.width/2+bullet5.width+10;
bullet5.y=this.player.y;
this.bullets.add(bullet5);
}
}
for(int i=0;i<bombs.size();i++){
Bomb b=bombs.get(i);
b.drawSelf(g);
if(b.count>=50){
bombs.remove(b);
}
}
for(int i=0;i<bullets.size();i++){
bullets.get(i).drawSelf(g);
}
if(boss!=null){
/*try {
boss.drawSelf(g);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
if(boss.life>=80)
{
if(time%500==0)
{
EnemyBullet bullet2 = new EnemyBullet(this);
bullet2.diretion=1;
bullet2.x = this.boss.x + this.boss.width / 2 - bullet2.width ;
bullet2.y = this.boss.y+boss.length;
this.eBullets.add(bullet2);
}
}
else if(boss.life>=70&&boss.life<80)
{
if(time%200==0)
{
EnemyBullet bullet2 = new EnemyBullet(this);
bullet2.diretion=1;
bullet2.x = this.boss.x + this.boss.width / 2 - bullet2.width ;
bullet2.y = this.boss.y+boss.length;
this.eBullets.add(bullet2);
}
}
else if(boss.life>50&&boss.life<70)
{
if(time%500==0)
{
EnemyBullet bullet1 = new EnemyBullet(this);
bullet1.diretion=0;
bullet1.x = this.boss.x + this.boss.width / 2 - bullet1.width / 2;
bullet1.y = this.boss.y+boss.length;
this.eBullets.add(bullet1);
EnemyBullet bullet3 = new EnemyBullet(this);
bullet3.diretion=2;
bullet3.x = this.boss.x + this.boss.width / 2 + bullet3.width;
bullet3.y = this.boss.y+boss.length;
this.eBullets.add(bullet3);
}
}
else if(boss.life>30&&boss.life<=50)
{
if(time%200==0)
{
EnemyBullet bullet1 = new EnemyBullet(this);
bullet1.diretion=0;
bullet1.x = this.boss.x + this.boss.width / 2 - bullet1.width / 2;
bullet1.y = this.boss.y+boss.length;
this.eBullets.add(bullet1);
EnemyBullet bullet3 = new EnemyBullet(this);
bullet3.diretion=2;
bullet3.x = this.boss.x + this.boss.width / 2 + bullet3.width;
bullet3.y = this.boss.y+boss.length;
this.eBullets.add(bullet3);
}
}
else if(boss.life<=30&&boss.life>10)
{
if(time%500==0){
EnemyBullet bullet1 = new EnemyBullet(this);
bullet1.diretion=0;
bullet1.x = this.boss.x + this.boss.width / 2 - bullet1.width / 2;
bullet1.y = this.boss.y+boss.length;
this.eBullets.add(bullet1);
EnemyBullet bullet2 = new EnemyBullet(this);
bullet2.diretion=1;
bullet2.x = this.boss.x + this.boss.width / 2 - bullet2.width ;
bullet2.y = this.boss.y+boss.length;
this.eBullets.add(bullet2);
EnemyBullet bullet3 = new EnemyBullet(this);
bullet3.diretion=2;
bullet3.x = this.boss.x + this.boss.width / 2 + bullet3.width;
bullet3.y = this.boss.y+boss.length;
this.eBullets.add(bullet3);
}
}
else if(boss.life<=100)
{
if(time%200==0){
EnemyBullet bullet1 = new EnemyBullet(this);
bullet1.diretion=0;
bullet1.x = this.boss.x + this.boss.width / 2 - bullet1.width / 2;
bullet1.y = this.boss.y+boss.length;
this.eBullets.add(bullet1);
EnemyBullet bullet2 = new EnemyBullet(this);
bullet2.diretion=1;
bullet2.x = this.boss.x + this.boss.width / 2 - bullet2.width ;
bullet2.y = this.boss.y+boss.length;
this.eBullets.add(bullet2);
EnemyBullet bullet3 = new EnemyBullet(this);
bullet3.diretion=2;
bullet3.x = this.boss.x + this.boss.width / 2 + bullet3.width;
bullet3.y = this.boss.y+boss.length;
this.eBullets.add(bullet3);
}
}
try {
boss.drawSelf(g);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < eBullets.size(); i++) {
eBullets.get(i).drawSelf(g);
}
if(time%1000==0){
enemy enemy_1=new enemy(this);
enemy enemy_2=new enemy(this);
enemy enemy_3=new enemy(this);
enemy01 enemy01_1=new enemy01(this);
enemies.add(enemy_1);
enemies.add(enemy_2);
enemies.add(enemy_3);
enemies01.add(enemy01_1);
}
if(time%1000*10==0&&time>1000*10)
{
enemy03 enemy03_1=new enemy03(this);
enemies03.add(enemy03_1);
//enemy02 enemy02_2=new enemy02(this);
//enemies02.add(enemy02_2);
}
if (time % 10000 == 0&&boss==null) {
/*
* enemy02 enemy02_1 = new enemy02(this); enemies02.add(enemy02_1); enemy02
* enemy02_2 = new enemy02(this); enemies02.add(enemy02_2);
*/
boss = new enemy02(this);
}
for(int i=0;i<enemies.size();i++){
enemies.get(i).drawSelf(g);
}
for(int i=0;i<enemies01.size();i++){
enemies01.get(i).drawSelf(g);
}
for(int i=0;i<enemies03.size();i++){
enemies03.get(i).drawSelf(g);
}
//繪制補給
Random ran=new Random();
//if(time%(ran.nextInt(10000)+5000)==0){
if(time%(ran.nextInt(10000)+500)==0) {
Airdrop a1=new Airdrop(this);
airdrops.add(a1);
}
for(int i=0;i<airdrops.size();i++){
airdrops.get(i).drawSelf(g);
}
}
else{
super.paintComponent(g);
g.drawImage(endimage,0,0,endimage.getWidth(this),endimage.getHeight(this),null);
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if((e.getButton()==e.BUTTON1||e.getButton()==e.BUTTON2||e.getButton()==e.BUTTON3)){
if(state==0){
player.nlife=1;
player.fire=1;
player.x=(BaseFrame.framewidth-player.width)/2;
player.y=BaseFrame.framelength-player.length*2;
time=0;
top=0;
score=0;
this.airdrops.clear();
this.bullets.clear();
this.enemies.clear();
this.enemies01.clear();
this.enemies03.clear();
this.boss=null;
}
baseframe.jb.setVisible(false);
state=1;
}
else if(state==2&&(e.getButton()==e.BUTTON1||e.getButton()==e.BUTTON2||e.getButton()==e.BUTTON3)){
bullets.clear();
airdrops.clear();
state=1;
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
if(e.getX()<0) this.player.x=0;
else if(e.getX()>BaseFrame.framewidth){
this.player.x=BaseFrame.framewidth-this.player.width;
}
else{
this.player.x=e.getX()-this.player.width/2;
}
if(e.getY()<0) this.player.y=0;
else if(e.getY()>BaseFrame.framelength){
this.player.y=BaseFrame.framelength-this.player.length;
}
else{
this.player.y=e.getY()-this.player.length/2;
}
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
}
Player類**
package project;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
public class Player {
public int width=60;
public int length=61;
public int x;
public int y;
public int fire=1;
public static int life=1;//初始生命
public int nlife=life;
public int imageindex=0;
public Image[] images=new Image[]{
Toolkit.getDefaultToolkit().getImage("src/圖片/player1.png"),
Toolkit.getDefaultToolkit().getImage("src/圖片/player2.png")
};
public Mypanel mypanel;
public Player(Mypanel mypanel){
this.mypanel=mypanel;
x=(BaseFrame.framewidth-width)/2;
y=BaseFrame.framelength-length*2;
}
public void drawSelf(Graphics g){
g.drawImage(images[imageindex],x,y,width,length,null);
Player p=mypanel.player;
for(int i=0;i<mypanel.airdrops.size();i++){
Airdrop a=mypanel.airdrops.get(i);
if(((a.x-p.x<=a.width/2+p.width/2&&a.x>=p.x)||(p.x-a.x<=a.width/2+p.width/2&&a.x<=p.x))&&((a.y-p.y<=a.length/2+p.length/2&&a.y>=p.y)||(p.y-a.y<=a.length/2+p.length/2&&a.y<=p.y))){
if(nlife<3){
nlife++;
fire++;
}
mypanel.airdrops.remove(a);
}
}
for(int i=0;i<mypanel.enemies.size();i++){
enemy a=mypanel.enemies.get(i);
if(((a.x-p.x<=a.width/2+p.width/2&&a.x>=p.x)||(p.x-a.x<=a.width/2+p.width/2&&a.x<=p.x))&&((a.y-p.y<=a.length/2+p.length/2&&a.y>=p.y)||(p.y-a.y<=a.length/2+p.length/2&&a.y<=p.y))){
nlife--;
fire--;
mypanel.enemies.remove(a);
}
if(nlife==0){
mypanel.state=0;
mypanel.hero_bomb.play();
}
}
if(mypanel.time%50==0){
imageindex++;
if(imageindex==images.length){
imageindex=0;
}
}
}
最后我將我這次用到的圖片、音頻、完整代碼都發到百度云網盤里 ,鏈接https://pan.baidu.com/s/1s7YaxsemQ2ncK4p7bmteug
提取碼:0i92
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256701.html
標籤:其他
