나는 게임을 만들고 있는데, 안드로이드를 처음 접했을 때 나는 LunarLander code이라는 예제를 기반으로 디자인을 했어. 설계에서 GameThread.doStart()
은 GameActivity
에서 호출되고, (코드의 많은 부분이 명확성을 위해 제거 된) 아래 그림과 같이 스레드는 다음의 GameThread.run()
루프에서 모든 것을 실행 :SurfaceHolder.lockCanvas() null을 반환 함
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();
}
}
}
합니다. 나는 lockCanvas()
는 항상 null을 반환하고, 따라서 나는 화면에 아무것도 그릴 수 없다고 할 때를 제외하고
class GameThread extends Thread
{
public void doStart()
{
}
public void run()
{
Canvas c = null;
try
{
c = mSurfaceHolder.lockCanvas();
// Use canvas
}
finally
{
}
}
}
. 내가 말했듯이 여전히 Android에 익숙하지 않으므로 두 번째 사례가 작동하지 않는 이유를 알 수 없습니다. 누구나 무슨 일이 일어나고 있는지, 왜 작동하지 않는지 알 수 있습니까?
편집 : 내가 테스트 한 것으로부터 표면이 생성되지 않습니다. GameView.onResume()
동안 나는 게임을 계속 진행하기 전에 서페이스가 생성되기를 기다렸지만 영원히 기다렸습니다. 첫 번째 인스턴스가 서페이스가 만들어진 유일한 경우는 어떻게됩니까?
은 당신이 제안하는 것은 내가 이미 뭘하는지입니다. 나는 그 코드를 보여주지 않았다. 네가 원한다면 나는 그것을 더할 것이다. –
나는 활동 멈춤에서 쓰레드를 종료하지 않는다. 쓰레드 루프가 어떤 메소드도 호출하지 않도록 부울 플래그를 설정한다. 다시 시작하면이 플래그를 다시 설정하고 애니메이션이 계속됩니다 ... 표면이 파괴되면 surfaceCreated에서 다음에 새 스레드를 만듭니다. – Lumis
표면이 생성되지 않으면이를 감지하고 활동을 다시 시작할 수 있습니다. – Lumis