2013-04-25 2 views
0

Я делаю простой игровой цикл для простой игры, но я вижу только экран в течение очень короткого момента. Кажется, что игровой цикл не работает. У меня есть логическое значение gameRunning, и хотя это значение TRUE, игровой цикл должен продолжать запускать метод run(), но он этого не делает! Я, должно быть, что-то пропустил, но не могу видеть своими глазами то, что я пропустил! Может ли кто-нибудь увидеть, что я пропустил, чтобы запустить этот цикл? Предоставьте некоторую помощь! Благодаря!Простой игровой цикл, который не зацикливается?

EDIT: Я добавил весь код для MainActivity, если это может иметь некоторую помощь

public class MainActivity extends Activity implements OnTouchListener { 

// Variables and references 
public static int screenWidth, screenHeight; 
public static float xTouch, yTouch; 
private GameLoop gameLoop; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.activity_main); 

    // Set screen to landscape 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    // Set screen to full screen 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    // Remove title from screen 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    // Get the width and height of the screen area 
    Display display = getWindowManager().getDefaultDisplay(); 
    screenWidth = display.getWidth(); 
    screenHeight = display.getHeight(); 

    // Create a new object of GameLoop and pass this context 
    gameLoop = new GameLoop(this); 
    gameLoop.setOnTouchListener(this); 
    setContentView(gameLoop); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    gameLoop.pause(); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    gameLoop.resume(); 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 
    xTouch = event.getX(); 
    yTouch = event.getY(); 

    switch (event.getAction()) { 

    case MotionEvent.ACTION_DOWN: 

     break; 

    case MotionEvent.ACTION_UP: 

     break; 

    case MotionEvent.ACTION_MOVE: 

     break; 
    } 

    // return false; 
    return true; // This gets the coordinates all the time 
} 
} 

И это код класса GameLoop:

public class GameLoop extends SurfaceView implements Runnable { 

    // Variables and references 
    private SurfaceHolder surfaceHolder; 
    private Canvas canvas; 
    private boolean gameRunning = false; 
    private Thread gameThread = null; 
    private Paint paint; 

    // Constructor 
    public GameLoop(Context context) { 
     super(context); 

     surfaceHolder = getHolder(); 

     // Create Paint object 
     paint = new Paint(); 
    } 

    public void pause() { 
     gameRunning = false; 
     while (true) { 
      try { 
       gameThread.join(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      break; 
     } 
     gameThread = null; 
     System.exit (0); 
    } 

    public void resume() { 
     gameRunning = true; 
     gameThread = new Thread(this); 
     gameThread.start(); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     while (gameRunning) { 
      if (!surfaceHolder.getSurface().isValid()) 
       continue; 

     canvas = surfaceHolder.lockCanvas(); 

     // Call method to draw objects on screen 
     drawObjects(canvas); 

     surfaceHolder.unlockCanvasAndPost(canvas); 
     } 
    } 

    // Method that draw everything on canvas 
    private void drawObjects(Canvas canvas) { 

     // Test 
     paint.setAntiAlias(true); 
     paint.setColor(Color.WHITE); 

     // Clear screen with black color 
     canvas.drawRGB(0, 0, 0); 

     // Draw a circle 
     canvas.drawCircle(100, 100, 100, paint);   
    } 
} 

ответ

0

Насколько я могу видеть вы никогда не запускаете нить, запускающую ваш gameLoop.

Так где вам нужно что-то вроде этого

Thread th = new Thread(gameLoop); 
th.start(); 

Удачи!

+0

Спасибо за ответ, но я делаю это в методе возобновления в классе GameLoop. Разве этого недостаточно !? –

+0

Ах, моя ошибка. Вы получаете что-нибудь в своем логарифме? – RandomSort

+0

Ошибок в logcat! –

Смежные вопросы