如何阻止对象移出屏幕?

时间:2019-01-24 11:41:47

标签: java android

public class MovingBagView extends View {

    private Bitmap bag[] = new Bitmap[2];
    private int bagX;
    private int bagY = 1000;
    private int bagSpeed;
    private Boolean touch = false;
    private int canvasWidth, canvasHeight;
    private Bitmap backgroundImage;
    private Paint scorePaint = new Paint();
    private Bitmap life[] = new Bitmap[2];

    public MovingBagView(Context context) {
        super(context);
        bag[0] = BitmapFactory.decodeResource(getResources(), R.drawable.bag1);
        bag[1] = BitmapFactory.decodeResource(getResources(), R.drawable.bag2);
        backgroundImage = BitmapFactory.decodeResource(getResources(), R.drawable.background);
        scorePaint.setColor(Color.BLACK);
        scorePaint.setTextSize(40);
        scorePaint.setTypeface(Typeface.DEFAULT_BOLD);
        scorePaint.setAntiAlias(true);
        life[0] = BitmapFactory.decodeResource(getResources(), R.drawable.heart);
        life[1] = BitmapFactory.decodeResource(getResources(), R.drawable.heart_grey);
        bagX = 10;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvasWidth = canvas.getWidth();
        canvasHeight = canvas.getHeight();
        canvas.drawBitmap(backgroundImage, 0, 0, null);
        int minBagX = bag[0].getWidth();
        int maxBagX = canvasWidth - bag[0].getWidth() * 3;
        bagX = bagX + bagSpeed;
        if (bagX < minBagX) {
            bagX = minBagX;
        }
        if (bagX < maxBagX) {
            bagX = maxBagX;
        }
        bagSpeed = bagSpeed + 2;
        if (touch) {
            canvas.drawBitmap(bag[1], bagX, bagY, null);
        }
        else {
            canvas.drawBitmap(bag[0], bagX, bagY, null);
        }
        canvas.drawText("Score : ", 20, 60, scorePaint);
        canvas.drawBitmap(life[0], 500, 10, null);
        canvas.drawBitmap(life[0], 570, 10, null);
        canvas.drawBitmap(life[0], 640, 10, null);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            touch = true;
            bagSpeed = -12;
        }
        return true;
    }
}

我可以点击屏幕上的将该对象向左移动,而我点击的次数越多,它应该向左移动的越远。但是,问题在于该对象向右移动太多,并离开了屏幕。我希望它停在边缘,因此它仍在屏幕上可见。此外,对象位于屏幕的中央底部,如何将其放置在屏幕的左下角?您可以通过下面的GIF查看其工作原理。

game application

3 个答案:

答案 0 :(得分:2)

此条件永远不会应用于您提供的代码。它继续超过最大值。

if (bagX < maxBagX) {
       bagX = maxBagX;
   }

它应该像这样:

if (bagX >= maxBagX) {
       bagX = maxBagX;
   }

并且maxBagX值应为canvasWidth - bag[0].getWidth(),以便获得袋子本身的右边缘。 (除非您出于不同的原因使用了3次乘法,否则这应该是解决方案。)

答案 1 :(得分:0)

使用线性,相对或约束条件创建布局的对象,然后使用该对象使用

获取屏幕宽度
object.getWidth();

答案 2 :(得分:0)

我这样做了// // maintainoffscreen函数将保持不移出屏幕的路径,并返回true,否则,如果路径未与任何一侧碰撞,则将返回false,您可以通过设置来移动路径偏移量。

    private boolean maintainOffScreen(Path path, float px, float py){

    boolean done = true;
    RectF rectF = new RectF();
    path.computeBounds(rectF,true);
    float l = getPathWidth(path) - rectF.right;
    float r = getPathWidth(path) + rectF.left;
    float t = getPathHeight(path) - rectF.bottom;
    float b = getPathHeight(path)+ rectF.top;

    if(l < (-1) && r < getWidth() && b < getHeight() && t< (-1)){
        //if path does not collide to any side//you can move your path here as well
       //by setting Path.offset(px,py)
        done = false;
        offScreen = OffScreen.NOOFF; //im using these as enum according to my need, 
//as this is saving which side of screen collides

    }
    else if(l >= (-1)){
        path.offset(px+(l),py);
        offScreen = OffScreen.LEFT;
        offscrenn_xl = 1;
        done = true;

    }
    else if(r >= getWidth()){
        float s = getWidth() - r;
        path.offset(px+(s),py);
        offScreen = OffScreen.RIGHT;
        offscrenn_xr = s;
        done = true;
    }
    else if(b >= getHeight()){
        float s = getHeight() - b;
        path.offset(px,py+s);
        offScreen = OffScreen.BOTTOM;
        offscrenn_yb = s;
        done = true;
    }
    else if(t >= (-1)){
        path.offset(px,py+(t));
        offScreen = OffScreen.TOP;
        offscrenn_yt = t;
        done = true;
    }
    return done;
}

对px,py感到困惑?这是手指相对于路径的运动

`
final float px = event.getX() - this.startX;
final float py = event.getY() - this.startY;
if(!maintainOffScreen(path,px,py)){path.offset(px,py); }` //you should call
//this function here ,this will move your path to finger if there is no collision.
//and donot forgot to set the startx,and starty yo new positon like this
this.startX = event.getX();
this.startY = event.getY();