2015-02-24 5 views
3

Я новичок в разработке игр, я пытаюсь разработать простую космическую игру и все работает отлично. теперь я хочу создать всплывающее окно Dialog, когда пользователь нажимает кнопку «Назад», и игра должна приостанавливаться до тех пор, пока пользователь не нажмет «возобновить». игра приостанавливается, но когда я нажмите кнопку Возобновить игру еще на паузу вот моя игра класс Loop:Как приостановить и приостановить поток в игре?

public class Game extends SurfaceView implements Runnable , SurfaceHolder.Callback { 

    public static MyPreferences pref; 
    public static Levels level; 
    public static int SCREEN_W; 
    public static int SCREEN_H; 
    public static boolean running; 
    private static Thread thread = null; 
    private SurfaceHolder holder; 
    private Canvas canvas; 
    private Paint p = new Paint(); 
    public static Handler handler = new Handler(); 
    public static Resources res; 
    public static Timer timer; 






    public Game(Context context) { 
     super(context); 
     res = getResources(); 
     holder = getHolder(); 
     holder.addCallback(this); 

     level = new Levels(); 
     timer = new Timer(); 
     pref = new MyPreferences(context); 
     System.out.println("Create Game instance"); 

    } 



    public void run() { 
     init(); 

     long lastTime = System.nanoTime(); 
     double delta = 0; 
     double ns = 1000000000.0/30.0; 

     System.out.println("Run method" + running); 
     while (running) { 
      System.out.println("+++++++++++++++++++++++++++++++++++"); 
      long now = System.nanoTime(); 
      delta+=(now - lastTime)/ns; 
      lastTime = now; 

      if(!holder.getSurface().isValid()){continue;} 

      canvas = holder.lockCanvas(); 
      SCREEN_W = canvas.getWidth(); 
      SCREEN_H= canvas.getHeight(); 

      while (delta >-1) { 
       tick(); 
       delta--; 
      } 

      level.level1(); 
      render(canvas); 
      holder.unlockCanvasAndPost(canvas); 


      if(ControlPanel.PLAYER_POWER <=0){ 
       System.out.println("Loose!"); 
       ControlPanel.PLAYER_POWER = 100; 
       stop(); 
       start(); 
      } 
     } 
    } 



    private void render(Canvas c) { 
     handler.render(c); 
     textOnScreen(c); 
    } 


    public void tick(){ 
     handler.tick(); 
    } 


    public void init(){ 
     System.out.println("Init game..."); 
     ControlPanel.COINS = pref.getInt("coins"); 
     MainActivity.music.backgroundMusic(); 
     handler.addSpaceShip(new Player(500, 500, 10, 10, handler, Sprite.getSprite(0))); 

//  handler.addKing(new King(Game.SCREEN_W/2, 100, 
//    40, 40, handler, Sprite.getSprite(18), 0)); 
    } 



    public void start() { 
     if(thread==null){ 
     System.out.println("Start thread"); 
     thread = new Thread(this); 
     thread.start();  

     timer.start(); 
     } 
     if(!running) running = true; 
     System.out.println("Running = " + running); 
    } 


    public static void stop() { 
     System.out.println("Stop thread"); 
     running = false; 
     timer.stop(); 
     pref.putInt("coins", ControlPanel.COINS); 
     System.out.println("Running = " + running); 
    } 






    public void destroyed() { 
     System.out.println("Stop"); 
     running = false; 
     try { 
      thread.join(300); 
      thread.interrupt(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 



    public void textOnScreen(Canvas c){ 
     p = new Paint(); 
     p.setColor(Color.YELLOW); 
     p.setTextSize(50); 
     c.drawText("POWER = " + ControlPanel.PLAYER_POWER, SCREEN_W/2 ,50 , p); 
     c.drawText("Time = " + timer.timeFormat(), 100 ,50 , p); 
     c.drawText("Coins = " + ControlPanel.COINS, 10 ,SCREEN_H - 10 , p); 
     p.setColor(Color.WHITE); 
     c.drawText("Bullets = " +ControlPanel.BULLET, SCREEN_W - 390,SCREEN_H - 10 , p); 
     p.setColor(Color.WHITE); 
     c.drawText(ControlPanel.Distance + " km ", SCREEN_W /2 - 200,SCREEN_H - 10 , p); 
    } 







    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
System.out.println("###surface created!"); 

    } 







    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     System.out.println("###surface Changed!"); 

    } 







    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     System.out.println("###surface Destroid!"); 

    } 
} 

и вот мой Dialog класс:

public class DialogPause extends Dialog implements android.view.View.OnClickListener{ 

    Button btn; 

    public DialogPause(Context context) { 
     super(context); 
     setContentView(R.layout.pause_game); 
     Game.running = false; 

     btn = (Button) findViewById(R.id.resume); 
     btn.setOnClickListener(this); 
    } 



    @Override 
    public void onClick(View v) { 
if(v.getId() == R.id.resume){ 
    Game.running = true; 

    this.dismiss(); 
} 
    } 
} 

и мой класс MainActivity:

Кстати, я хотел бы услышать больше мнений о моем коде цикла игры, которые я создал, потому что иногда я выхожу из игры, когда я выхожу из игры.

и как я могу использовать некоторую асинхронную игру, когда игра закончена, потому что она занимает 4 секунды до загрузки игры. Спасибо всем, кто мне помогает. Я очень ценю это!

+0

Предлагаю использовать игровой движок LibGDX. не изобретать велосипед. Это один из лучших игровых движков, которые я когда-либо видел для Android (Simple, Compact). Он имеет цикл рендеринга, поверхность рисования OpenGL и множество других замечательных функций. И выходы для нескольких платформ (Android, Windows, OSX, IOS, html). И для вопроса определите диалог внутри цикла. – Ali

+0

В «LibGDX» Там будут вещи, которые я не могу делать на Java? – Anna

+0

@Anna LibGDX - это API, который использует java (я думаю, вы также можете использовать SCALA). Все было бы одинаково, но были бы методы для вас (например, игровой цикл, игровые кадры, рисовать, спрайт-загрузчики и т. Д.). – Dando18

ответ

5

Добавить логическое значение paused и всякий раз, когда кнопка назад нажимается переключатель значения (paused = !paused;)

И в вас петлю перед вызовом клещ добавить условие:

if(!paused) tick(); 

Это лучше просто не путайте с нитью.

+0

Спасибо, но почему, когда я изменил «бег», это не сработало? – Anna

+0

@ Анна, изменяющая текущую переменную, приведет к завершению основного потока, а затем всех остальных потоков. В принципе программа закончится. – Dando18

+0

О, верно, спасибо большое! очень полезная информация! вы знаете что-то о моем другом вопросе? – Anna

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