Android - 移动单个图像

时间:2011-03-03 22:41:37

标签: android image move

任何人都可以帮忙。

我正在编写一款小型Android游戏,玩家可以选择“屏障”并用手指将其拖动到屏幕上。我在屏幕上绘制了障碍,我可以在屏幕上拖动它。 然而我的问题是,当我添加超过1个障碍物,例如3个障碍物,并在屏幕上拖动障碍物时,它们全部拖动并且它们全部拖动到相同位置。也就是说,它们都是相互叠加的,看起来好像只有一个障碍。

这是我的代码,任何人都可以告诉我哪里出错了/解释我哪里出错了。

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

3 个答案:

答案 0 :(得分:0)

我非常确定你的问题可以通过使障碍成为三个独立的对象而不是数组来解决。

答案 1 :(得分: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类定义,我可能会提供更多帮助。

答案 2 :(得分:0)

正如已经指出的那样,处理移动的代码是错误的,因为当它只移动被触摸的那个时,它将所有障碍移动到相同的X,Y。

此外,您永远不会在Action up中的对象上重置isTouched。当用户抬起手指时,您应将其全部设置为isTouched == false。如果你不这样做,那么一旦你触摸它,它将始终移动到X,Y。