一、專案主類:
1.ball(子彈);2.balllistener(監聽執行緒——暫廢棄);
3.config(相關配置);4.drawpanel(戰場類);
5.gamelistener(遊戲監聽)
6.plane(飛機);7.threadcontrol(程式總控制);
8.war_earth(主介面)
二、結構組成
本專案主要有兩大執行緒組成,乙個是子彈執行緒,另乙個則是飛機執行緒,其中每個執行緒又分為敵我兩個執行緒,每一種執行緒物件 對應不同的屬性資料。 由於執行緒任務分配的不規律性,所以 專案在執行時,採用邊執行,邊監聽的的模式,以達到準確的 對每個執行緒進行操作。
三、專案流程
1.相關配置,其中的配置主要有兩種,一種是用來存放執行緒物件的佇列,另一種就是上面提到的戰場類的物件,這是考慮到整個流程操作,戰場面板貫穿整個流程,所以把它歸為配置中。
2.完成主介面,介面主要包括兩部分,一是選單條——主要是對遊戲一些的說明,二是戰場面板——這是作戰的整個範圍,另外就是負責對我方飛機屬性的一些描述,整個介面採用邊界布局。
3.戰場類的的處理:由於無論是子彈執行緒,還是飛機執行緒,他們在執行時,各自的物件都是一直在不停地運動,所以需要不停地 重新整理介面,最終都要經過paint函式,所以在子彈執行緒和飛機執行緒中並不負責繪製各自物件,他們只是負責處理資料,整個的繪製都是通過借用佇列裡的資料在paint函式裡完成。
4.***,主要負責通過鍵盤獲得觸發時間資訊,完成對遊戲的操作,包括開始、暫停、繼續、結束,我方飛機的移動和發子彈。另外在***中還包含兩個計時器,乙個是負責敵方飛機的定時產生,另乙個則是負責對介面的定時重新整理。
5.飛機執行緒和子彈執行緒:發射子彈是飛機的乙個屬性,所以在飛機執行緒裡包含乙個定時發子彈的計時器,以負責子彈的發出。飛機的屬性包括生命值、被打爆後的經驗值以及速度方向,子彈的屬性主要包括傷害值和速度方向。另外每個執行緒都有控制自己單個執行緒結束與否的屬性。
6.整個執行緒的總開關,主要實現對整個程序的開始,暫停,繼續,結束,以及對資料的清空處理等操作.
四、主要問題:
1.panel 物件 warpanel 的大小設定,和畫布獲取?
分析:在整個專案的開始進行時,對物件的繪製是在各自的執行緒內部完成的,但由於靜態物件在所有物件建立之前被載入,
在遊戲***的構造器裡獲得通過warpanel獲得的畫筆是空的,但有一點暫時任然不明白,就是我在類drawpanel的構造器已經通過 setpreferredsize(new dimension(width, height)); 給物件設定了大小,但從其他類裡用getwidth()得到 的卻是0,令人費解,後來我又在上面的語句後加上 setsize(new dimension(width, height));這樣問題就解決了,但我不知是什麼原因,不知道是不是我把warpanel放在介面裡作為靜態物件處理的結果。希望某位大俠幫忙解決一下
2.監聽執行緒達不到一槍乙個的效果,直接導致無法計分?
分析:由於執行緒任務分配的不規律性,所以即使子彈打中對方,但並沒有立刻進行資料處理,而是等到分配到了再處理,所以果 斷捨棄監聽執行緒,採用邊監聽,邊執行的模式,具體就是在每個執行緒內部每執行一次就判斷一次,然後立刻處理
3.螢幕狂閃?
分析:由於每乙個執行緒物件移動一次 ,就要對整個螢幕進行重繪,加上每次重繪時資料也比較多,而且是整個螢幕重繪,所以程式需要
不斷地改變窗體中正在被繪製的圖象,造成繪製的緩慢,加劇了閃爍,概括一下就是螢幕的更新方法有問題,所以必須採用雙緩衝(原理見附錄);
4.飛機的定時產生,會有重疊?
分析:這也算是第二個問題的延續了,由於在飛機產生時位置是隨機產生的,所以並不能確保會不會有重疊,解決方法就是 加一句判斷語句,但這個問題我可是找了好久,特別是兩個敵方飛機完全重疊,完全以假亂真了
五、附錄
1. 雙緩衝技術的工作原理:先在記憶體中分配乙個和我們動畫視窗一樣大的空間(在記憶體中的空間我們是看不到的),然後利用getgraphics()方法去獲得雙緩衝畫筆,
接著利用雙緩衝畫筆給空間我們想畫的東西,最後將它全部一次性的顯示到我門的螢幕上.這樣在我門的動畫視窗上面是顯示出來就非常的流暢了.避免了上面的閃爍效果。
2. 雙緩衝的使用
它的執行過程是這樣的:repaint() 到update()再到paint(),而我們的雙緩衝**就寫在update()裡。
1)定義乙個graphics物件goff和乙個image物件offscreenimage。按螢幕大小建立乙個緩衝物件給offscreenimage。然後取得offscreenimage的graphics賦給goff。此處可以把goff理解為邏輯上的緩衝螢幕,而把offscreenimage理解為緩衝螢幕上的圖象。
2) 在goff(邏輯上的螢幕)上用paint(graphics g)函式繪製圖象。
3)將後台圖象offscreenimage全部一次性的繪製到我們的動畫視窗,然後把我們記憶體中分配的空間視窗關閉呼叫dispose()方法.
具體**如下:
image offscreenimage = null;
if (offscreenimage == null)
offscreenimage = createimage(block_size * cols, block_size * rows);
graphics goff = offscreenimage.getgraphics();
// 4.呼叫paint(),將緩衝圖象的畫筆傳入
paint(goff);
// 5.再將此緩衝影象一次性繪到代表螢幕的graphics物件,即該方法傳入的「g」上
g.drawimage(offscreenimage, 0, 0, null);
3、過載update(graphics g)實現雙緩衝:
這是比較傳統的做法。也是實際開發中比較常用的做法。
private image ibuffer;
private graphics gbuffer;
//過載paint(graphics scr)函式:
public void paint(graphics scr)
//過載update(graphics scr)函式:
public void update(graphics scr)
gbuffer.setcolor(getbackground());
gbuffer.fillrect(0,0,this.getsize().width,this.getsize().height);
paint(gbuffer);
scr.drawimage(ibuffer,0,0,this);
}
雨 個人專案設計分析
安靜的環境一定能讓我們更加迅速地進入睡眠嗎?並不見得,有時候,來一點恰當的 噪音 也許會幫助我們保證高質量的睡眠。很多人遇到下雨的夜晚,似乎我們比往常睡得更加香甜。相反的,安靜的房間,鐘錶的滴答聲,水龍頭的水滴聲,汽車的鳴笛聲。常常會讓正在酣睡的人們,懊惱不已。android studio等。效果圖...
前向星的總結
一般的模板 void addedge int u,int v 2.一般的資料 1 22 3 3 41 3 4 11 5 4 53.解析 edge 0 to 2 edge 0 next 1 head 1 0 edge 1 to 3 edge 1 next 1 head 2 1 edge 2 to 4 ...
雨刷問題及相關課程作業總結
雨刷問題及相關課程作業總結 近幾周學習內容,課程方面包括物件導向七大設計原則 雨刷問題 作業方面則包括pta,及實驗題,現對上述學習內容進行階段性總結如下。雨刷問題 由雨刷問題開始的七大設計原則 第一次雨刷1.0 課上給出了雨刷系統的基本運作模式,根據司機對控制桿,刻度盤的調節,改變雨刷的狀態 主要...