AWT intersects()

KingOfExceptions

Bekanntes Mitglied
Hallo Community,

ich habe ein kleines Problem bezüglich der intersects() methode, da diese sagt, dass zwei sachen sich treffen, die sich aber nicht ansatzweise berühren.

Hier mal einige ausschnitte:

*Initialisierung:

Java:
	int a = 500;
	int s =500;
	
	Rectangle rect=new Rectangle(a,s,0,0);
        int mousex=0;
	int mousey=0;
        Line2D.Double line=new Line2D.Double(0,0,0,0);

*Veränderung der Koordinaten im Thread

Java:
	class Schleife implements Runnable 
	{
		public void run() 
		{
			while(true)
			{
				check();	//ZUR ERMITTLUNG DER EINGABEN DURCH TASTEN
				collision();
				frame.repaint();
				try{Thread.sleep(10);}catch (InterruptedException e){}
			}
			
		}
	}

*collision()

Java:
         public void collision()
	{		
		if(shoot)
		{
			Point mousep=MouseInfo.getPointerInfo().getLocation();
			
			mousex=mousep.x /2;
			mousey=mousep.y /2;
			
			line.setLine(rec.x+5, rec.y+5, mousex, mousey);
		}
		
		if(rect.intersectsLine(line));
		{
			System.out.println("TRUE");
		}
		
	}

*Veränderung der Koordinaten vom Rechteck in einem anderen Thread

Java:
	class KI implements Runnable 
	{
		public void run() 
		{
			while(true)
			{
				if(a>rec.x)
					a--;
				if(a<rec.x)
					a++;
				
				if(s>rec.y)
					s--;
				if(s<rec.y)
					s++;

				rect.setRect(a, s, 20, 20);
				
				try{Thread.sleep(100);}catch(Exception e){}
			}
		}
		
	}

wenn jemand sich den ganzen code angucken will dann hier:

Java:
public class BrickBreaker extends JPanel implements KeyListener, MouseListener
{
	private static final long serialVersionUID = 1L;
	JFrame frame;
	
	int a = 500;
	int s =500;
	
	Rectangle rect=new Rectangle(a,s,0,0);
	
	boolean up;
	boolean down;
	boolean left;
	boolean right;
	boolean shoot;
	
	public int x=5;
	public int y=5;
	
	int mousex=0;
	int mousey=0;
	
	int zeits=0;
	int zeitm=0;
	int zeith=0;
	
	Rectangle rec=new Rectangle(x,y,10,50);	
	
	Thread thread;
	Thread th;
	
	Line2D.Double line=new Line2D.Double(0,0,0,0);	
	
	public BrickBreaker (int w, int h)
	{		
		this.setPreferredSize(new Dimension(w,h));
		
		frame=new JFrame("Spiel");
		frame.setResizable(false);
		frame.setLocation(300,150);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.addKeyListener(this);
		frame.addMouseListener(this);
		
		frame.pack();
		
		thread=new Thread(new Schleife());
		thread.start();
		th=new Thread(new Time());
		th.start();
		
		frame.getContentPane().setBackground(Color.black);
		frame.setVisible(true);
	}	

	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2=(Graphics2D) g;
		
		g.drawRect(rec.x,rec.y,10,10);
		g.setColor(Color.blue);
		
		if(shoot)
			g2.draw(line);
		
		g.drawString("TIME:  "+(Integer.toString(zeith))+" : "+(Integer.toString(zeitm))+" : "+(Integer.toString(zeits)), 50, 10); //TIME AFFICHE
		
		g.drawRect(a, s, 20, 20);
		g.setColor(Color.blue);		

	}

	public static void main(String[]args) //Fenster
	{	
		new BrickBreaker(600,600);
	}
	
	public void keyPressed(KeyEvent e) 
	{
		if(e.getKeyCode()==KeyEvent.VK_UP)
			up=true;
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN)
			down=true;
		
		if(e.getKeyCode()==KeyEvent.VK_LEFT)
			left=true;
		
		if(e.getKeyCode()==KeyEvent.VK_RIGHT)
			right=true;		
	}
	public void keyReleased(KeyEvent e)
	{
		if(e.getKeyCode()==KeyEvent.VK_UP)
		{
			up=false;
		}
		
		
		if(e.getKeyCode()==KeyEvent.VK_DOWN)
		{
			down=false;
		}
		

		if(e.getKeyCode()==KeyEvent.VK_LEFT)
		{
			left=false;
		}
		
		if(e.getKeyCode()==KeyEvent.VK_RIGHT)
		{
			right=false;
		}
		
		
	}
	public void keyTyped(KeyEvent e)
	{
		
	}
	
	public void check() // MOVE POSITION IF KEY IS TYPED
	{	
		
		if(up)
		{
			if(rec.y!=0)
			{
				rec.y=rec.y-1;
			}
		}
		
		if(down)
		{
			if(rec.y<588)
			{
				rec.y=rec.y+1;		
			}
		}

		if(left)
		{
			if(rec.x!=0)
			{
				rec.x=rec.x-1;
			}
		}
		
		if(right)
		{
			if(rec.x<588)
			{
				rec.x=rec.x+1;
				
			}
		}

	}

	public void collision()
	{		
		if(shoot)
		{
			Point mousep=MouseInfo.getPointerInfo().getLocation();
			
			mousex=mousep.x /2;
			mousey=mousep.y /2;
			
			line.setLine(rec.x+5, rec.y+5, mousex, mousey);
		}
		
		if(rect.intersectsLine(line));
		{
			System.out.println("TRUE");
		}
		
	}
	
	class Schleife implements Runnable //MOVE 
	{
		public void run() 
		{
			while(true)
			{
				check();	
				collision();
				frame.repaint();
				try{Thread.sleep(10);}catch (InterruptedException e){}
			}
			
		}
	}
	
	class Time implements Runnable //TIME UPPER
	{
		public void run()
		{
			while(true)
			{
				zeits++;
				
				if(zeits % 60 == 0)
				{
					zeitm++;
					zeits=0;
					
					if(zeitm % 60 ==0)
					{
						zeith++;
						zeitm=0;
					}
				}
				
				if(zeits > 10)
					makeMonster();
				
				try {Thread.sleep(999);} catch (InterruptedException e) {e.printStackTrace();}
			}
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) 
	{
		
	}

	@Override
	public void mouseEntered(MouseEvent e) 
	{
		
	}

	@Override
	public void mouseExited(MouseEvent e) 
	{
		
	}

	public void mousePressed(MouseEvent e) 
	{
		shoot=true;
	}

	public void mouseReleased(MouseEvent e) 
	{
		shoot=false;
	}
	
	public void makeMonster()
	{	
		Thread threads=new Thread(new KI());
		threads.start();
	}
	
	class KI implements Runnable 
	{
		public void run() 
		{
			while(true)
			{
				if(a>rec.x)
					a--;
				if(a<rec.x)
					a++;
				
				if(s>rec.y)
					s--;
				if(s<rec.y)
					s++;

				rect.setRect(a, s, 20, 20);
				
				try{Thread.sleep(100);}catch(Exception e){}
			}
		}
		
	}
}

weiß jemand woran das problem liegt und hat einen lösungsvorschlag?
 

bERt0r

Top Contributor
Ich bin mir jetzt nicht 100% sicher, überprüf das mal:
Point mousep=MouseInfo.getPointerInfo().getLocation() gibt dir glaub ich die absolute Position der Maus auf dem Bildschirm an. Wenn dein Programm aber in einem Fenster läuft ist (0,0) in deinem Rechteck nicht gleich (0,0) deines Mauscursors.
 

KingOfExceptions

Bekanntes Mitglied
ok ich habs mal abgeändert:

Java:
	public void collision()
	{		
		if(shoot)
		{
			Point mousep=MouseInfo.getPointerInfo().getLocation();
			
			SwingUtilities.convertPointFromScreen(mousep, frame);
			
			mousex=mousep.x;
			mousey=mousep.y;
			
			line.setLine(rec.x+5, rec.y+5, mousex, mousey);
		}
		
		if(rect.intersectsLine(line));
		{
			System.out.println(rect.getBounds());
			System.out.println(line.getBounds());
		}
		
	}

und (ohne änderung):

Java:
	class KI implements Runnable 
	{
		public void run() 
		{
			while(true)
			{
				if(a>rec.x)
					a--;
				if(a<rec.x)
					a++;
				
				if(s>rec.y)
					s--;
				if(s<rec.y)
					s++;

				rect.setRect(a, s, 20, 20);
				
				try{Thread.sleep(100);}catch(Exception e){}
			}
		}
		
	}

und trotzdem wird ständig was ausgegeben, obwohl die linie gar nicht das rechteck berührt.... ;(

weiß jemand wieso und wie man das ändern könnte?
 

Marco13

Top Contributor
BEINAHE_EDIT: Das hier hatte ich eben schon geschrieben:
Hmja, von dem strukturfreien, hackigen und und gewagten Code-Wust mal abgesehen: DAS hier würde mich auch mal interessieren:
Java:
import java.awt.Rectangle;
import java.awt.geom.Line2D;

public class IntersectTest
{
    public static void main(String[]args) 
    {   
        Rectangle rect=new Rectangle(10,10,20,20);
        Line2D.Double line=new Line2D.Double(50,50,110,110);
    	System.out.println("Does      "+rect);
    	System.out.println("intersect "+line.getP1()+" "+line.getP2());
        if(rect.intersectsLine(line));
        {
            System.out.println("TRUE");
        }
    }
}

WTF? Hat da jemand eine Erklä

Dort fehlt noch das "rung dafür?" - aber da fiel mein Blick auf das Semikolon am Ende der Zeile mit dem 'if'. Nimm das mal weg.
 

Neue Themen


Oben