-3

My intersect method keeps returning true and setting my "score text" to intersect detected when my images do not collide, instead it changes the text as soon as the emulator starts. Please notify me if more code is needed and check back within 10 minutes. Thanks! -this is all my code and collision code starts at line 163, something is wrong with my collision code because collision isn't being detected, what should I do to fix my collision code.

here is my code:

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);
    }
}



}

2 Answers2

1

Something like this:

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

Collision is a boolean

if(boolean) //Action

Then

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

OR

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);
}

Check this post how to detect when a ImageView is in collision with another ImageView?

Héctor M.
  • 2,302
  • 4
  • 17
  • 35
1

I have reformed your code, try now

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);
    }
}
Community
  • 1
  • 1
Héctor M.
  • 2,302
  • 4
  • 17
  • 35