【问题标题】:Collision detection between ImageViewsImageView 之间的碰撞检测
【发布时间】:2018-08-23 15:42:00
【问题描述】:

我需要帮助让两个 ImageView 发生碰撞,我环顾了这个网站和许多 youtube 视频,并认为我找到了解决问题的方法。我从另一个人的帖子中找到了一些代码,

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

我只是想知道我应该将该代码放在我的程序中的哪个位置,因为当它位于底部时,我尝试 log.d 以显示我是否成功地尝试检测 imageViews 是否发生碰撞并且没有任何显示。无论如何,这是我的代码,我在另一个问题中使用的代码位于最底部并用作注释。非常感谢您的帮助,如果您帮助了我,谢谢!

Main.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;

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


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

}



/*
private boolean viewsOverlap(ImageView net, ImageView ball) {

    int[] net_coords = new int[2];
    net.getLocationOnScreen(net_coords);
    int net_w = net.getWidth();
    int net_h = net.getHeight();
    Rect net_rect = new Rect(net_coords[0], net_coords[1], net_coords[0] + 
net_w, net_coords[1] + net_h);

    int[] ball_coords = new int[2];
    ball.getLocationOnScreen(ball_coords);
    int ball_w = ball.getWidth();
    int ball_h = ball.getHeight();
    Rect ball_rect = new Rect(ball_coords[0], ball_coords[1], ball_coords[0] 
+ ball_w, ball_coords[1] + ball_h);

    return net_rect.intersect(ball_rect) || net_rect.contains(ball_rect) || 
ball_rect.contains(net_rect);

}*/

【问题讨论】:

    标签: java android collision-detection collision


    【解决方案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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      让我举个例子,我是如何仅在 10 行代码中实现有效的碰撞检测的。这不是完全相同的问题,但它可以让您了解如何根据坐标操作对象。

       // update the canvas in order to display the game action
          @Override
          public void onDraw(Canvas canvas) {
      
              super.onDraw(canvas);
              int xx = 200;
              int yy = 0;
              if (persons != null) {
                  synchronized (persons) {
                      Iterator<Person> iterate = persons.iterator();
                      while (iterate.hasNext()) {
                          Person p = iterate.next();
                          if (p.getImage() != 0) {
                              bitmap = BitmapFactory.decodeResource(getResources(), p.getImage()); //load a character image
                              // Draw the visible person's appearance
                              if(xx > canvas.getWidth())
                                  xx = 0;
                              canvas.drawBitmap(bitmap, xx , canvas.getHeight()- bitmap.getHeight() , null);
                              // Draw the name
                              Paint paint = new Paint();
                              paint.setStyle(Paint.Style.FILL);
                              canvas.save();
                              paint.setStrokeWidth(1);
                              paint.setColor(Color.WHITE);
                              paint.setTextSize(50);
                              canvas.drawText(p.name, (float)(xx+0.25*bitmap.getWidth()), (float) (canvas.getHeight() ), paint);
                              xx += bitmap.getWidth()*0.75;
                          }
                      }
                  }
              }
              canvas.save(); //Save the position of the canvas.
              canvas.restore();
              //Call the next frame.
              invalidate();
          }
      }
      

      在上面的代码中,我只是检查xx 是否与其他图像数组冲突,然后我只是相应地更新xx。欢迎您使用此代码查看我的open source repository

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-15
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多