Android - 移动单个图像

发布于 2024-10-20 05:27:22 字数 3436 浏览 5 评论 0原文

任何人都可以帮忙吗?

我正在编写一个小型 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

Can anyone help please.

Im writing a small Android game where the player is able to select a "barrier" and drag it accross the screen with their finger. I have the barriers drawn on the screen and I am able to drag it accross the screen.
My problem however is when I add more than 1 barrier, eg 3 barriers, and drag a barrier accross the screen, they all drag and they all drag to the same position. That is to say they all lie on top of each other, making it look as though there is only 1 barrier.

Here is my code, can anyone please tell me where I am going wrong/explain where I am going wrong.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

往昔成烟 2024-10-27 05:27:22

在您的障碍移动代码中,您没有检查特定障碍是否被触摸,因此您将所有障碍移动到相同的坐标。以下循环与您当前的代码执行完全相同的操作:

// 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 类定义,我可能可以提供更多帮助。

In your barrier move code, you aren't checking a particular barrier is touched, so you're moving all of them to the same coordinates. The following loop does exactly the same thing as your current code:

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

To fix this, you need to check if the current barrier in the loop is the one that was touched, and can change that whole loop to something like:

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

You would then need to make sure that you un-set the touched property in the ACTION_UP section. If you post your Barrier class definition I can probably help more.

心的位置 2024-10-27 05:27:22

我很确定您的问题可以通过将障碍设置为三个单独的对象而不是数组来解决。

I'm pretty sure your problem could be solved by making the barriers three separate objects instead of in an array.

末骤雨初歇 2024-10-27 05:27:22

正如已经指出的,您处理移动的代码是错误的,因为它将所有障碍移动到相同的 X,Y,而它应该只移动被触摸的障碍。

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

As already pointed out, your code in handling the move is wrong because it moves all the Barriers to the same X,Y when it should only move the one that is touched.

Also, you are never resetting the isTouched on the objects in the Action up. When the user lifts their finger you should set them all to isTouched == false. If you don't do that then once you touch one it will always move to the X,Y.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文