2017-03-12 3 views
0

Ceci est ma première fois de travail avec Android, et j'ai du mal à dessiner sur une toile à plusieurs reprises dans un fil. Il semble qu'il ne soit dessiné qu'une seule fois, même si le thread est en cours d'exécution et que je me suis assuré d'utiliser un toast qui apparaissait chaque fois que le thread était exécuté (je l'ai supprimé car cela me dérangeait) mais le thread est en cours d'exécution est exécuté, il ne vient pas sorte de redessiner ...Android - dessin sur toile ne fonctionne pas à l'intérieur 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(); 
      } 
     } 
    } 
} 

J'ai aussi vérifié que le x du joueur ne change en fait, et si je mets manuellement le dx comme 100 il ne se déplace effectivement la première le temps est exécuté, mais plus tard, même si le fil est toujours en cours

De toute façon, voici le Player.class

public class Player { 

    private int health, size, x, y; 
    private double dx, speed; 
    private Paint paint; 

    public Player(int size, int x, int y){ 
     health = 3; 
     speed = 1; 
     dx = 0; 
     this.size = size; 
     this.x = x; 
     this.y = y; 

     paint = new Paint(); 
     paint.setColor(Color.argb(255, 26, 128, 182)); 
    } 

    public void draw(Canvas canvas){ 
     canvas.drawRect(x, y, x+size, y+size, paint); 
     } 

    public void update(){ 
     x += dx; 
    } 

    public void hurt(){ 
     health--; 
    } 

    public boolean shouldDie(){ 
     if(health<=0)return true; 
     return false; 
    } 
    public void posToast(Context context){ 
     Toast.makeText(context, "X: " + x, Toast.LENGTH_SHORT).show(); 
    } 

    public int getHealth() { 
     return health; 
    } 
    public void setHealth(int health) { 
     this.health = health; 
    } 
    public Paint getPaint() { 
     return paint; 
    } 
    public double getSpeed() { 
     return speed; 
    } 
    public void setSpeed(double speed) { 
     this.speed = speed; 
    } 
    public int getSize() { 
     return size; 
    } 
    public void setSize(int size) { 
     this.size = size; 
    } 
    public double getDx() { 
     return dx; 
    } 
    public void setDx(double dx) { 
     this.dx = dx; 
    } 
    public int getX() { 
     return x; 
    } 
    public void setX(int x) { 
     this.x = x; 
    } 
    public int getY() { 
     return y; 
    } 
    public void setY(int y) { 
     this.y = y; 
    } 
} 

Si quelqu'un voit quelque chose de mal ici j'apprécierais de l'aide car je suis vraiment confus quant à savoir pourquoi cela ne fonctionne pas, d'autant plus que c'est la première fois que je travaille avec Android.

+0

Semble que vous avez oublié d'appeler la méthode rePaint(). Dans android vous avez quelque chose appelé inValidate() qui redessine votre toile. Vous pouvez soit ajouter une méthode de tirage au sort ou une méthode de tirage d'activité. Cela devrait faire l'affaire. – albeee

+0

ouais, ça a fait l'affaire! Merci beaucoup :) –

Répondre

0

Semble que vous avez oublié d'appeler la méthode rePaint(). Dans Android, vous avez quelque chose appelé inValidate() qui redessine votre toile. Vous pouvez soit ajouter une méthode de tirage au sort ou une méthode de tirage d'activité. Cela devrait faire l'affaire.