2011-03-03 104 views
1

任何人都可以幫忙。Android - 移動單個圖像

我寫一個小的Android遊戲,玩家能夠選擇一個「屏障」,將其拖動進行的跨用他們的手指在屏幕上。我在屏幕上繪製了屏障,我可以在屏幕上拖動它。 然而,我的問題是,當我添加多於1個屏障(例如3個屏障),並在屏幕上拖動屏障時,它們都會拖動並拖動到同一位置。也就是說,他們全都躺在彼此的頂部,看起來好像只有1個障礙。

這裏是我的代碼,任何人都可以請告訴我,我錯了/解釋我要去的地方錯了。

public class MainGamePanel extends SurfaceView implements SurfaceHolder.Callback, SensorEventListener { 

// Initialising the Barrier 
private Barrier barrier[] = new Barrier[3]; 


// The Main Game Panel 
public MainGamePanel(Context context) { 
    super(context); 

// Adding a call-back (this) to the surfaceHolder to intercept events 
getHolder().addCallback(this); 

// Creating the Game items 
    // The starting coordinates of the Barrier 
int x = 30; 
int y = 270; 
barrier[0] = new Barrier(BitmapFactory.decodeResource(getResources(), R.drawable.blue_barrier), x, y); 
barrier[1] = new Barrier(BitmapFactory.decodeResource(getResources(), R.drawable.green_barrier), x + 15, y); 
barrier[2] = new Barrier(BitmapFactory.decodeResource(getResources(), R.drawable.pink_barrier), x + 30, y); 

// Create the Game Loop Thread 
thread = new MainThread(getHolder(), this); 

// Make the GamePanel focusable so it can handle events 
setFocusable(true); 
} 

// Handles the touch events 
public boolean onTouchEvent(MotionEvent event) 
{ 
     int eventAction = event.getAction(); 

    int x = (int)event.getX(); 
    int y = (int)event.getY(); 

    switch (eventAction) 
    { 
    // Touch down so check if finger is on Barrier 
    case MotionEvent.ACTION_DOWN: 
     if (x > barrier[0].getX() && x < barrier[0].getX() + 8 
       && y > barrier[0].getX() && y < barrier[0].getY() + 8) 
     { 
      barrier[0].isTouched(); 
     } 
     else if (x > barrier[1].getX() && x < barrier[1].getX() + 8 
       && y > barrier[1].getX() && y < barrier[1].getY() + 8) 
     { 
      barrier[1].isTouched(); 
     } 
     else if (x > barrier[2].getX() && x < barrier[2].getX() + 8 
       && y > barrier[2].getX() && y < barrier[2].getY() + 8) 
     { 
      barrier[2].isTouched(); 
     } 

     break; 

    // Touch-drag with the Barrier 
    case MotionEvent.ACTION_MOVE: 

    // Move the Barrier the same as the finger 
     for (int i = 0; i < barrier.length; i++) 
     { 
      if (barrier[i] == barrier[0]) 
      { 
       barrier[0].setX(x); 
       barrier[0].setY(y); 
      } // end if 
      else if (barrier[i] == barrier[1]) 
      { 
       barrier[1].setX(x); 
       barrier[1].setY(y); 
      } 
      else if (barrier[i] == barrier[2]) 
      { 
       barrier[2].setX(x); 
       barrier[2].setY(y); 

      } // end else if 
     } // end for 
     break; 

    case MotionEvent.ACTION_UP: 
     // Finger no longer on Barrier - Do Nothing 
     break; 
    } 
    return true; 
} 


// Render - Draws the Game Item Bitmaps to the screen 
public void render(Canvas canvas) 
{ 
    // Set the background to white 
    canvas.drawColor(Color.WHITE); 

    barrier[0].draw(canvas); 
    barrier[1].draw(canvas); 
    barrier[2].draw(canvas); 
} 


// Update 
// This is the Game's update method 
// It iterates through all the Objects and calls their update() methods (if they have one) 
public void update() 
{ 
} // end update 

回答

0

在你的屏障移動的代碼,你不檢查一個特定的屏障被觸摸,讓你在所有的人都移動到同一座標。下面的循環不完全一樣的東西作爲當前代碼:

// Move the Barrier the same as the finger 
for (int i = 0; i < barrier.length; i++) 
    { 
     barrier[i].setX(x); 
     barrier[i].setY(y); 
    } //end for 

要解決這個問題,你需要檢查,如果在迴路中的電流勢壘是被感動的人,並且可以改變整個循環的東西像:

// Move the Barrier the same as the finger 
for (int i = 0; i < barrier.length; i++) 
    { 
     if (barrier[i].isTouched()) 
     { 
      barrier[i].setX(x); 
      barrier[i].setY(y); 
     } // end if 
    } // end for 

你會那麼需要確保您未設置在ACTION_UP部分觸摸性能。如果您發佈Barrier類定義,我可能會幫助更多。

+0

嗨jozzas。好吧,我試過你的解決方案,但仍然沒有運氣某處我出錯了,仍然不知道在哪裏。也許它在我的Barrier類中。 IVE包括阻擋類這裏:\t \t} \t \t別的 \t \t { \t \t \t setTouched(假); \t \t} //結束還有 \t}} – heyred 2011-03-04 18:27:44

0

我敢肯定你的問題可以通過將障礙,而不是三個獨立的對象數組來解決。

+0

是的,我試過,但仍然有同樣的問題。我以我的智慧結束了這一切。 – heyred 2011-03-03 23:28:36

+0

這沒有意義......它們是3個類型的實例,只是存儲在一個數組中。這根本不會改變行爲。 – 2011-03-04 02:04:31

0

前面已經指出的那樣,你在處理移動代碼是錯誤的,因爲它會將所有壁壘相同的X,Y,當它應該只能移動被觸摸的一個。

而且,你永遠不會重置在操作了對象isTouched。當用戶擡起他們的手指時,你應該將他們全部設置爲isTouched == false。如果你不這樣做,那麼一旦你觸摸它,它總是會移動到X,Y。