基於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;
}
}
此次部落格主要做個人筆記用,請勿濫用。。()大佬們應該是看不上的。。