代码之家  ›  专栏  ›  技术社区  ›  MattMatt

碰撞矩形方法

  •  0
  • MattMatt  · 技术社区  · 11 年前

    我正试图移动 Bitmap 围绕屏幕 onTouch Rect 。当然,我不希望图像消失或离开屏幕,所以我为屏幕的每一侧、顶部和底部创建一个Rect。 A 我为我美丽的艺术品道歉。

    on触摸

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    
        int x = (int) event.getX();
        int y = (int) event.getY();
    
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
    
                // Left Key Touched
                if (x <= bLeftRect.right && x >= bLeftRect.left
                        && y >= bLeftRect.top && y <= bLeftRect.bottom) {
    
                    hero.setX(hero.getX() - tileDimen);
                    heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
                    if (heroRect.intersect(wallTopRect)) {
                        hero.setX(hero.getX() + tileDimen);
                    } else if (heroRect.intersect(wallLeftRect)) {
                        hero.setX(hero.getX() + tileDimen);
                    }
    
                    //etc....
    

    有没有更好的方法,因为我将有更多的对象需要碰撞矩形。我在想也许可以创造1个“周边” Rect公司 :

    //Right key touched
    if (perimeterRect.contains(heroRect)) {
                        hero.setX(hero.getX() + tileDimen);
                     } else {
                      //do nothing (collision) 
                     }
    

    这会是一个更好的方法吗?非常感谢您的任何建议/见解。

    谢谢

    马特

    1 回复  |  直到 11 年前
        1
  •  0
  •   MattMatt    11 年前

    想明白了: 检查heroRect是否在周长Rect内要简单得多 MotionEvent ,如果heroRect在周界内,则检查heroRect是否与其他物体碰撞 Rect s

    我的onTouch方法:

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    
        int x = (int) event.getX();
        int y = (int) event.getY();
    
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
    
                // Left Key Touched
                if (x <= bLeftRect.right && x >= bLeftRect.left
                        && y >= bLeftRect.top && y <= bLeftRect.bottom) {
    
                    hero.setX(hero.getX() - tileDimen);
                    heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
    
                    if (!(perimeterRect.contains(heroRect))) {
                        hero.setX(hero.getX() + tileDimen);
                        heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
                    } //else if hero collides with other Rects... {
                    // }
    
                    // Up Key Touched
                } else if (x <= bUpRect.right && x >= bUpRect.left
                        && y >= bUpRect.top && y <= bUpRect.bottom) {
    
                    hero.setY(hero.getY() - tileDimen);
                    heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
    
                    if (!(perimeterRect.contains(heroRect))) {
                        hero.setY(hero.getY() + tileDimen);
                        heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
                    } //else if hero collides with other Rects... {
                    // }
    
                    // Right Key Touched
                } else if (x <= bRightRect.right && x >= bRightRect.left
                        && y >= bRightRect.top && y <= bRightRect.bottom) {
    
                    hero.setX(hero.getX() + tileDimen);
                    heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
    
                    if (!(perimeterRect.contains(heroRect))) {
                        hero.setX(hero.getX() - tileDimen);
                        heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
                    } //else if hero collides with other Rects... {
                    // }
    
                    // Down Key Touched
                } else if (x <= bDownRect.right && x >= bDownRect.left
                        && y >= bDownRect.top && y <= bDownRect.bottom) {
    
                    hero.setY(hero.getY() + tileDimen);
                    heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
    
                    if (!(perimeterRect.contains(heroRect))) {
                        hero.setY(hero.getY() - tileDimen);
                        heroRect.set(hero.getX(), hero.getY(), hero.getX() + tileDimen, hero.getY() + tileDimen);
                    } //else if hero collides with other Rects... {
                    // }
    
                } else {
                    //button was not pressed, do nothing
                }
    
                break;
        }
        return true;
    }
    

    现在位图不会超过周长Rect:)

    After