Я создаю игру, и, поскольку я новичок в Android, я основал дизайн на примере Код LunarLander . В своей конструкции GameThread.doStart()
вызывается из GameActivity
, и поток затем запускает все из своего цикла GameThread.run()
, как показано ниже (большая часть кода была удалена для ясности):
public class GameActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
gameView = new GameView(this);
fl = new FrameLayout(this);
fl.addView(gameView);
setContentView(fl);
gameThread = gameView.getThread();
gameThread.doStart();
}
}
.
class GameThread extends Thread
{
public void doStart()
{
}
public void run()
{
while (running)
{
Canvas c = null;
try
{
c = mSurfaceHolder.lockCanvas();
// Use canvas
}
finally
{
}
}
}
}
Чтобы попытаться исправить некоторые проблемы, с которыми я столкнулся, я попытался передать больше контроля GameActivity, как показано ниже:
public class GameActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
gameView = new GameView(this);
fl = new FrameLayout(this);
fl.addView(gameView);
setContentView(fl);
gameThread = gameView.getThread();
while (gameThread.isRunning())
{
gameThread.run();
}
}
}
.
class GameThread extends Thread
{
public void doStart()
{
}
public void run()
{
Canvas c = null;
try
{
c = mSurfaceHolder.lockCanvas();
// Use canvas
}
finally
{
}
}
}
За исключением случаев, когда я это делаю, lockCanvas()
всегда возвращает ноль, и поэтому я не могу ничего рисовать на экране. Как я уже сказал, я все еще новичок в Android, поэтому я понятия не имею, почему второй случай не работает. Кто-нибудь знает, что происходит или почему это не работает?
РЕДАКТИРОВАТЬ : Из того, что я тестировал, поверхность никогда не создается. Во время GameView.onResume()
я ждал, пока поверхность не будет создана, прежде чем продолжать игру, но она ждала вечно. Почему первый экземпляр - единственный случай, когда поверхность создана?