碰撞检测中的Java / Android的 [英] Collision detection in Java/Android

查看:165
本文介绍了碰撞检测中的Java / Android的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要检查碰撞检测在一场比赛(在code是下文)。我有一个游戏类中,我绘制位图,使得触摸事件,使一个数组列表,用于移动车辆。在汽车类,我带它的getter setter方法​​的位图和相同的青蛙类车辆。

我这是在所有四个方向移动青蛙。车辆水平移动。现在如果一个青蛙接触的车辆应该与它发生碰撞。我应该怎么做,通过测量高度和宽度来检查碰撞?

我的code是:

对于类游戏

 公共类游戏扩展了SurfaceView实现SurfaceHolder.Callback {
        私人青蛙青蛙;
        私人FrogControl FG;
        私人FrogControlY FG1;
        私人MainThread螺纹;
        //私家车VH;        ImageView的imgview =(ImageView的)findViewById(R.id.imageview);
        ImageView的imageArr [] =新ImageView的[20];
        INT ID [] = {R.drawable.audi_r8,R.drawable.bike,R.drawable.bus,R.drawable.car,
                    R.drawable.chrysler,R.drawable.cruise_bike};        ArrayList的<汽车与GT; VH =新的ArrayList<车辆与GT;();
        ArrayList的< VehicleReverse> VHS =新的ArrayList< VehicleReverse>();        公共游戏(上下文的背景下){
            超级(上下文);
                。getHolder()的addCallback(本);
                青蛙=新蛙(BitmapFactory.de codeResource(getResources(),R.drawable.frog),100,400);
                FG =新FrogControl(BitmapFactory.de codeResource(getResources(),R.drawable.arrow),250400);
                FG1 =新FrogControlY(BitmapFactory.de codeResource(getResources(),R.drawable.arrow),0,400);
                INT noOfCar =(int)的的Math.random()* 5;
                INT totalCar = 3 + noOfCar;
                对于(INT J = 0; J< totalCar; J ++){
                    INT Y =(INT)(的Math.random()* 3);
                    INT [] = LaneSelection {50150250};
                    INT y值= LaneSelection [Y];
                    INT X = 0;
                    vh.add(新车(BitmapFactory.de codeResource(getResources(),ID [Y])中,x,y值));
                }                为(中间体K = totalCar-1; K&大于0; k - ){
                    INT Y =(INT)(的Math.random()* 3);
                    INT [] = LaneSelection 100,200,300 {};
                    INT y值= LaneSelection [Y];
                    INT X = 300;
                    vhs.add(新VehicleReverse(BitmapFactory.de codeResource(getResources(),ID [Y])中,x,y值));
                }
                线程=新MainThread(getHolder(),这一点);
                setFocusable(真);
            }            @覆盖
            公共无效surfaceChanged(SurfaceHolder架,INT格式,宽度INT,
                                       INT高度){
                // TODO没有
            }            @覆盖
            公共无效surfaceCreated(SurfaceHolder持有人){
                thread.setRunning(真);
                thread.start();
            }            @覆盖
            公共无效surfaceDestroyed(SurfaceHolder持有人){
                布尔重试= TRUE;
                thread.setRunning(假);
                而(重试){
                    尝试{
                        的Thread.join();
                        重试= FALSE;
                    }赶上(例外五){                    }
                }
            }            @覆盖
            公共布尔onTouchEvent(MotionEvent事件){
                如果(event.getAction()== MotionEvent.ACTION_DOWN){
                // vh.carmove();
                    fg.handleAction((int)的event.getX(),(INT)event.getY());
                    fg1.handleActionY((int)的event.getX(),(INT)event.getY());
                    如果(fg.isTouched()){
                        //fg1.setTouchedY(false);
                        如果((int)的event.getX()≤(250+(fg.getX()/ 2))及及(frog.getX()大于0)){
                            frog.frogShiftLeft();
                        // fg1.setTouchedY(真);
                        }
                        如果((int)的event.getX()> =(250+(fg.getX()/ 2))及及(frog.getX()&所述; 300)){
                            frog.frogShiftRight();
                        }
                }
                    如果(fg1.isTouched()){
                        //fg.setTouched(false);
                        如果((int)的event.getY()≤(380+(fg1.getY()/ 2))及及(frog.getY()大于0)及及((int)的event.getX ()&小于100)){
                            frog.frogShiftUp();
                        // fg.setTouched(真);
                        }
                        if((int)event.getY()>=(380+(fg1.getY()/2))&&(frog.getY()<400)&&((int)event.getX()<100)){
                            frog.frogShiftDown();
                        }
                    }
                }                如果(event.getAction()== MotionEvent.ACTION_MOVE){}                如果(event.getAction()== MotionEvent.ACTION_UP){
                    如果(frog.isTouched()){
                        frog.setTouched(假);
                    }
                }
                返回true;
            }            公共无效渲染(帆布油画){
                canvas.drawColor(Color.BLACK);
                fg.draw(画布);
                fg1.draw(画布);
                frog.draw(画布);
                对于(INT J = 0; J&LT; vh.size(); J ++){
                //对于(中间体J = vh.size() - 1; J&大于0;的J - ){
                    车辆O = vh.get(J);
                    o.draw(画布);
                }
                对于(INT K = vhs.size() - 1; K&GT; 0; k - ){
                    VehicleReverse V = vhs.get(K);
                    v.draw(画布);
                }
            }
        }

有关青蛙类:

 进口android.graphics.Bitmap;
    进口android.graphics.Canvas;    公共类青蛙{
        私人BMP位图;
        私人诠释X;
        私人诠释Ÿ;
        私人布尔感动;        公共青蛙(位图位图,诠释的x,int y)对{
            this.bmp =位图;
            this.x = X;
            this.y = Y;
        }        公共位图getBmp(){
            返回BMP;
        }        公共无效setBmp(BMP位图){
            this.bmp = BMP;
        }        公众诠释的getX(){
            返回X;
        }        公共无效setX的(INT X){
            this.x = X;
        }        公众诠释的getY(){
            返回是;
        }        公共无效塞蒂(int y)对{
            this.y = Y;
        }        公共布尔isTouched(){
            返回感动;
        }        公共无效setTouched(布尔感动){
            this.touched =触及;
        }        公共无效画(油画画布){
        canvas.drawBitmap(BMP,X,Y,NULL);
        }        公共无效frogShiftRight(){
            this.x = this.x + 20;        }
        公共无效frogShiftLeft(){
            this.x = this.x-20;        }
        公共无效frogShiftUp(){
            this.y = this.y-20;        }
        公共无效frogShiftDown(){
            this.y = this.y + 20;        }
    }

对于车辆的类:

 公共类的车辆继承Thread实现Runnable {
        私人BMP位图;
        私有静态诠释X;
        私人诠释Ÿ;
        青蛙青蛙;
        车辆的车辆;        公共车辆(位图位图,诠释的x,int y)对{
            this.bmp =位图;
            this.x = X;
            this.y = Y;
        }        公共位图getBmp(){
            返回BMP;
        }        公共无效setBmp(BMP位图){
            this.bmp = BMP;
        }        公众诠释的getX(){
            返回X;
        }        公共无效setX的(INT X){
            this.x = X;
        }        公众诠释的getY(){
            返回是;
        }        公共无效塞蒂(int y)对{
            this.y = Y;
        }        公共无效carmove(){
            尝试{
                X = X + 5;
                如果(X GT; = 300){
                    X = -50;
                }
            }赶上(例外五){
                e.printStackTrace();
            }
            setX的(X);
        }        公共无效碰撞(){
            如果(frog.getX()&下; = X +的getX()及&放大器; frog.getY()&下; = Y +的getY()){
                Toast.makeText(getApplicationContext(),碰撞,Toast.LENGTH_SHORT).show();
            }
        }        私人语境getApplicationContext(){
            // TODO自动生成方法存根
            返回null;
        }        公共无效画(油画画布){
            canvas.drawBitmap(BMP,X,Y,NULL);
            carmove();
            碰撞();
        }
    }


解决方案

我知道它是什么样子的关于处理碰撞检测。如果你想在这里便宜的建议是:
这将2D游戏的工作。将每个对象设置为它的边界值一个矩形。
组矩形的x和y如左上方当前位置,然后将宽度的对象的宽度
设置高度作为对象的高度。做同样的事情与其他物体。

在矩形类有一个叫做方法相交或类似的东西。做rect1.isIntersecting(RECT2);
在更新的方法。
希望这有助于

I want to check collision detection in a game (the code is below). I have a game class in which I am drawing bitmaps, making touch events and make an array list for moving a vehicle. In the vehicle class, I'm taking its getter setter bitmaps and the same in the frog class as vehicle.

I have a frog which is moving in all four directions. The vehicle is moving horizontally. Now if a frog touches a vehicle it should collide with it. What should I do to check collision by measuring height and width?

My code is:

For class Game:

    public class Game extends SurfaceView implements SurfaceHolder.Callback  {
        private Frog frog;
        private FrogControl fg;
        private FrogControlY fg1;
        private MainThread thread;
        //private Vehicle vh;

        ImageView imgview = (ImageView)findViewById(R.id.imageview);
        ImageView imageArr[] = new ImageView[20];
        int id[] = {R.drawable.audi_r8,    R.drawable.bike, R.drawable.bus, R.drawable.car,
                    R.drawable.chrysler, R.drawable.cruise_bike};

        ArrayList<Vehicle> vh = new ArrayList<Vehicle>();
        ArrayList<VehicleReverse> vhs = new ArrayList<VehicleReverse>();

        public Game(Context context) {
            super(context);
                getHolder().addCallback(this);
                frog= new Frog(BitmapFactory.decodeResource(getResources(), R.drawable.frog),100,400);
                fg= new FrogControl(BitmapFactory.decodeResource(getResources(), R.drawable.arrow),250,400);
                fg1=new FrogControlY(BitmapFactory.decodeResource(getResources(), R.drawable.arrow),0,400);
                int noOfCar=(int)Math.random()*5;
                int totalCar=3+noOfCar;
                for(int j=0;j<totalCar; j++){
                    int y=(int)(Math.random()*3);
                    int[] LaneSelection  = {50,150,250};
                    int yValue=LaneSelection[y];
                    int x=0;
                    vh.add(new Vehicle(BitmapFactory.decodeResource(getResources(), id[y]),x,yValue));
                }

                for(int k=totalCar-1; k>0; k--){
                    int y=(int)(Math.random()*3);
                    int[] LaneSelection  = {100,200,300};
                    int yValue=LaneSelection[y];
                    int x=300;
                    vhs.add(new VehicleReverse(BitmapFactory.decodeResource(getResources(), id[y]),x,yValue));
                }
                thread=new MainThread(getHolder(),this);
                setFocusable(true);
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                       int height) {
                // TODO Nothing
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                thread.setRunning(true);
                thread.start();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry=true;
                thread.setRunning(false);
                while(retry){
                    try{
                        thread.join();
                        retry=false;
                    }catch(Exception e){

                    }
                }
            }

            @Override
            public boolean onTouchEvent(MotionEvent event){
                if(event.getAction()==MotionEvent.ACTION_DOWN){
                //    vh.carmove();
                    fg.handleAction((int)event.getX(), (int)event.getY());
                    fg1.handleActionY((int)event.getX(), (int)event.getY());
                    if(fg.isTouched()){
                        //fg1.setTouchedY(false);
                        if((int)event.getX()<(250+(fg.getX()/2))&& (frog.getX()>0)){
                            frog.frogShiftLeft();
                        //    fg1.setTouchedY(true);
                        }
                        if((int)event.getX()>=(250+(fg.getX()/2))&&(frog.getX()<300)){
                            frog.frogShiftRight();
                        }
                }
                    if(fg1.isTouched()){
                        //fg.setTouched(false);
                        if((int)event.getY()<(380+(fg1.getY()/2))&& (frog.getY()>0)&&((int)event.getX()<100)){
                            frog.frogShiftUp();
                        //    fg.setTouched(true);
                        }
                        if((int)event.getY()>=(380+(fg1.getY()/2))&&(frog.getY()<400)&&((int)event.getX()<100)){
                            frog.frogShiftDown();
                        }
                    }
                }

                if(event.getAction()==MotionEvent.ACTION_MOVE){}

                if(event.getAction()==MotionEvent.ACTION_UP){
                    if(frog.isTouched()){
                        frog.setTouched(false);
                    }
                }
                return true;
            }

            public void render(Canvas canvas){
                canvas.drawColor(Color.BLACK);
                fg.draw(canvas);
                fg1.draw(canvas);
                frog.draw(canvas);
                for(int j=0;j<vh.size();j++){
                //for(int j=vh.size()-1; j>0; j--){
                    Vehicle o=vh.get(j);
                    o.draw(canvas);
                }
                for(int k=vhs.size()-1; k>0; k--){
                    VehicleReverse v=vhs.get(k);
                    v.draw(canvas);
                }
            }
        }

For the Frog class:

    import android.graphics.Bitmap;
    import android.graphics.Canvas;

    public class Frog {
        private Bitmap bmp;
        private int x;
        private int y;
        private boolean touched;

        public Frog(Bitmap bitmap,int x,int y){
            this.bmp=bitmap;
            this.x=x;
            this.y=y;
        }

        public Bitmap getBmp() {
            return bmp;
        }

        public void setBmp(Bitmap bmp) {
            this.bmp = bmp;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

        public boolean isTouched(){
            return touched;
        }

        public void setTouched(boolean touched){
            this.touched=touched;
        }

        public void draw(Canvas canvas){
        canvas.drawBitmap(bmp, x, y,null);
        }

        public void frogShiftRight(){
            this.x=this.x+20;

        }
        public void frogShiftLeft(){
            this.x=this.x-20;

        }
        public void frogShiftUp(){
            this.y=this.y-20;

        }
        public void frogShiftDown(){
            this.y=this.y+20;

        }
    }

And for the Vehicle class:

    public class Vehicle extends Thread implements Runnable{
        private Bitmap bmp;
        private static int x;
        private int y;
        Frog frog;
        Vehicle vehicle;

        public Vehicle(Bitmap bitmap,int x,int y){
            this.bmp=bitmap;
            this.x=x;
            this.y=y;
        }

        public Bitmap getBmp() {
            return bmp;
        }

        public void setBmp(Bitmap bmp) {
            this.bmp = bmp;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

        public void carmove(){
            try {
                x = x + 5;
                if(x>=300){
                    x=-50;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            setX(x);
        }

        public void collision(){
            if(frog.getX() <= x + getX() && frog.getY() <= y + getY()){
                Toast.makeText(getApplicationContext(), "Collided", Toast.LENGTH_SHORT).show();
            }
        }

        private Context getApplicationContext() {
            // TODO Auto-generated method stub
            return null;
        }

        public void draw(Canvas canvas){
            canvas.drawBitmap(bmp, x, y,null);
            carmove();
            collision();
        }
    }

解决方案

I know what it is like about dealing with collision detection. If you want cheap advice here it is: This will work with 2d games. Set each object a Rectangle for its boundries. Set rectangle x and y as the top left positon and then the width the width of your object set the height as the height of your object. Do the same thing with the other objects.

In the rectangle class there is a method called intersect or something like that. Do rect1.isIntersecting(rect2); in the update method. Hope this helps

这篇关于碰撞检测中的Java / Android的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆