標籤:java
炮彈類設計
通過炮彈類的設計,我們可以更深入瞭解構造器的用法以及容器的用法。同時,可能還需要讀者稍微回憶一下初中數學曾學過的三角函數,這樣更能理解炮彈飛行路徑的計算原理。 當然,如果忘記這些知識了也沒關係,畢竟在實際開發中很少涉及數學原理性的內容。
炮彈類基本設計
炮彈類我們用實心的黃色橢圓實現,不再載入新的圖片。當然,大家課下可以自行找一些炮彈圖片亦可。
我們的邏輯是在視窗固定位置(200,200)處產生炮彈,炮彈方向是隨機的,並且遇到邊界會反彈。
【樣本1】Shell類
|
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){
//將外部傳入對象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(y>Constant.GAME_HEIGHT-height||y<30){
degree = -degree;
}
if(x<0||x>Constant.GAME_WIDTH-width){
degree = Math.PI-degree;
}
//返回給外部,變回以前的顏色
g.setColor(c);
}
}
|
炮彈任意角度飛行路徑
炮彈沿著任意角度飛行,核心代碼就兩行:
x += speed*Math.cos(degree);
y += speed*Math.sin(degree);
這裡實際用到了初中學的三角函數,通過cos/sin將任意角度分解到X軸、Y軸,從而可以精確的直到x、y座標的變化情況。初中三角函數忘了的童鞋,自行腦補。
650) this.width=650;" src="https://s4.51cto.com/wyfs02/M01/9D/9D/wKioL1mCydqSTjiAAAIydJ6TPXs717.png-wh_500x0-wm_3-wmp_4-s_1140717924.png" title="圖.png" alt="wKioL1mCydqSTjiAAAIydJ6TPXs717.png-wh_50" />
容器物件儲存多發炮彈
為了儲存多發炮彈,我們通過定義一個容器ArrayList來管理這些對象。在paint方法中遍曆容器中所有對象,並畫出這些炮彈。
【樣本2】MyGameFrame類:增加ArrayList
|
public class MyGameFrame extends Frame {
Image bgImg = GameUtil.getImage("images/bg.jpg");
Image planeImg = GameUtil.getImage("images/plane.png");
Plane plane = new Plane(planeImg,300,300,3);
ArrayList<Shell> shellList = new ArrayList<Shell>();
//paint方法作用是:畫出整個視窗及內部內容。被系統自動調用。
@Override
public void paint(Graphics g) {
g.drawImage(bgImg, 0, 0, null);
plane.drawMySelf(g); //畫出飛機本身
//畫出容器中所有的子彈
for(int i=0;i<shellList.size();i++){
Shell b = shellList.get(i);
b.draw(g);
}
}
//其餘代碼,和上個版本一致,限於篇幅,在此不顯示。
}
我們初始化50發炮彈,在視窗初始化方法launchFrame()中添加樣本13-20中的代碼。
【樣本3】添加炮彈
//初始化,產生一堆炮彈
for(int i=0;i<50;i++){
Shell b = new Shell();
shellList.add(b);
} |
運行MyGameFrame類,執行結果2所示:
650) this.width=650;" src="https://s1.51cto.com/wyfs02/M01/9D/9D/wKioL1mCyiWAqo5tAAGR0UVRs8w661.png-wh_500x0-wm_3-wmp_4-s_2486376127.png" title="圖2.png" alt="wKioL1mCyiWAqo5tAAGR0UVRs8w661.png-wh_50" />
我們可以看到圖2中產生了若干炮彈,遊戲視窗熱鬧了很多!大家可以舉一反三想一想,實際上,遊戲視窗中的多個怪物、多個汽車、多個飛機都是產生多個對象,使用容器來統一來管理的。
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發經驗,曾在神州數位、航天院某所研發中心從事軟體設計及研發工作,從小白逐漸做到工程師、進階工程師、架構師。精通Java平台軟體開發,精通JAVAEE,熟悉各種流行開發架構。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-資料庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從瞭解到實戰
E-Java進階架構精解
F-Linux和Hadoop
本文出自 “全棧Java筆記” 部落格,請務必保留此出處http://javanew.blog.51cto.com/12931675/1953324
13.6-全棧Java筆記:打飛機遊戲實戰項目|Shell|speed|launchFrame