2013-10-17 27 views
1

我試圖創建一個簡單的遊戲循環(它不是真的遊戲呢),它顯示一個圓圈,然後在它觸發100次後繪製另一個圓圈。我也有一個文本字段,應該顯示循環運行了多少次。相關的代碼如下:Android遊戲循環似乎不起作用

MainActivity

public class MainActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
{ 
      super.onCreate(savedInstanceState); 
    DrawView v = new DrawView(this); 
    v.setBackgroundColor(Color.WHITE); 
      setContentView(v); 
    } 
} 

drawView函數

public class DrawView extends SurfaceView implements SurfaceHolder.Callback 
{ 
Paint p = new Paint(); 
MainThread thread; 
private int y=0; 

public DrawView(Context c) 
{ 
    super(c); 
    thread = new MainThread(this, getHolder()); 
    thread.running = true; 
    getHolder().addCallback(this); 
    setFocusable(true); 
} 

public void draw(Canvas c) 
{ 
    if(c==null) 
     return; 
    super.onDraw(c); 
    p.setColor(Color.RED); 
    p.setTextSize(32); 
    p.setTypeface(Typeface.SANS_SERIF); 
    c.drawCircle(getWidth()/2-100,getHeight()/2, 50, p); 
    c.drawText("y = " + y, 50, 50, p); 
    if(y==100) 
     c.drawCircle(getWidth()/2+100,getHeight()/2, 50, p); 
    else 
     y++; 
} 

public void surfaceCreated(SurfaceHolder p1) 
{ 
    thread.start(); 
} 

MainThread

public class MainThread extends Thread 
{ 
private DrawView page; 
private SurfaceHolder holder; 
public boolean running; 

public MainThread(DrawView p, SurfaceHolder h) 
{ 
    super(); 
    page = p; 
    holder = h; 
} 

@Override 
public void run() 
{ 
    while(running) 
    { 
     Canvas c = holder.lockCanvas(); 
     page.draw(c); 
     holder.unlockCanvasAndPost(c); 
    } 
} 

} 

它只是顯示第一圓和文本說 「Y = 2」。似乎沒有更新,或者它做了兩次,然後停止。我對Android編程不熟悉,但對Java不熟悉。我相信我只是想念一些簡單的東西。謝謝你的幫助。

編輯:經過進一步觀察,似乎線程隨機崩潰。每次運行應用程序時,它都會顯示「y =」,然後每次顯示不同的數字。我認爲這讓它在崩潰之前有很多滴答聲。關閉應用程序後,我收到一條消息,內容爲「不幸的是,MyApp已停止。」我對Android的工作原理知之甚少,不知道爲什麼它會崩潰。編輯2:我發現它拋出一個IllegalArgumentException在行holder.unlockCanvasAndPost(c)。再次,我不知道爲什麼。任何人都可以解釋發生了什麼以及如何解決它?

編輯3:記錄每個tick的y值顯示它正確地收起並在達到預期的100時停止。出於某種原因,屏幕上發生的事情並不能反映出來。

+0

歡迎來到Stack Exchange Family!我想指出的是,如果您詢問遊戲開發者可能會提供更好的答案的問題,您可以在Game Dev SE網站上詢問:http://gamedev.stackexchange.com/?as=1另外,你確定它正在循環?嘗試將'if(y == 100)'切換到'if(y%100 == 0)',這將測試y是否是100的倍數而不是僅當它是100時纔有可能。如果有問題與你的遊戲停止它可能是通過循環(其中y == 2)的第3或第4次迭代,這就是爲什麼它停在那裏。嘗試在調試模式下運行遊戲。 – sparks

+0

這似乎是什麼。我不知道爲什麼它停止。由於我正在使用AIDE在平板電腦上編寫此代碼,因此我不確定是否有某種調試模式。感謝關於遊戲開發網站的提示,我相信我會經常訪問那裏:) – WillDaBeast509

回答

0

我認爲你要找的是HandlerRunnable的組合。

處理程序調用運行一次的runnable,然後決定是否應該再次調用。

類似:

編輯: 沒有看到日誌的貓,我打算做一個假設,該UI更新從比主UI線程的線程上發生的事情,導致崩潰。

看看this,thisthis - 我認爲這些更符合您的要求。

+0

這似乎是一種解決方案的解決方法。我想知道爲什麼遊戲循環結構不起作用,因爲我打算將它用作我的應用程序的基礎。 – WillDaBeast509