0

In my game I got the ball to fall straight down but I want to implement a collision method that detects when the ball touches the net, then deletes the ball and adds one point to my score. I dont know where to start and how to do this so any help is extremely appreciated. thank you.

Main activity.java

package com.example.admin.basketball;

import android.graphics.Point;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;

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




    //give points for getting ball through net






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

}

ActivityMain.xml

 <?xml version="1.0" encoding="utf-8"?>
<android.widget.RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/myLayout"
android:background="@drawable/bbackground"
tools:context="com.example.admin.basketball.MainActivity">

<ImageView
    android:id="@+id/net"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="70dp"
    app:srcCompat="@drawable/thenet"
    />

<ImageView
    android:id="@+id/ball"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_alignTop="@+id/score"
    android:layout_centerHorizontal="true"
    app:srcCompat="@drawable/theball" />

<TextView
    android:id="@+id/score"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginStart="11dp"
    android:layout_marginTop="11dp"
    android:textSize="25sp"
    android:textStyle="italic"
    android:textColor="@android:color/black"
    android:text="Score: 0" />
</android.widget.RelativeLayout>
  • "Don't know where to start" ==> I haven't tried anything *at all*. – ChiefTwoPencils Mar 13 '18 at 02:49
  • You can detect the intersection between two rectangles with the coordinates of the controls, that is, their position and size – Héctor M. Mar 13 '18 at 03:13
  • not that i didn't start, I have started and tried many times but whats the point of leaving code that doesn't work or make sense, would just make it harder on you. Thank you very much #useless – NBA MIXTAPE3 Mar 13 '18 at 03:21

2 Answers2

2

Collision detection?

Try with this ;-)

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
1

Look this

Pixel-Perfect Collision Detection Android

Detect collision of two images Collision Detection between two images in Java

https://www.youtube.com/watch?v=AL92LrbDNY0

https://www.youtube.com/watch?v=xdc_1Pf-jnA

You can detect the intersection between two rectangles with the coordinates of the controls, that is, their position and size

public boolean Collision(ImageView a, ImageView b)
{
  int[] AposXY = new int[2];
  a.getLocationOnScreen(AposXY);
  int AX = AposXY[0];
  int AY = AposXY[1];

  int[] BposXY = new int[2];
  b.getLocationOnScreen(BposXY);
  int BX = BposXY[0];
  int BY = BposXY[1];

   Rectangle ar = new Rectangle(AX, AY, a.getMeasuredWidth(), a.getMeasuredHeight());
   Rectangle br = new Rectangle(BX, BY, b.getMeasuredWidth(), b.getMeasuredHeight());

    // Assuming there is an intersect method, otherwise just handcompare the values
       // A Collision!
       // we know which enemy (e), so we can call e.DoCollision();
       //DoCollision();
       return ar.Intersects(br);
}
Community
  • 1
  • 1
Héctor M.
  • 2,302
  • 4
  • 17
  • 35