2019-06-06 java飛機(jī)游戲項(xiàng)目

image.png

image.png

package cn.sxt.game;

import java.awt.Graphics;
import java.awt.Image;

public class Explode {

    double x ,y;
    static Image[] imgs=new Image[16];
    static {
        for(int i=0;i<16;i++) {
            imgs[i]=GameUtil.getImage("images/explode/e"+(i+1)+".gif");
            imgs[i].getWidth(null);
        }
    }
    int count;
    public void draw(Graphics g) {
        if(count<=15) {
            g.drawImage(imgs[count], (int)x, (int)y, null);
            count++;
        }
    }
    public Explode(double x,double y) {
        this.x=x;
        this.y=y;
    }
    
}
package cn.sxt.game;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;

public class GameObject {
    Image img;
    double x,y;
    int speed;
    int width,height;
    public void drawMySelf(Graphics g) {
        g.drawImage(img, (int)x, (int)y, null);
        
    }
    
    public GameObject(Image img,double x,double y) {
        this.img=img;
        this.x=x;
        this.y=y;
        if(img!=null) {
            this.width=img.getWidth(null);
            this.height=img.getHeight(null);
        }
        
    }
    public GameObject(Image img,double x,double y,int speed ,int width,int height) {
        
        this.img=img;
        this.x=x;
        this.y=y;
        this.speed=speed;
        this.width=width;
        this.height=height;
        
    }
    public GameObject() {
        
    }
    //返回物體對(duì)應(yīng)的矩形區(qū)域眯娱,便于后續(xù)在碰撞檢測(cè)中使用
    public Rectangle getRect() {
        return new Rectangle((int)x,(int)y,width,height);
    }

}
package cn.sxt.game;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;


public class GameUtil {

    //工具類最好將構(gòu)造器私有化
    private GameUtil() {
        
    }
    public static Image getImage(String path) {
        BufferedImage bi=null;
        try {
            URL u=GameUtil.class.getClassLoader().getResource(path);
            bi=ImageIO.read(u);
        }catch(IOException e) {
            e.printStackTrace();
        }
        return bi;
    }
}

package cn.sxt.game;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowEvent;

import java.util.ArrayList;
import java.util.Date;

public class MyGameFrame extends Frame {
// 1.0增加計(jì)時(shí)功能
Date startTime = new Date();
Date endTime;

public void launchFrame() {
    // 游戲窗口打印標(biāo)題
    setTitle("GIP作品");
    // 設(shè)置窗口默認(rèn)可見
    setVisible(true);
    // 窗口大小高度500,寬度500
    setSize(500, 500);
    // 窗口左上角頂點(diǎn)坐標(biāo)位置
    setLocation(300, 300);
    // 初始化楣铁,生成一堆炮彈
    for (int i = 0; i < 50; i++) {
        Shell b = new Shell();
        shellList.add(b);
    }

    // 增加關(guān)閉窗口監(jiān)聽织阅,這樣當(dāng)用戶單擊右上角關(guān)閉按鈕時(shí)候,可以關(guān)閉游戲程序
    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);

        }

    });

    new PaintThread().start();
    addKeyListener(new KeyMonitor());

}

// 0.2版本paint方法畫圖形
/*
 * public void paint(Graphics g) { //從坐標(biāo)點(diǎn)(100,50)到(400唆迁,400)畫出直線 g.drawLine(100,
 * 50, 400, 400); //畫出矩形 矩形左上角頂點(diǎn)坐標(biāo)(100,500)寬度300 ,高度300 g.drawRect(100, 50, 300,
 * 300); //畫出橢圓 ,橢圓外切矩形為左上角頂點(diǎn)坐標(biāo)(100焊唬,50),寬度300,高度300 g.drawOval(100, 50, 300,300
 * ); }
 */
// 0.5版本前畫畫飛機(jī)方法
/*
 * Image bgImg=GameUtil.getImage("images/bg.jpg"); Image
 * planeImg=GameUtil.getImage("images/plane.png");
 * 
 * int planeX=200; int planeY=200; static int count =0;
 * 
 * public void paint(Graphics g) { g.drawImage(bgImg, 0, 0, null);
 * System.out.println("調(diào)用paint,重畫窗口,次數(shù):"+(count++)); g.drawImage(planeImg,
 * planeX, planeY, null); planeX+=3;
 * 
 * }
 */
// 飛機(jī)類封裝后 畫飛機(jī)方法
Image bgImg = GameUtil.getImage("images/bg.jpg");
Image planeImg = GameUtil.getImage("images/plane.png");
Plane plane = new Plane(planeImg, 300, 300, 5);

ArrayList<Shell> shellList = new ArrayList<Shell>();
// 創(chuàng)建爆炸對(duì)象
Explode bao;

public void paint(Graphics g) {
    g.drawImage(bgImg, 0, 0, null);
    // 畫飛機(jī)本身
    plane.drawMyself(g);
    // 畫出容器內(nèi)所有子彈
    for (int i = 0; i < shellList.size(); i++) {
        Shell b = shellList.get(i);
        b.draw(g);
        // 0.8版本增加碰撞檢測(cè)
        // 飛機(jī)和所有炮彈對(duì)象進(jìn)行矩形檢測(cè)
        boolean peng = b.getRect().intersects(plane.getRect());
        if (peng) {
            plane.live = false;
            endTime = new Date();
            if (bao == null) {
                bao = new Explode(plane.x, plane.y);
            }
            bao.draw(g);
        }
    }
    if (!plane.live) {
        if (endTime == null) {
            endTime = new Date();
        }
        int period = (int) ((endTime.getTime() -startTime.getTime()) / 1000);
        printInfo(g, "時(shí)間:" + period + "秒", 50, 120, 260, Color.white);
    }
}

public void printInfo(Graphics g, String str, int size, int x, int y, Color color) {
    Color c = g.getColor();
    g.setColor(color);
    Font f = new Font("宋體", Font.BOLD, size);
    g.setFont(f);
    g.drawString(str, x, y);
    g.setColor(c);
}

private Image offScreenImage = null;

public void update(Graphics g) {
    if (offScreenImage == null)
        offScreenImage = this.createImage(500, 500);// 游戲窗口的寬度和高度
    Graphics goff = offScreenImage.getGraphics();
    paint(goff);
    g.drawImage(offScreenImage, 0, 0, null);

}

// 0.4版本 增加內(nèi)部類 線程類
class PaintThread extends Thread {
    public void run() {
        while (true) {
            repaint();
            try {
                Thread.sleep(40);// 1s=1000
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

// 增加鍵盤監(jiān)聽內(nèi)部類
class KeyMonitor extends KeyAdapter {
    public void keyPressed(KeyEvent e) {
        plane.addDirection(e);
    }

    public void keyReleased(KeyEvent e) {
        plane.minusDirection(e);
    }
}

public static void main(String[] args) {
    MyGameFrame f = new MyGameFrame();
    f.launchFrame();

}

}

package cn.sxt.game;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;

public class Plane extends GameObject {

    boolean left, up, right, down;
    boolean live=true;

    public void addDirection(KeyEvent e) {
        switch (e.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            left = true;
            break;
        case KeyEvent.VK_UP:
            up = true;
            break;
        case KeyEvent.VK_RIGHT:
            right = true;
            break;
        case KeyEvent.VK_DOWN:
            down = true;
            break;

        }
    }

    // 松開上下左右建,則改變方向值
    // 例如,松開上建看靠,則e.getKeyCode()的值就是VK_up 那么置up=false
    public void minusDirection(KeyEvent e) {
        switch (e.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            left = false;
            break;
        case KeyEvent.VK_UP:
            up = false;
            break;
        case KeyEvent.VK_RIGHT:
            right = false;
            break;
        case KeyEvent.VK_DOWN:
            down = false;
            break;
        }
    }

    public void drawMyself(Graphics g) {
        if (live) {
            super.drawMySelf(g);
            if (left) {
                x -= speed;
            }
            if (right) {
                x += speed;
            }
            if (up) {
                y -= speed;
            }
            if (down) {
                y += speed;
            }
        }

    }

    public Plane(Image img, double x, double y, int speed) {
        super(img, x, y);
        this.speed = speed;
    }
}
package cn.sxt.game;

import java.awt.Color;
import java.awt.Graphics;

public class Shell extends GameObject {
    double degree;
    public Shell() {
        degree=Math.random()*Math.PI*2;
        x=200;
        y=200;
        width=10;
        height=10;
        speed=3;
        
    }
    public void draw(Graphics g) {
        //將外部傳入對(duì)象g的狀態(tài)保存好
        Color c=g.getColor();
        g.setColor(Color.red);
        g.fillOval((int)x, (int)y, width, height);
        //炮彈沿任意角度飛行
        x+=speed*Math.cos(degree);
        y+=speed*Math.sin(degree);
        //如下代碼用來實(shí)現(xiàn)碰到邊界赶促,炮彈反彈回來的效果
        if(y>500-height||y<30) {
            degree=-degree;
        }
        if(x<0||x>500-width) {
            degree=Math.PI-degree;
        }
        g.setColor(c);
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挟炬,隨后出現(xiàn)的幾起案子鸥滨,更是在濱河造成了極大的恐慌嗦哆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婿滓,死亡現(xiàn)場(chǎng)離奇詭異老速,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凸主,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門橘券,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卿吐,你說我怎么就攤上這事旁舰。” “怎么了嗡官?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵箭窜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我衍腥,道長(zhǎng)磺樱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任婆咸,我火速辦了婚禮竹捉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尚骄。我一直安慰自己活孩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布乖仇。 她就那樣靜靜地躺著憾儒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乃沙。 梳的紋絲不亂的頭發(fā)上起趾,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音警儒,去河邊找鬼训裆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜀铲,可吹牛的內(nèi)容都是我干的边琉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼记劝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼变姨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厌丑,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤定欧,失蹤者是張志新(化名)和其女友劉穎渔呵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砍鸠,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扩氢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爷辱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片录豺。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饭弓,靈堂內(nèi)的尸體忽然破棺而出双饥,到底是詐尸還是另有隱情,我是刑警寧澤示启,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布兢哭,位于F島的核電站领舰,受9級(jí)特大地震影響夫嗓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冲秽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一舍咖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锉桑,春花似錦排霉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至后裸,卻和暖如春瑰钮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背微驶。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工浪谴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人因苹。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓苟耻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親扶檐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凶杖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容