2017-03-12 1 views
0

이것은 안드로이드로 작업 한 첫 작품이며, 스레드 내부에서 반복적으로 캔버스에 그리는 데 어려움을 겪고 있습니다. 스레드가 실행되고 있지만 그 스레드가 실행될 때마다 팝업 된 toast을 사용하여 실행 되었음에도 불구하고 한 번 그려지는 것처럼 보입니다.하지만 스레드가 실행 중이고 코드가 내부에서 실행 중이므로 제거했습니다. 실행됩니다, 그냥 일종의Android - 캔버스가 Runnable 내부에서 작동하지 않음

public class GameActivity extends Activity implements Runnable{ 
    ImageView gameView; 
    public int screenWidth, screenHeight, objectSize; 
    private static int FPS = 30; 
    private boolean rightPressed = false, leftPressed = false; 
    private Player player; 
    private Thread thread; 
    private Canvas canvas; 
    private Bitmap blankBitmap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     screenWidth = size.x; 
     screenHeight = size.y; 
     objectSize = screenWidth/8; 
     player = new Player(objectSize, screenWidth/2 - objectSize/2, screenHeight - (objectSize+10)); 

     blankBitmap = Bitmap.createBitmap(screenWidth,screenHeight,Bitmap.Config.ARGB_8888); 
     canvas = new Canvas(blankBitmap); 
     gameView = new ImageView(this); 
     gameView.setImageBitmap(blankBitmap); 
     draw(); 

     setContentView(gameView); 

     thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      leftPressed = true; 
      if((int)event.getX()<=screenWidth/2){ 
       leftPressed = true; 
       rightPressed = false; 
       Toast.makeText(this, "left", Toast.LENGTH_SHORT).show(); 
      } 
      if((int)event.getX()>screenWidth/2){ 
       rightPressed = true; 
       leftPressed = false; 
       Toast.makeText(this, "right", Toast.LENGTH_SHORT).show(); 
      } 
     } 
     if(event.getAction() == MotionEvent.ACTION_UP) { 
      rightPressed = false; 
      leftPressed = false; 
      Toast.makeText(this, "released", Toast.LENGTH_SHORT).show(); 
     } 

     return super.onTouchEvent(event); 
    } 

    public void draw(){ 
     canvas.drawColor(Color.argb(255, 255, 255, 255)); 
     player.draw(canvas); 
    } 

    @Override 
    public void run() { 
     while (!player.shouldDie()) { 
      try { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         if (!rightPressed && !leftPressed) player.setDx(0); 
         if(rightPressed) player.setDx(player.getSpeed()); 
         if(leftPressed) player.setDx(-player.getSpeed()); 
         player.update(); 
         draw(); 
        } 
       }); 
       Thread.sleep(1000/FPS); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

가 나는 또한 플레이어의 x가 실제로 변경 않는 것을 확인 ... 다시 그리기하지 않으며, 내가 수동으로 (100)을 좋아하는 DX를 설정하면 실제로 첫 번째 이동 않습니다 시간이 실행되지만, 스레드가 여전히 어쨌든

를 실행하지 나중에에도 불구하고, 여기에 Player.class

012,343,718,722,339,822,656입니다

누군가가 여기에 뭔가 잘못 생각한다면 나는 이것이 정말로 작동하지 않는 이유에 관해서 혼란 스러울만큼 도움이된다고 생각합니다. 특히 이것은 안드로이드로 작업 한 첫 번째 시간입니다.

+0

rePaint() 메소드를 호출하는 것을 잊은 것 같습니다. 안드로이드에는 inValidate()라는 캔버스를 다시 그리는 무언가가 있습니다. 플레이어 드로우 메서드 또는 액티비티 그린 메서드를 추가 할 수 있습니다. 그 트릭을해야합니다. – albeee

+0

예, 그 트릭을 했어! 고마워요 :) –

답변

0

rePaint() 메소드를 호출하는 것을 잊은 것 같습니다. Android에서는 캔버스를 다시 그리는 inValidate()라는 것이 있습니다. 플레이어 드로우 메서드 또는 액티비티 그린 메서드를 추가 할 수 있습니다. 그 트릭을해야합니다.

관련 문제