2012-07-20 37 views
0

我想創建一個基於2D遊戲框架的簡單遊戲,如2011年Apress書籍「Mario Zechner開始Android遊戲」所述。也許這有幫助,也許它不會,但是無論如何:SurfaceView和添加和刪除其他視圖

我只有一個活動的整個遊戲。一切都渲染到位圖上,然後發送到SurfaceView,發送到SurfaceView的內容將根據遊戲的屏幕而變化。

我想實現一個簡單的高分值系統,讓用戶在主菜單屏幕上輸入他們的名字到EditView中。我已經能夠將SurfaceView和EditView與RelativeLayout相結合,但是一旦用戶移過主菜單屏幕,問題就是擺脫了EditView。

還有很多這一類,但這裏的什麼,我覺得一個snipet是很重要的:

public abstract class AndroidGame extends Activity implements Game{ 
     public EditText et; 
     public RelativeLayout rl; 

     public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     et = new EditText(this); 
     renderView = new AndroidFastRenderView(this, frameBuffer); 

     rl = new RelativeLayout(this); 
     rl.addView(renderView); 
     rl.addView(et); 
     setContentView(rl); 
     } 
    } 

以上是遊戲唯一的活動。 AndroidFastRenderView類擴展了SurfaceView。我遇到的問題是,雖然我需要SurfaceView來貫穿整個遊戲,但我需要EditText只保留一小會兒,然後基於觸摸事件消失。

我嘗試從我的MainMenuScreen類中調用RelativeLayout.removeView(et),它負責構造發送給SurfaceView的位圖以及偵聽觸摸事件。但是我得到一個未捕獲的異常,說我無法編輯在另一個線程中定義的視圖。

我很抱歉這本小說,但我一直試圖解決這個問題,自己好幾個小時,沒有運氣。我覺得這是一件很簡單的事情,我只是沒有得到。任何幫助深表感謝!

回答

0

嗯......我想只有UI線程可以添加和刪除視圖。嘗試調用線程這樣的:

runOnUiThread(new Runnable(){ 
    public void run() { 
     /* STUFF To do in Thread */ 
     //Delete the view... 
     rl.removeView(et); 
}}); 

希望它能幫助:)

+0

你是說我做的是在我的活動的方法?我需要根據SurfaceView Thread中發生的事件移除該視圖。對不起,我基本上都是超級新手。 – dfitzgerald 2012-07-20 21:54:17

+0

正如我所看到的 renderView = new AndroidFastRenderView(this,frameBuffer); 您可以從視圖訪問活動,因此可能很容易在Surfaceview線上調用該功能。 (類似於Activity.runOnUiThread ...)。 您也可以在Activity類中創建一個完整的函數,並從SurfaceView線程中調用該func。 希望我解釋正確:) – charlypu 2012-07-20 21:58:37