Android - перемещение одного изображения - PullRequest
1 голос
/ 04 марта 2011

Может кто-нибудь помочь, пожалуйста.

Я пишу небольшую игру для 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

Ответы [ 3 ]

0 голосов
/ 04 марта 2011

В вашем коде перемещения барьера вы не проверяете, касался ли конкретный барьер, поэтому вы перемещаете их все в одинаковые координаты.Следующий цикл делает то же самое, что и текущий код:

// 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

Затем вам необходимо убедиться, что вы отключили свойство touch в разделе ACTION_UP.Если вы опубликуете определение класса Barrier, я, вероятно, смогу помочь больше.

0 голосов
/ 04 марта 2011

Как уже указывалось, ваш код при обработке перемещения неверен, потому что он перемещает все барьеры в один и тот же X, Y, когда он должен перемещать только тот, к которому прикоснулись.

Кроме того, вы никогда не сбрасываете isTouched на объектах в действии вверх. Когда пользователь поднимает палец, вы должны установить их все на isTouched == false. Если вы этого не сделаете, то, коснувшись одного, он всегда будет перемещаться к X, Y.

0 голосов
/ 04 марта 2011

Я почти уверен, что вашу проблему можно решить, создав барьеры из трех отдельных объектов вместо массива.

...