Collision Detection between two images in Java

前端 未结 9 1956
情歌与酒
情歌与酒 2020-11-27 06:53

I have two characters displayed in a game I am writing, the player and the enemy. defined as such:

public void player(Graphics g) {
    g.drawImage(plimg, x,         


        
9条回答
  •  旧时难觅i
    2020-11-27 07:30

    Here's the main class from my collision detection program.
    You can see it run at: http://www.youtube.com/watch?v=JIXhCvXgjsQ

    /**
     *
     * @author Tyler Griffin
     */
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.GraphicsDevice.*;
    import java.util.ArrayList;
    import java.awt.Graphics;
    import java.awt.geom.Line2D;
    
    
    public class collision extends JFrame implements KeyListener, MouseMotionListener, MouseListener
    {
        ArrayList everything=new ArrayList();
    
        int time=0, x, y, width, height, up=0, down=0, left=0, right=0, mouse1=0, mouse2=0;
        int mouseX, mouseY;
    
        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice screen = environment.getDefaultScreenDevice();
        DisplayMode displayMode = screen.getDisplayMode();
    
        //private BufferStrategy strategy;
    
        JLayeredPane pane = new JLayeredPane();
    
         tile Tile;
         circle Circle;
         rectangle Rectangle;
    
             textPane text;
    
        public collision()
        {
            setUndecorated(screen.isFullScreenSupported());
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
            setLayout(null);
            setResizable(false);
            screen.setFullScreenWindow(this);
    
    
            width=displayMode.getWidth();
            height=displayMode.getHeight();
    
    
              Circle=new circle(-(int)Math.round((double)height/7*2),-(int)Math.round((double)height/7*2),(int)Math.round((double)height/7*.85),this);
              Rectangle=new rectangle(-(int)Math.round((double)height/7*1.5),-(int)Math.round((double)height/7*1.5),(int)Math.round((double)height/7*1.5),(int)Math.round((double)height/7*1.5),this);
              Tile=Circle;
              Tile.move(mouseX-Tile.width/2, mouseY-Tile.height/2);
                      text=new textPane(0,0,width,height,this);
    
              everything.add(new circle((int)Math.round((double)width/100*75),(int)Math.round((double)height/100*15),(int)Math.round((double)width/100*10),this));
                      everything.add(new rectangle((int)Math.round((double)width/100*70),(int)Math.round((double)height/100*60),(int)Math.round((double)width/100*20),(int)Math.round((double)height/100*20),this));
                      //everything.add(new line(750,250,750,750,this));
                      /*everything.add(new line(width/700*419,height/700*68,width/700*495,height/700*345,this));
                      everything.add(new line(width/700*495,height/700*345,width/700*749,height/700*350,this));
                      everything.add(new line(width/700*749,height/700*350,width/700*549,height/700*519,this));
                      everything.add(new line(width/700*549,height/700*519,width/700*624,height/700*800,this));
                      everything.add(new line(width/700*624,height/700*800,width/700*419,height/700*638,this));
                      everything.add(new line(width/700*419,height/700*638,width/700*203,height/700*800,this));
                      everything.add(new line(width/700*203,height/700*800,width/700*279,height/700*519,this));
                      everything.add(new line(width/700*279,height/700*519,width/700*76,height/700*350,this));
                      everything.add(new line(width/700*76,height/700*350,width/700*333,height/700*345,this));
                      everything.add(new line(width/700*333,height/700*345,width/700*419,height/700*68,this));
    
                      everything.add(new line(width/950*419,height/700*68,width/950*624,height/700*800,this));
                      everything.add(new line(width/950*419,height/700*68,width/950*203,height/700*800,this));
                      everything.add(new line(width/950*76,height/700*350,width/950*624,height/700*800,this));
                      everything.add(new line(width/950*203,height/700*800,width/950*749,height/700*350,this));
                      everything.add(new rectangle(width/950*76,height/700*350,width/950*673,1,this));*/
    
                      everything.add(new line((int)Math.round((double)width/1350*419),(int)Math.round((double)height/1000*68),(int)Math.round((double)width/1350*624),(int)Math.round((double)height/1000*800),this));
                      everything.add(new line((int)Math.round((double)width/1350*419),(int)Math.round((double)height/1000*68),(int)Math.round((double)width/1350*203),(int)Math.round((double)height/1000*800),this));
                      everything.add(new line((int)Math.round((double)width/1350*76),(int)Math.round((double)height/1000*350),(int)Math.round((double)width/1350*624),(int)Math.round((double)height/1000*800),this));
                      everything.add(new line((int)Math.round((double)width/1350*203),(int)Math.round((double)height/1000*800),(int)Math.round((double)width/1350*749),(int)Math.round((double)height/1000*350),this));
                      everything.add(new rectangle((int)Math.round((double)width/1350*76),(int)Math.round((double)height/1000*350),(int)Math.round((double)width/1350*673),1,this));
    
    
            addKeyListener(this);
            addMouseMotionListener(this);
            addMouseListener(this);
        }
    
        public void keyReleased(KeyEvent e)
        {
            Object source=e.getSource();
    
            int released=e.getKeyCode();
    
            if (released==KeyEvent.VK_A){left=0;}
            if (released==KeyEvent.VK_W){up=0;}
            if (released==KeyEvent.VK_D){right=0;}
            if (released==KeyEvent.VK_S){down=0;}
        }//end keyReleased
    
    
        public void keyPressed(KeyEvent e)
        {
            Object source=e.getSource();
    
            int pressed=e.getKeyCode();
    
            if (pressed==KeyEvent.VK_A){left=1;}
            if (pressed==KeyEvent.VK_W){up=1;}
            if (pressed==KeyEvent.VK_D){right=1;}
            if (pressed==KeyEvent.VK_S){down=1;}
    
            if (pressed==KeyEvent.VK_PAUSE&&pressed==KeyEvent.VK_P)
            {
                //if (paused==0){paused=1;}
                //else paused=0;
            }
        }//end keyPressed
    
        public void keyTyped(KeyEvent e){}
    
    //***********************************************************************************************
    
        public void mouseDragged(MouseEvent e)
        {
            mouseX=(e.getX());
            mouseY=(e.getY());
    
              //run();
        }
    
        public void mouseMoved(MouseEvent e)
        {
            mouseX=(e.getX());
            mouseY=(e.getY());
    
              //run();
        }
    
    //***********************************************************************************************
    
        public void mousePressed(MouseEvent e)
        {
            if(e.getX()==0 && e.getY()==0){System.exit(0);}
    
        mouseX=(e.getX()+x);
            mouseY=(e.getY()+y);
    
            if(Tile instanceof circle)
            {
                    Circle.move(0-Circle.width, 0-Circle.height);
                    Circle.setBounds(Circle.x, Circle.y, Circle.width, Circle.height);
                    Tile=Rectangle;
            }
            else
            {
                    Rectangle.move(0-Rectangle.width, 0-Rectangle.height);
                    Rectangle.setBounds(Rectangle.x, Rectangle.y, Rectangle.width, Rectangle.height);
                    Tile=Circle;
            }
    
            Tile.move(mouseX-Tile.width/2, mouseY-Tile.height/2);
        }
    
        public void mouseReleased(MouseEvent e)
        {
             //run();
        }
    
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}
    
        public void mouseClicked(MouseEvent e){}
    
    //***********************************************************************************************
    
        public void run()//run collision detection
        {
            while (this == this)
            {
                Tile.move(Tile.x + ((mouseX - (Tile.x + (Tile.width / 2))) / 10), Tile.y + ((mouseY - (Tile.y + (Tile.height / 2))) / 10));
                //Tile.move((mouseX - Tile.width / 2), mouseY - (Tile.height / 2));
    
                for (int i = 0; i < everything.size(); i++)
                {
                    tile Temp = (tile) everything.get(i);
    
                    if (Temp.x < (Tile.x + Tile.width) && (Temp.x + Temp.width) > Tile.x && Temp.y < (Tile.y + Tile.height) && (Temp.y + Temp.height) > Tile.y)//rectangles collided
                    {
                        if (Temp instanceof rectangle)
                        {
                            if (Tile instanceof rectangle){rectangleRectangle(Temp);}
                            else {circleRectangle(Temp);}//Tile instanceof circle
                        }
                        else
                        {
                            if (Temp instanceof circle)
                            {
                                if (Tile instanceof rectangle) {rectangleCircle(Temp);}
                                else {circleCircle(Temp);}
                            }
                            else//line
                            {
                                if (Tile instanceof rectangle){rectangleLine(Temp);}
                                else{circleLine(Temp);}
                            }
                        }
                    }//end if
                }//end for
    
                try {Thread.sleep(16L);}
                catch (Exception e) {}
    
                Tile.setBounds(Tile.x, Tile.y, Tile.width, Tile.height);
                //Rectangle.setBounds(x, y, width, height);
                //Circle.setBounds(x, y, width, height);
                repaint();
    
                text.out=" ";
            }//end while loop
        }//end run
    
    //***************************************special collision detection/handling functions************************************************
    
        void rectangleRectangle(tile Temp)
        {
            int lapTop, lapBot, lapLeft, lapRight, small, scootX=0, scootY=0;
    
            lapTop=(Temp.y+Temp.height)-Tile.y;
            lapBot=(Tile.y+Tile.height)-Temp.y;
            lapLeft=(Temp.x+Temp.width)-Tile.x;
            lapRight=(Tile.x+Tile.width)-Temp.x;
    
            small=999999999;
    
            if (lapTop=Temp.x)||(Tile.y+Tile.height/2>=Temp.y && Tile.y+Tile.height/2<=Temp.y+Temp.height))
            {
                rectangleRectangle(Temp);
            }
            else//push from nearest corner
            {
                int x,y;
                if(Tile.x+Tile.width/2>Temp.x+Temp.width && Tile.y+Tile.height/2Temp.x+Temp.width && Tile.y+Tile.height/2>Temp.y+Temp.height){x=Temp.x+Temp.width; y=Temp.y+Temp.height;}
                else {x=Temp.x; y=Temp.y+Temp.height;}
    
                double distance = Math.sqrt(Math.pow(Tile.x+(Tile.width/2) - x, 2) + Math.pow(Tile.y+(Tile.height/2) - y, 2));
    
                if((int)Math.round(distance)=Tile.x)||(Temp.y+Temp.height/2>=Tile.y && Temp.y+Temp.height/2<=Tile.y+Tile.height))
            {
                rectangleRectangle(Temp);
            }
            else//push from nearest corner
            {
                int x,y;
                if(Temp.x+Temp.width/2>Tile.x+Tile.width && Temp.y+Temp.height/2Tile.x+Tile.width && Temp.y+Temp.height/2>Tile.y+Tile.height){x=Tile.x+Tile.width; y=Tile.y+Tile.height;}
                else {x=Tile.x; y=Tile.y+Tile.height;}
    
                double distance = Math.sqrt(Math.pow(Temp.x+(Temp.width/2) - x, 2) + Math.pow(Temp.y+(Temp.height/2) - y, 2));
    
                if((int)Math.round(distance)Tile.x+Tile.width && Temp.y+Temp.height/2Tile.x+Tile.width && Temp.y+Temp.height/2>Tile.y+Tile.height){Tile.move((Temp.x+Temp.width/2)-(int)Math.round(normX*((Temp.width/2)))-Tile.width,(Temp.y+Temp.height/2)-(int)Math.round(normY*((Temp.height/2)))-Tile.height);text.out="collision detected!";}
                    else {Tile.move((Temp.x+Temp.width/2)-(int)Math.round(normX*((Temp.width/2))),(Temp.y+Temp.height/2)-(int)Math.round(normY*((Temp.height/2)))-Tile.height);text.out="collision detected!";}
                }
            }
        }
    
    
    
    
        void circleCircle(tile Temp)
        {
            double distance = Math.sqrt(Math.pow((Tile.x+(Tile.width/2)) - (Temp.x+(Temp.width/2)),2) + Math.pow((Tile.y+(Tile.height/2)) - (Temp.y+(Temp.height/2)), 2));
    
            if((int)distance<(Tile.width/2+Temp.width/2))
            {
                            double normX = ((Tile.x+(Tile.width/2)) - (Temp.x+(Temp.width/2))) / distance;
                            double normY = ((Tile.y+(Tile.height/2)) - (Temp.y+(Temp.height/2))) / distance;
    
                Tile.move((Temp.x+(Temp.width/2))+(int)Math.round(normX*(Tile.width/2+Temp.width/2))-(Tile.width/2) , (Temp.y+(Temp.height/2))+(int)Math.round(normY*(Tile.height/2+Temp.height/2))-(Tile.height/2));text.out="collision detected!";
            }
        }
    
    
    
        void circleLine(tile Temp)
        {
                line Line=(line)Temp;
    
                if (Line.x1 < (Tile.x + Tile.width) && (Line.x1) > Tile.x && Line.y1 < (Tile.y + Tile.height) && Line.y1 > Tile.y)//circle may be hitting one of the end points
                {
                    rectangle rec=new rectangle(Line.x1, Line.y1, 1, 1, this);
                    circleRectangle(rec);
                    remove(rec);
                }
    
                if (Line.x2 < (Tile.x + Tile.width) && (Line.x2) > Tile.x && Line.y2 < (Tile.y + Tile.height) && Line.y2 > Tile.y)//circle may be hitting one of the end points
                {
                    rectangle rec=new rectangle(Line.x2, Line.y2, 1, 1, this);
                    circleRectangle(rec);
                    remove(rec);
                }
    
    
                int x1=0, y1=0, x2=Tile.x+(Tile.width/2), y2=Tile.y+(Tile.height/2);
    
                x1=Tile.x+(Tile.width/2)-Line.height;//(int)Math.round(Line.xNorm*1000);
                x2=Tile.x+(Tile.width/2)+Line.height;
                if(Line.posSlope)
                {
                    y1=Tile.y+(Tile.height/2)-Line.width;
                    y2=Tile.y+(Tile.height/2)+Line.width;
                }
                else
                {
                    y1=Tile.y+(Tile.height/2)+Line.width;
                    y2=Tile.y+(Tile.height/2)-Line.width;
                }
    
                Point point=intersection((double)x1,(double)y1,(double)x2,(double)y2,(double)Line.x1,(double)Line.y1,(double)Line.x2,(double)Line.y2);//find intersection
    
                if (point.x < (Line.x + Line.width) && point.x > Line.x && point.y < (Line.y + Line.height) && point.y > Line.y)//line intersects within line segment
                {
                    //if(point!=null){System.out.println(point.x+","+point.y);}
                    double distance = Math.sqrt(Math.pow((Tile.x+(Tile.width/2)) - point.x,2) + Math.pow((Tile.y+(Tile.width/2)) - point.y, 2));
    
                    if((int)distance Tile.x && Line.y1 < (Tile.y + Tile.height) && Line.y1 > Tile.y)//circle may be hitting one of the end points
                    {
                        rectangle rec=new rectangle(Line.x1, Line.y1, 1, 1, this);
                        rectangleRectangle(rec);
                        remove(rec);
                    }
    
                    if (Line.x2 < (Tile.x + Tile.width) && (Line.x2) > Tile.x && Line.y2 < (Tile.y + Tile.height) && Line.y2 > Tile.y)//circle may be hitting one of the end points
                    {
                        rectangle rec=new rectangle(Line.x2, Line.y2, 1, 1, this);
                        rectangleRectangle(rec);
                        remove(rec);
                    }
    
                    if(Line.posSlope)//positive sloped line
                    {
                        //first we'll do the top left corner
                        int x1=Tile.x-Line.height;
                        int x2=Tile.x+Line.height;
                        int y1=Tile.y-Line.width;
                        int y2=Tile.y+Line.width;
                        Point topPoint=new Point(-99,-99), botPoint=new Point(-99,-99);
                        double topDistance=0, botDistance=0;
    
                        topPoint=intersection((double)x1,(double)y1,(double)x2,(double)y2,(double)Line.x1,(double)Line.y1,(double)Line.x2,(double)Line.y2);//find intersection
    
                        topDistance = Math.sqrt(Math.pow(Tile.x - topPoint.x,2) + Math.pow(Tile.y - topPoint.y, 2));
    
                        //new let's do the bottom right corner
                        x1=Tile.x+Tile.width-Line.height;
                        x2=Tile.x+Tile.width+Line.height;
                        y1=Tile.y+Tile.height-Line.width;
                        y2=Tile.y+Tile.height+Line.width;
    
                        botPoint=intersection((double)x1,(double)y1,(double)x2,(double)y2,(double)Line.x1,(double)Line.y1,(double)Line.x2,(double)Line.y2);//find intersection
    
                        botDistance = Math.sqrt(Math.pow((Tile.x+Tile.width) - botPoint.x,2) + Math.pow((Tile.y+Tile.height) - botPoint.y, 2));
    
    
                        if(topDistance

提交回复
热议问题