標籤: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