1. 程式人生 > >基於java製作一個飛機小遊戲(學習心得)

基於java製作一個飛機小遊戲(學習心得)

emmm,第一篇部落格

   用了這麼久的csdn,都是在觀摩大佬們發帖,一隻小萌新瑟瑟發抖,不敢說話,甚
至連程式碼也不能完全讀懂。假期在b站自學(可以說是複習)了java課程,尚學堂的
2018版。連結如下:https://www.bilibili.com/video/av24496128/?p=101
   重新接觸java這門語言,感觸還是蠻多的,畢竟之前上課沒有好好聽講(emmm,希
望老師不逛我這裡)有好多的內容都處於空白狀態,這次學習呢,將這些應該懂的也弄
懂了一點。
   這篇主要是在學習了一個階段後,有一個設計小遊戲的教學,跟著視訊一步步來,
記錄一下我的學習過程,順便回顧一遍。(廢話真多,我才不說是為了試著用下博
客功能)

飛機躲避小遊戲

結果

這個專案非常簡單,達到的結果就是一隻飛機,在好多彈幕裡面苟且偷生,看能堅持幾秒。貼個圖:
結果圖

(你要問我飛機去哪裡了,圖中間有個炸掉的就是 )
好了接下來就讓我理一理思路

一,主類

第一步,把視窗先畫一下,要用到java裡的JFrame函式

“` java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Date;

import javax.swing.JFrame;

/**
* 遊戲主視窗
* @author 13958
*
*/

public class MyGameFarme extends JFrame {

Image bgimg = GameUtil.getImage("images/bg.png");
Image planeimg =GameUtil.getImage("images/plane.png");
//先載入圖片,在src中建立images資料夾,將圖片存在images下。
Plane plane =new Plane(planeimg,250,250);
//畫飛機,定義一個飛機類。
Shell[] shells =new Shell[50];
//畫炮彈,同樣一個炮彈類
Explode bao;
//定義一個爆炸效果的類,這裡先定義一個爆炸方法。
Date startTime=new Date();
Date endTime;
int period;
//設定Data類來進行計時,程式開始時startTime計時,死亡時endTime計時。

@Override
//重寫,可以右鍵->source->override快捷寫出此函式。
public void paint(Graphics g) {
    g.drawImage(bgimg, 0, 0, null);//畫背景
    plane.drawSelf(g);//畫飛機
    for(int i=0;i<shells.length;i++) {
        shells[i].draw(g);//利用一個數組畫炮彈,這裡設定50個。
        boolean peng =shells[i].getRect().intersects(plane.getRect());
        //利用getRect來判斷飛機和炮彈是否相交(圖片本質都是矩形)。
        if(peng) {//利用if語句來設定結果
            System.out.println("相撞了!");//為了在控制檯確定可以判斷相撞,可以刪掉的。
            plane.live=false;//呼叫飛機死亡方法。
            if(bao==null){ //呼叫爆炸方法
            bao=new Explode(plane.x,plane.y);

            endTime =new Date();//結束計時
            period=(int)((endTime.getTime()-startTime.getTime())/1000);//計算存活時間
            }


            bao.draw(g);//畫爆炸效果。
        }

        if(!plane.live) {
            g.setColor(Color.red);
            Font f=new Font("宋體",Font.BOLD,50);
            g.setFont(f);
            g.drawString("時間:"+period+"s", 100,100);
            //輸出結果圖,
        }
    }

}

class PaintThread extends Thread {//內部類,設定重畫


    @Override
    public void run() {

        while(true) {
            repaint();   //重畫 


            try {  
                Thread.sleep(40);//一般人眼為26幀,這就差不多
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }



        }

    }

}


class KeyMonitor extends KeyAdapter{
//設定鍵盤控制。

    @Override
    public void keyPressed(KeyEvent e) {
        plane.addDirection(e);//按下時方法

    }

    @Override
    public void keyReleased(KeyEvent e) {
       plane.minusDirection(e);//鬆開時方法

    }




}



/**
 * 初始化視窗
 */
public void launchFrame() {
    this.setTitle("ly出品");//設定標題

    this.setSize(Contant.GAME_WIDTH, Contant.GAME_HEIGHT);
    this.setLocation(40, 40);
    this.setVisible(true);
    //設定視窗屬性



    this.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
        System.exit(0);
        //設定關閉視窗事件
        }
    });

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

    for(int i=0;i<shells.length;i++) {
        shells[i]=new Shell();

    }


}




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

/**
 * 下面畫面緩衝,消除閃爍。
 */
private Image offScreenImage =null;
public void update(Graphics g) {
    if(offScreenImage==null) {
        offScreenImage=this.createImage(Contant.GAME_WIDTH,Contant.GAME_HEIGHT);
    }
    Graphics goff=offScreenImage.getGraphics();
    paint(goff);
    g.drawImage(offScreenImage, 0, 0, null);

}

}

二,根類

//因為飛機,子彈都有部分相似的屬性,所以寫一個父類,將共同屬性寫入。
“`java
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;

/**
* 物體屬性設定
* @author 13958
*
*/
public class GameObject {
Image img;
double x,y;
int speed;
int width,height;

 public void drawSelf(Graphics g) {
     g.drawImage(img, (int)x,(int) y, null);

 }



 public GameObject(Image img, double x, double y, int speed, int width, int height) {
    super();
    this.img = img;
    this.x = x;
    this.y = y;
    this.speed = speed;
    this.width = width;
    this.height = height;
}



public GameObject(Image img,double x,double y) {
     super();
     this.img=img;
     this.x=x;
     this.y=y;

 }
 public GameObject() {

 }
 /**
  * 返回物體所在矩形,碰撞檢測。
  * @return
  */
 public Rectangle getRect() {
     return new Rectangle((int)x,(int)y,width,height);
 }

}

三。飛機

“`java
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 drawSelf(Graphics g) {
     if(live) {

     g.drawImage(img, (int)x,(int) y, null);

     //設定飛機飛行公式
     if(left) {
         x-=speed;
     }
     else if(right) {
         x+=speed;
     }
     else if(up) {
         y-=speed;
     }
     else if(down) {
         y+=speed;
     }
     }
 }



 public Plane(Image img, double x,double y) {
     this.img=img;
     this.x=x;
     this.y=y;
     this.speed=5;
     this.width = img.getWidth(null);
     this.height= img.getHeight(null);
 }
 //將動作與鍵盤繫結
 public void addDirection(KeyEvent e) {
     switch(e.getKeyCode()) {
     case KeyEvent.VK_LEFT:
         left=true;
         break;
     case KeyEvent.VK_RIGHT:
         right=true;
         break;
     case KeyEvent.VK_UP:
         up=true;
         break;
     case KeyEvent.VK_DOWN:
         down=true;
         break;
     }
 }



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

}

四,子彈

“`java
import java.awt.Color;
import java.awt.Graphics;

public class Shell extends GameObject {

double degree;

public Shell() {
    x=200;
    y=200;
    width=10;
    height=10;
    speed =3;


    degree=Math.random()*Math.PI*2;

}

public void draw(Graphics g) {
    Color c=g.getColor();
    g.setColor(Color.YELLOW);

    g.fillOval((int)x, (int)y, width, height);
    //設定子彈飛行軌跡
    x+=speed*Math.cos(degree);
    y+=speed*Math.sin(degree);

    if(x<0||x>Contant.GAME_WIDTH-width) {
        degree=Math.PI-degree;
    }
    if(y<30||y>Contant.GAME_HEIGHT-height-30)
        degree =-degree;    

    g.setColor(c);
}

}

五讀取圖片

“`java
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class GameUtil {
private GameUtil() {

}
/**
 * 返回指定路徑圖片
 * @param path
 * @return
 */
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 com.ly.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/e”+(i+1)+”.png”);
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;
}

}

七 常量類

“`java

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/e”+(i+1)+”.png”);
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;
}

}
此次部落格主要做個人筆記用,請勿濫用。。()大佬們應該是看不上的。。