intersectsLine

KingOfExceptions

Bekanntes Mitglied
Hallo,

ich habe ein problem mit der methode intersectsLine() :
Java:
 	private void abfrage() 
	{
		while(true)
		{
			eingesammelt=rec.intersects(rectangle);
			barriere = rec.intersectsLine(bar);
		
			if(eingesammelt==true)
			{
				laufen=false;
			}
		
			if(barriere)
			{
				down=false;
				up=false;
			}
		}
			
	}

dies wird von einem separaten thread ausgeführt:

Java:
                else
		{
			while(eingesammelt==false)
			{
				abfrage();
			}
			
			
		}

Java:
	double x1=20;
	double x2=40;
	double y1=1000;
	double y2=40;
	
	Point2D.Double pt1=new Point2D.Double(x1, y1);
	Point2D.Double pt2=new Point2D.Double(x2, y2);
	
	Line2D.Double bar=new Line2D.Double(pt1,pt2);

hier oben wird die linie(und die punkte) initialisiert

Java:
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g.setColor(Color.green);
		g.fillRect(50, 50, 20, 20);
		
		g.setColor(Color.blue);
		g.fillRect(rec.x, rec.y, 10, 10);
		
		g.setColor(Color.red);
		g2.draw(new Line2D.Double(pt1,pt2));
		
	}

zur sicherheit auch mal die paintComponent methode.


Java:
public void levelInfos()
	{
		if(level==1)
		{
			pt1.x=20;
			pt1.y=40;
			pt2.x=1000;
			pt2.y=40;
			
		}
		else if(level==2)
		{
			
		}
		else if(level==3)
		{
			
		}
		else if(level==4)
		{
			
		}
	}
(zu problem 1)

ich habe aber zwei probleme:
-ich hätte gerne dass die linie mit den punkten gezeichnet wird die in levelInfos() steht.Das ist aber nicht der der fall(wenn ich die werte bei der intialisierung ändere, dann ändert sich auch der strich)
-wenn ich mit meinem quadrat durch die linie laufe, dann bleibt das quadrat nicht an der linie hängen, sondern läuft einfach durch.

Wenn jemand das ganze ausprobieren möchte, hier das komplette programm:

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.*;

import javax.swing.*;

class GamePanel extends JPanel implements KeyListener, Runnable
{
	private static final long serialVersionUID = 1L;

	JFrame frame;
	
	boolean up;
	boolean down;
	boolean left;
	boolean right;

	int level=1;
	
	static boolean eingesammelt=false;
	static boolean laufen=true;
	boolean passieren=false;
	
	int x=0;
	int y=0;
	
	Rectangle rectangle=new Rectangle(50,50,10,10); 			
	Rectangle rec=new Rectangle(x,y,10,10);
	
	double x1=20;
	double x2=40;
	double y1=1000;
	double y2=40;
	
	Point2D.Double pt1=new Point2D.Double(x1, y1);
	Point2D.Double pt2=new Point2D.Double(x2, y2);
	
	Line2D.Double bar=new Line2D.Double(pt1,pt2);
	
	boolean barriere;
	
	Thread thread;
	Thread thr;	

	
	public GamePanel (int w, int h)
	{		
		levelInfos();
		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.pack();
		thread=new Thread(this);
		thread.start();
		thr=new Thread(this);
		thr.start();
		frame.setBackground(Color.yellow);
		frame.setVisible(true);
	}
	

	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		g.setColor(Color.green);
		g.fillRect(50, 50, 20, 20);
		
		g.setColor(Color.blue);
		g.fillRect(rec.x, rec.y, 10, 10);
		
		g.setColor(Color.red);
		g2.draw(new Line2D.Double(pt1,pt2));
		
	}		 
	
	public static void main(String[]args) //Fenster
	{
		new GamePanel(613,629);
	}
	
	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 check()
	{	
		
		if(up)
		{
			if(rec.y!=0)
			{
				rec.y=rec.y-1;
			}
		}
		
		if(down)
		{
			if(rec.y<604)
			{
				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;
			}
			
		}
		
		
	}

	private void abfrage() 
	{

		while(true)
		{
			eingesammelt=rec.intersects(rectangle);
			barriere = rec.intersectsLine(bar);
		
			if(eingesammelt==true)
			{
				laufen=false;
			}
		
			if(barriere)
			{
				down=false;
				up=false;
			}
		}
			
	}

	public void keyTyped(KeyEvent e) 
	{
	}
	
	public void levelInfos()
	{
		if(level==1)
		{
			pt1.x=20;
			pt1.y=40;
			pt2.x=1000;
			pt2.y=40;
			
		}
		else if(level==2)
		{
			
		}
		else if(level==3)
		{
			
		}
		else if(level==4)
		{
			
		}
	}
	
	public void run() 
	{
		if(Thread.currentThread()==thread)
		{
			while(level<5)
			{
				levelInfos();
			
				while(laufen==true)
				{			
					while(eingesammelt==false)
					{
						check();
						repaint();
						try{Thread.sleep(8);}catch(InterruptedException e){}
					}
					
				}	
				
				level++;
				laufen=true;
				eingesammelt=false;
			}
			
				
		}
		
		else
		{
			while(eingesammelt==false)
			{
				abfrage();
			}
			
			
		}					
	}

}
 

bERt0r

Top Contributor
Also ich hab mindestens 2 Probleme mit der Funktion:
1. Das ist eine Endlosschleife. Thread hin oder her da hast du was komplett falsch geplant.
2. Du setzt globale Variablen in deiner Funktion mit denen du anscheinen irgendwie ein Abbruchbedingung für deine Endlosschleife erreichen willst (was nicht Funktioniert). Warum verpasst du der Funktion nicht einfach einen Rückgabewert.
 

Marco13

Top Contributor
Zur eigentlichen Frage (falls sie das war) : Die Linie speichert sich die Koordinaten der im Konstruktor übergebenen Punkte, aber nicht die Punkte selbst. Mit sowas wie
Java:
        if(level==1)
        {
            pt1.x=20;
            pt1.y=40;
            pt2.x=1000;
            pt2.y=40;
            bar.setLine(pt1, pt2);
        }
sollte es gehen, oder wenn man statt der Punkte direkt die Linie verändert.
 

KingOfExceptions

Bekanntes Mitglied
ich hab aber jetzt ein neues problem :( wenn ich das hier habe:

Java:
public void levelInfos()
	{
		if(level==1)
		{
			x=0;
			y=0;
			pt1.x=600;
			pt1.y=600;
			pt2.x=600;
			pt2.y=600;
			x3=50;
			y3=50;
			bar.setLine(pt1, pt2);
			rec.setRect(x, y, 10, 10);
			rectangle.setRect(x3, y3, 10, 10);
		}
		else if(level==2)
		{
			x=0;
			y=0;
			pt1.x=20;
			pt1.y=20;
			pt2.x=200;
			pt2.y=50;
			rectangle.x=100;
			rectangle.y=300;
			bar.setLine(pt1, pt2);
			rec.setRect(x, y, 10, 10);
			rectangle.setRect(x3, y3, 10, 10);
		}
		else if(level==3)
		{
			
		}
		else if(level==4)
		{
			
		}
	}

dann werden, wenn ich level eins absolviert habe, nicht die werte von rectangle geändert..... dabei habe ich doch setRect benutzt :bahnhof:
 

Neue Themen


Oben