0

앱을 다시 시작하면 Homebutton을 눌러 작업 창에서 시작하거나 전체 화면을 실행하는 동안 디버그 할 때 검은 색으로 변합니다.실행 중 재시작 또는 디버그 후 캔버스가 검은 색입니다

이 내 MAINVIEW입니다 :

package net.kex.toll; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 


public class MainView extends SurfaceView implements SurfaceHolder.Callback{ 

public GameLoop gameLoop; 
public Player player; 
private int playerX = 50; 
private int playerY = 50; 

public MainView(final Context context) { 
    super(context); 
    getHolder().addCallback(this); 
    player = new Player(); 
    this.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      playerX = playerX + 20; 
      playerY = playerY + 20; 
      player.play(); 
      return false; 
     } 
    } 
    ); 
    setFocusable(true); 

} 


public void surfaceChanged(SurfaceHolder surfaceHolder, int foramt, int width, int height){ 

} 
public void surfaceDestroyed(SurfaceHolder surfaceHolder){ 
    boolean retry = true; 
    while (true) { 
     try { 
      gameLoop.setRunning(false); 
      gameLoop.join(); 
     } catch (Exception e) { e.printStackTrace();} 
     retry = false; 
    } 
} 
public void surfaceCreated(SurfaceHolder surfaceHolder){ 
    gameLoop = new GameLoop(getHolder(), this); 

    gameLoop.setRunning(true); 
    gameLoop.start(); 
} 
public void update(){ 
    player.update(); 
} 
public void draw(Canvas canvas){ 
    if(canvas == null) { 
     return; 
    } 
    canvas.drawColor(Color.WHITE); 
    player.draw(canvas); 
} 
} 

이 내 GameLoop입니다 :

package net.kex.toll; 

import android.graphics.Canvas; 
import android.util.Log; 
import android.view.SurfaceHolder; 


public class GameLoop extends Thread { 
public static final int MAX_FPS = 30; 
private double averageFPS; 
private MainView mainView; 
private SurfaceHolder surfaceHolder; 
private boolean running; 
public static Canvas canvas; 

public void setRunning(boolean running) { 
    this.running = running; 
} 

public GameLoop(SurfaceHolder surfaceHolder, MainView mainView) { 
    super(); 
    this.surfaceHolder = surfaceHolder; 
    this.mainView = mainView; 
} 

@Override 
public void run(){ 
    long startTime; 
    long timeMillis = 1000/MAX_FPS; 
    long waitTime; 
    long frameCount = 0; 
    long totalTime = 0; 
    long targetTime = 1000/MAX_FPS; 

    while (running) { 
     startTime = System.nanoTime(); 
     canvas = null; 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder) { 
       this.mainView.update(); 
       this.mainView.draw(canvas); 
      } 
     }catch (Exception e){ e.printStackTrace();} 
     finally { 
      if (canvas != null) { 
       try { 
        surfaceHolder.unlockCanvasAndPost(canvas); 
       }catch (Exception e){ e.printStackTrace();} 

      } 
     } 
     timeMillis = (System.nanoTime() - startTime)/1000000; 
     waitTime = targetTime - timeMillis; 
     try { 
      if (waitTime >= 0){ 
       this.sleep(waitTime); 
      } 
     }catch (Exception e){ e.printStackTrace();} 

     totalTime += System.nanoTime() - startTime; 
     frameCount++; 

     if (frameCount == MAX_FPS) { 
      averageFPS = 1000/((totalTime/frameCount)/1000000); 
      frameCount = 0; 
      totalTime = 0; 
      Log.i("GameLoop", "averageFPS: " + Double.toString(averageFPS)); 
     } 
    } 
} 

가}

어떻게 해야할지 모르겠어요! 다른 수업을 원하면 저에게 말해주세요. 나는 그것을 당신에게 보낼 것입니다!

저는 여기 앉아서이 문제를 몇 시간 동안 풀려고 노력합니다!

답변

0

개체를 다시 그리면 다시 렌더링됩니다. 예를 들어 onResume에서 Repaint()를 추가하십시오.

+0

Repaint()를 사용하면 무엇을 의미합니까? 한 가지 예를 보여줄 수 있습니까? – Ukex

+0

개체를 다시 그리려면 "Object.invalidate();"를 사용해야합니다. 그러나 "onDraw()"를 사용하는 것이 좋습니다. 'protected void onDraw (Canvas canvas) { super.onDraw (canvas); canvas.draw ....; } ' –

+0

죄송하지만, 무슨 뜻인지 이해가 안됩니다! 내가 맡아야 할 코드를 써주시겠습니까? – Ukex