2017-01-10 44 views
0

我正在研究一個小型的簡單遊戲,其中從頂部出來的障礙物有一個只能在x軸上移動的靜態球。當障礙物從頂部出來,用戶必須移動球以避免碰撞。如何在android遊戲中一個接一個地從y軸生成位圖

我一次放置3個移動障礙物,但我的問題是他們一起出來,即所有三個障礙物都具有相同的y軸值。我希望它以一定的距離一個接一個出來。

我該如何做到這一點。 這裏是我的GamePanel類:

public class GamePanel extends SurfaceView implements Runnable { 

    private Thread thread = null; 
    private Ball ball; 
    private SurfaceHolder surfaceHolder; 
    private Paint paint; 
    private Canvas canvas; 

    volatile boolean playing = true; 

    private int hurdleCount = 3; 
    private Hurdles[] hurdles; 

    private int screenX, screenY; 
    private Rect ball_detectCollision; 

    public GamePanel(Context context, final int screenX, final int screenY) { 
     super(context); 

     ball = new Ball(context, screenX, screenY); 
     surfaceHolder = getHolder(); 

     this.screenX = screenX; 
     this.screenY = screenY; 

     paint = new Paint(); 
     canvas = new Canvas(); 

     hurdles = new Hurdles[hurdleCount]; 
     for (int i = 0; i < hurdleCount; i++) { 
      hurdles[i] = new Hurdles(context, screenX, screenY); 
     } 

     ball_detectCollision = new Rect(ball.getBall_x(), ball.getBall_y(), ball.getBitmap().getWidth(), ball.getBitmap().getHeight()); 
     surfaceHolder.addCallback(new SurfaceHolder.Callback() { 

      @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"); 
       thread = new Thread(GamePanel.this); 
       thread.start(); 
      } 

      @Override 
      public void surfaceDestroyed(SurfaceHolder holder) { 

       System.out.println("Surface Destroyed"); 
      } 
     }); 
    } 


    private void draw() { 

     canvas = surfaceHolder.lockCanvas(); 
     canvas.drawColor(Color.RED); 
     canvas.drawBitmap(ball.getBitmap(), updatedValue, ball.getBall_y(), paint); 
     ball.setBall_x(updatedValue); 

     ball_detectCollision.left = ball.getBall_x(); 
     ball_detectCollision.top = screenY - ball.getBitmap().getHeight() - 260; 
     ball_detectCollision.right = ball.getBall_x() + ball.getBitmap().getWidth(); 
     ball_detectCollision.bottom = screenY - ball.getBitmap().getHeight() - 260 + ball.getBitmap().getHeight(); 

     for (int i = 0; i < hurdleCount; i++) { 
      canvas.drawBitmap(hurdles[i].getBitmap(), hurdles[i].getX(), hurdles[i].getY(), paint); 
     } 
     surfaceHolder.unlockCanvasAndPost(canvas); 
    } 

    @Override 
    public void run() { 

     while (playing) { 
      update(); 
      draw(); 
      control(); 
     } 
    } 

    private void update() { 

     for (int i = 0; i < hurdleCount; i++) { 
      hurdles[i].update(); 

      if (Rect.intersects(getBall_detectCollision(), hurdles[i].getDetectCollision())) { 
       System.out.println("Collision Detected"); 

       playing = false; 
       Handler handler = new Handler(Looper.getMainLooper()); 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         showGameOverMessage(); 

        } 
       }); 
      } 
     } 
    } 


    public void pause() { 

     playing = false; 
     try { 
      thread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

這是我的跨欄類

public class Hurdles { 

     private Bitmap bitmap; 
     private int x; 
     private int y; 
     private int speed = 20; 

     private int maxX; 
     private int minX; 

     private int maxY; 
     private int minY; 

     private Rect detectCollision; 

     public Hurdles(Context context, int screenX, int screenY) { 

      bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.hurdle); 
      maxX = screenX - bitmap.getWidth(); 
      maxY = screenY; 
      minX = 0; 
      minY = 0; 
      Random generator = new Random(); 
      detectCollision = new Rect(x, y, bitmap.getWidth(), bitmap.getHeight()); 

      x = generator.nextInt(maxX); 
      y = minY; 
     } 

     public void update() { 
      y += speed; 

      if (y > maxY - getBitmap().getHeight()) { 
       Random generator = new Random(); 
       y = minY; 
       x = generator.nextInt(maxX); 
      } 

      detectCollision.left = x; 
      detectCollision.right = x + bitmap.getWidth(); 
      detectCollision.top = y; 
      detectCollision.bottom = y + bitmap.getHeight(); 
     } 

回答

1

如果你想增加障礙之間的延遲/差距,你可以在你的GamePanel構造,如:

public GamePanel(Context context, final int screenX, final int screenY) { 
    super(context); 

    int gapBetweenHurdles = 100; 
    int gap = 0; 
    for (int i = 0; i < hurdleCount; i++) { 
     //(screenY - gap) will move your hurdle above the screen 
     hurdles[i] = new Hurdles(context, screenX, screenY - gap); 
     //increment the gap 
     gap += gapBetweenHurdles; 
    } 
...... 
} 

所以,欄間的差距爲100個像素,因爲我已經寫隨機。如果你想要特定的差距,你可以將gapBetweenHurdles設置爲屏幕高度的某個百分比。

編輯: 你必須初始XY位置傳遞給關構造函數,然後在跨欄類增量Y值和跨欄類,getY()應該返回Y的更新方法。

+0

當它穿過球對象 – AbhayBohra

+0

你的球對象在屏幕右下角時,它的工作但障礙消失? –

+0

號碼從屏幕底部向上移動 – AbhayBohra

0

嘗試改變這樣的代碼:

handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         showGameOverMessage(); 

        } 
       },timeOffsetInMillis); 

如果間隙可以是相同的,你可以設置timeOffsetInMillis = i * gapInMillis

相關問題