【问题标题】:Intersect method not working, keeps returning true相交方法不起作用,一直返回 true
【发布时间】:2018-03-16 00:46:15
【问题描述】:

我的 intersect 方法不断返回 true 并将我的“分数文本”设置为在我的图像不碰撞时检测到相交,而是在模拟器启动时立即更改文本。如果需要更多代码,请通知我,并在 10 分钟内回来查看。谢谢! - 这是我的所有代码,碰撞代码从第 163 行开始,我的碰撞代码有问题,因为没有检测到碰撞,我应该如何修复我的碰撞代码。

这是我的代码:

public class MainActivity extends AppCompatActivity {



//Layout
private RelativeLayout myLayout = null;

//Screen Size
private int screenWidth;
private int screenHeight;

//Position
private float ballDownY;
private float ballDownX;

//Initialize Class
private Handler handler = new Handler();
private Timer timer = new Timer();

//Images
private ImageView net = null;
private ImageView ball = null;

//for net movement along x-axis
float x;
float y;

//points
private int points = 0;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.activity_main);
    myLayout = (RelativeLayout) findViewById(R.id.myLayout);

    //score
    TextView score = (TextView) findViewById(R.id.score);


    //imageviews
    net = (ImageView) findViewById(R.id.net);
    ball = (ImageView) findViewById(R.id.ball);




    //retrieving screen size
    WindowManager wm = getWindowManager();
    Display disp = wm.getDefaultDisplay();
    Point size = new Point();
    disp.getSize(size);
    screenWidth = size.x;
    screenHeight = size.y;

    //move to out of screen
    ball.setX(-80.0f);
    ball.setY(screenHeight + 80.0f);





    //start timer
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    changePos();
                }
            });
        }
    }, 0, 20);
}

public void changePos() {
    //down

    ballDownY += 10;
    if (ball.getY() > screenHeight) {
        ballDownX = (float) Math.floor((Math.random() * (screenWidth - 
ball.getWidth())));
        ballDownY = -100.0f;

    }
    ball.setY(ballDownY);
    ball.setX(ballDownX);




    /*INTERSECT METHOD
    Rect rc1 = new Rect();
    net.getDrawingRect(rc1);
    Rect rc2 = new Rect();
    ball.getDrawingRect(rc2);
    if (Rect.intersects(rc1, rc2)) {

    TextView score = (TextView) findViewById(R.id.score);
    score.setText("INTERSECT DETECTED");

    }*/




    //make net follow finger
    myLayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            MainActivity.this.x = event.getX();
            y = event.getY();

            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                net.setX(MainActivity.this.x);
                net.setY(y);



            }
            return true;
        }


    });

}


public boolean Collision(ImageView net, ImageView ball)
{
    Rect AR = new Rect();
    net.getHitRect(AR);
    Rect BR = new Rect();
    ball.getHitRect(BR);
    Render();
    return AR.intersect(BR) || AR.contains(BR) || BR.contains(AR);
}

public void Render()
{
    if(Collision(net, ball))
    {
        points++;
        TextView score = (TextView)findViewById(R.id.score);
        score.setText("Score:" + points);
    }
}



}

【问题讨论】:

  • 有很多方法可以做到这一点,最简单的方法是获取每个位图的边界 Rect,并在每个时间步使用 Rect.intersect() 方法检查碰撞。跨度>
  • 然后使用 if(Collision(net, ball))
  • 现在,查看我的帖子的最终结果
  • 我刚刚编辑了你的问题,现在试试吧
  • 为什么在布尔碰撞里面叫布尔碰撞?

标签: java android collision-detection collision intersection


【解决方案1】:

我已经修改了你的代码,现在试试

public class MainActivity extends AppCompatActivity 
{
   //Layout
   private RelativeLayout myLayout = null;

   //Screen Size
   private int screenWidth;
   private int screenHeight;

   //Position
   private float ballDownY;
   private float ballDownX;

   //Initialize Class
   private Handler handler = new Handler();
   private Timer timer = new Timer();

   //Images
   private ImageView net = null;
   private ImageView ball = null;
   
   //score
   private TextView score = null;

   //for net movement along x-axis
   public float x = 0;
   public float y = 0;

   //points
   private int points = 0;


   @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
         super.onCreate(savedInstanceState);

         this.setContentView(R.layout.activity_main);
         this.myLayout = (RelativeLayout) findViewById(R.id.myLayout);

         this.score = (TextView) findViewById(R.id.score);

         this.net = (ImageView) findViewById(R.id.net);
         this.ball = (ImageView) findViewById(R.id.ball);

         //retrieving screen size
         WindowManager wm = getWindowManager();
         Display disp = wm.getDefaultDisplay();
         Point size = new Point();
         disp.getSize(size);
         screenWidth = size.x;
         screenHeight = size.y;

         //move to out of screen
         this.ball.setX(-80.0f);
         this.ball.setY(screenHeight + 80.0f);
         
          //Error here
         /*//Run constantly
         new Handler().postDelayed(new Runnable()
         {
           @Override
           public void run()
           {
              Render();
           }
         }, 100); //100 is miliseconds interval than sleep this process, 1000 miliseconds is 1 second*/

     Thread t = new Thread() {
     @Override
     public void run() {
     try {
        while (!isInterrupted()) {
             Thread.sleep(100);
             runOnUiThread(new Runnable() {
             @Override
             public void run(){Render();}});}
             }catch (InterruptedException e) {}}};

     t.start();
         
    }

    public void Render()
    {
        changePos();
        if(Collision(net, ball))
        {
          points++; //You dont need findView Textview score for that exists in OnCreate Method
          this.score.setText("Score:" + points);
        }
    }

    public void changePos() 
    {
    
        //down
        ballDownY += 10;
        if (ball.getY() > screenHeight) {
        ballDownX = (float) Math.floor((Math.random() * (screenWidth - ball.getWidth())));
        ballDownY = -100.0f;

    }
    ball.setY(ballDownY);
    ball.setX(ballDownX);

      //make net follow finger
      myLayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            x = event.getX();
            y = event.getY();

            if (event.getAction() == MotionEvent.ACTION_MOVE) {
                net.setX(x);
                net.setY(y);
            }
            return true;
        }

    });

    public boolean Collision(ImageView net, ImageView ball)
    {
       Rect BallRect = new Rect();
       ball.getHitRect(BallRect);
       Rect NetRect = new Rect();
       net.getHitRect(NetRect);
       return BallRect.intersect(NetRect);
    }
}

【讨论】:

  • 哇,你真是太有才华了,除了第 126 行之外,一切看起来都很好----this.x----->无法解析符号,this.y 有同样的错误
  • 赫克托·曼努埃尔·马丁内斯·杜兰
  • @NBAMIXTAPE3,好的检查
  • @NBAMIXTAPE3 立即尝试
  • Héctor Manuel Martinez Durán 仍然不起作用,但我在 @override boolean Ontouch 上添加了公共花车,这似乎解决了问题,但现在 imageview 球不会从屏幕顶部,imageview 球甚至不在模拟器上
【解决方案2】:

类似这样的:

boolean collision = net.getRect().intersect(ball.getRect());

碰撞是一个布尔值

if(boolean) //Action

然后

if(collision) score.setText("INTERSECT DETECTED");

public boolean Collision(ImageView a, ImageView b)
{  
  Rect AR = new Rect();
  a.getHitRect(myViewRect);
  Rect BR = new Rect();
  b.getHitRect(otherViewRect1);
  return Rect.intersects(AR, BR);
}

--

if(Collision(net, ball))
{
   //Do action
}

--

ImageView ball = (ImageView) findViewById(R.id.Ball);
ImageView net = (ImageView) findViewById(R.id.Net);

if(Collision(net, ball))
{ 
   //Collision detected
}

--

import android.graphics.Rect;

public boolean Collision(ImageView ball, ImageView net)
{
Rect ballRect = new Rect();
ball.getDrawingRect(ballRect);
Rect netRect = new Rect();
net.getDrawingRect(netRect);
return Rect.intersects(ballRect, netRect);
}

查看此帖子how to detect when a ImageView is in collision with another ImageView?

【讨论】:

  • @NBAMIXTAPE3 嗯嗯,网和球是什么控制?
  • @NBAMIXTAPE3 ImageViews?
  • 我明白了,然后我将创建另一个方法,因为如果它们是图像,那么它们在图像视图中
  • 谢谢你让我真正接近解决这个问题
  • 查看我最近的编辑 hector,非常感谢您的辛勤工作
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多