飛翔的🐦
- 1.前言
- 2.分析
- ①素材準備
- ②代碼構思
- 3.代碼實作及展示
- 4.心得分享
1.前言
首先,我先說一下這個專案,這個專案題材的來自牛客網的開源專案
我在這里做一個我自己在開發此專案的心得體會和經驗交流,并且帶領大家了解從0去入手一個專案的完整思路
這里是結果展示圖:



2.分析
①素材準備
在開發此專案之前,我們需要去先下載一些關于飛翔的小鳥素材圖片
小鳥的飛翔圖片
地面背景圖片
柱子圖片
以及開始結束圖片
那么這里我為大家提供百度網盤鏈接,大家需要可自行下載
鏈接:https://pan.baidu.com/s/12ww0HQ6KluVP-fcC40iXXQ
提取碼:zjd8
復制這段內容后打開百度網盤手機App,操作更方便哦
②代碼構思
本專案主要針對JAVASE剛學完想鞏固練習,卻沒有專案著手的同學,用的都是一些基礎性的知識
運用到的知識點:
1.面向物件:封裝繼承多型
2.陣列
3.常用類Math
4.swing組件:圖形界面工具
5.滑鼠監聽
6.IO流
7.多執行緒
邏輯步驟分析:
1.先實作視窗的制作,并且將背景圖放入視窗面板
2.設計地面類,實作游戲背景地面移動
3.設計柱子類,實作游戲背景柱子移動
4.設計小鳥類,在類中添加小鳥相關方法
初始化小鳥相關引數, 判斷小鳥是否碰撞柱子與地面
5.把小鳥放在面板中
6.滑鼠監聽控制小鳥飛行的軌跡
7.添加計分和游戲結束游戲開始的畫面
代碼分類:
由上述的分析,我們可以大致分析計劃創建4個類
1.小鳥類:設定小鳥引數,添加小鳥判斷方法
2.柱子類:設定柱子引數,添加柱子移動方法
3.地面類:設定地面引數,添加地面移動方法
4.測驗類:添加開始結束、滑鼠監聽等方法
3.代碼實作及展示
代碼中數學引數來自牛客網測驗
①小鳥類:
package FlyBirdGame;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
class Bird {
//圖片
BufferedImage image;
//位置
int x,y;
//寬,高
int width,height;
//大小
int size;
//重力加速度
double g;
//位移的間隔時間
double t;
//最初上拋速度
double v0;
//當前上拋速度
double speed;
//經過時間t后的位移
double s;
//小鳥的傾角
double alpha;
//一組圖片,記錄小鳥的影片幀
BufferedImage[] images;
//影片幀陣列的下標
int index;
//初始化小鳥
public Bird() throws Exception{
//初始化基本引數
image = ImageIO.read(new File("0.png"));
width = image.getWidth();
height = image.getHeight();
x=132;
y=280;
size =40;
//初始化位移引數
g=4;
v0=20;
t=0.25;
speed = v0;
s = 0;
alpha = 0;
//初始化影片幀引數
images = new BufferedImage[8];
for(int i = 0;i<8;i++){
images[i] = ImageIO.read(new File(i+".png"));
}
index = 0;
}
//飛行動作(變化一幀)
public void fly(){
index++;
image = images[(index/12)%8];
}
//移動一步
public void step(){
double v0 =speed;
//計算上拋運動位移
s=v0*t + g*t*t/2;
//計算小鳥的坐標位置
y=y-(int)s;
//計算下次移動速度
double v = v0 -g*t;
speed = v;
//計算傾角
alpha = Math.atan(s/8);
}
//向上飛翔
public void flappy(){
//重疊速度
speed =v0;
}
//檢查小鳥是否碰撞到地面
public boolean hit(Ground ground ){
boolean hit = y+size/2 > ground.y;
if(hit){
y = ground.y - size/2;
alpha = -3.14159265358979323 / 2;
}
return hit;
}
//檢查小鳥是否碰到柱子
public boolean hit(Column column){
//先檢測是否在柱子范圍內
if(x>column.x - column.width /2 - size /2
&& x<column.x + column.width/2 + size/2){
//檢查是否在柱子的縫隙種
if(y>column.y - column.gap/2 + size /2
&& y<column.y + column.gap /2 -size/2){
return false;
}
return true;
}
return false;
}
}
②地面類:
package FlyBirdGame;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
public class Ground {
//圖片
BufferedImage image;
//位置
int x,y;
//寬高
int width,height;
//初始化地面
public Ground() throws Exception {
image = ImageIO.read(new File("ground.png"));
width = image.getWidth();
height = image.getHeight();
x=0;
y=500;
}
//向左移動一步
public void step(){
x--;
if(x==-109){
x = 0;
}
}
}
③柱子類:
package FlyBirdGame;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;
public class Column {
//圖片
BufferedImage image;
//位置
int x,y;
//寬高
int width,height;
//柱子間縫隙
int gap;
//柱子間距離
int distance;
//亂數工具
Random random = new Random();
/**
* 初始化第n個柱子
*/
public Column(int n) throws Exception{
image = ImageIO.read(new File("column.png"));
width = image.getWidth();
height = image.getHeight();
gap = 144;
distance = 245;
x= 550 + (n-1) * distance;
y = random.nextInt(218)+132;
}
//向左移動一步
public void step(){
x--;
if(x==-width/2){
x = distance * 2 - width/2;
y = random.nextInt(218) + 132;
}
}
}
④測驗類:
package FlyBirdGame;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
public class BirdGame extends JPanel {
//背景圖片
BufferedImage background;
//開始圖片
BufferedImage startImage;
//結束圖片
BufferedImage gameOverImage;
//地面
Ground ground;
//柱子
Column column1,column2;
//小鳥
Bird bird;
//游戲分數
int score;
//游戲狀態
int state;
//狀態常量
public static final int START = 0;//開始
public static final int RUNNING = 1;//運行
public static final int GAME_OVER = 2;//結束
/**
* 初始化游戲
*/
public BirdGame() throws Exception{
//初始化
background = ImageIO.read(new File("bg.png"));
startImage = ImageIO.read(new File("start.png"));
gameOverImage = ImageIO.read(new File("gameover.png"));
//初始化地面,柱子,小鳥
ground = new Ground();
column1 = new Column(1);
column2 = new Column(2);
bird = new Bird();
//初始化分數
score = 0;
//初始化狀態
state = START;
}
/**
* 繪制界面
*/
public void paint(Graphics g){
//繪制背景
g.drawImage(background,0,0,null);
//繪制地面
g.drawImage(ground.image,ground.x,ground.y,null);
//繪制柱子
g.drawImage(column1.image,column1.x - column1.width/2,column1.y
-column1.height/2,null);
g.drawImage(column2.image,column2.x - column2.width/2,column2.y
-column2.height/2,null);
//繪制小鳥
Graphics2D g2 = (Graphics2D) g;
g2.rotate(-bird.alpha,bird.x,bird.y);
g2.drawImage(bird.image,bird.x-bird.width/2,bird.y-bird.height/2,null);
g2.rotate(bird.alpha,bird.x,bird.y);
//繪制分數
Font f = new Font(Font.SANS_SERIF,Font.BOLD,40);
g.setFont(f);
g.drawString(""+score,40,60);
g.setColor(Color.WHITE);
g.drawString(""+score,40-3,60-3);
//繪制開始和結束界面
switch (state) {
case START:
g.drawImage(startImage, 0, 0, null);
break;
case GAME_OVER:
g.drawImage(gameOverImage, 0, 0, null);
break;
}
}
// 開始游戲
public void action() throws Exception {
// 滑鼠監聽器
MouseListener l = new MouseAdapter() {
// 滑鼠按下事件
public void mousePressed(MouseEvent e) {
try {
switch (state) {
case START:
// 在開始狀態,按下滑鼠則轉為運行狀態,
state = RUNNING;
break;
case RUNNING:
// 在運行狀態,按下滑鼠則小鳥向上飛行,
bird.flappy();
break;
case GAME_OVER:
// 在結束狀態,按下滑鼠則重置資料,再次轉為開始態,
column1 = new Column(1);
column2 = new Column(2);
bird = new Bird();
score = 0;
state = START;
break;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
// 將監聽器添加到當前的面板上
addMouseListener(l);
// 不斷的移動與重繪
while (true) {
switch (state) {
case START:
// 小鳥做出飛行動作
bird.fly();
// 地面向左移動一步
ground.step();
break;
case RUNNING:
// 地面向左移動一步
ground.step();
// 柱子向左移動一步
column1.step();
column2.step();
// 小鳥做出飛行動作
bird.fly();
// 小鳥上下移動一步
bird.step();
// 計算分數
if (bird.x == column1.x || bird.x == column2.x) {
score++;
}
// 檢測是否發生碰撞
if (bird.hit(ground) || bird.hit(column1) || bird.hit(column2)) {
state = GAME_OVER;
}
break;
}
// 重新繪制界面
repaint();
// 休眠 1000/60 毫秒
Thread.sleep(1000 / 60);
}
}
/**
* 啟動方法
*/
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame();
BirdGame game = new BirdGame();
frame.add(game);
frame.setSize(440, 670);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
game.action();
}
}
4.心得分享
對于一些剛入門java的小伙伴來說,可能里面用到的一些方法,不是很熟悉
這里建議大家可以通過API查詢
可以學習了解一下swing、滑鼠監聽以及ImageIO等代碼中涉及到的知識
幫助大家順利完成本次的小專案!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/232530.html
標籤:其他
上一篇:高精度【學習記錄】
