2-D Programmierung

PeaBull

Grünschnabel
Hallo,
habe folgendes Problem,
ich erstelle momentan ein Spiel, dabei werden 2 Objekte erzeugt, einerseits ein fallender Ball, andererseits ein Strich, den ich durch das Klicken auf 2 verschiedene Punkte im Frame erzeuge. Ich habe in meiner Paint einen Thread mit sleep, aber dabei kann ich halt keinen Strich zeichnen. Ich habe den Tipp bekommen, es mit einem EDT zu versuchen, also habe ich recherchiert, bin aber nur auf Unfug oder auf englische Seiten gestoßen und da mein Englisch nicht zu dem Besten gilt, frage ich einfach mal euch, wie erstelle ich einen EDT und wo setzt ich diesen ein?(Timer nicht beachten, den habe ich nur zur Probe drinnen)
Code:
import java.awt.*;
import java.awt.event.*;
import java.util.Timer;
import java.util.TimerTask;

//final Timer timer = new Timer();
//TimerTask task = new TimerTask() {
//public void run() {
////if (abbruchbedingung) timer.cancel();
////else deineFunktion();
//}}


class ZeigerOrt extends Frame implements MouseListener
{
	TextField tf;
	int x1,y1,x2,y2,x3,y3,x4,y4;
	int i=0;
	
	
	
	//start des Timers:
	//timer.scheduleAtFixedRate(task, 0, 1000);
	// wiederholt sich unendlich immer nach einer Sekunde (1000 Millisekunden)
	ZeigerOrt()
	{
		setSize(600,600);
		setTitle("Punkt Koordinaten!");
		setBackground(Color.gray);
		setLayout(null);
	
		tf= new TextField("");
		tf.setBounds(40,60,300,20);
		tf.setBackground(Color.lightGray);
		//tf.addMouseListener(this);
		add(tf);
	
		addMouseListener(this);
	
		setVisible(true);
	}

	public void mouseClicked(MouseEvent m)
	{

		if(m.getClickCount()==1)
		
		i=i+m.getClickCount();
		
		if(i==1 || (i%4==1))
		{
			x1 = m.getX();
			y1 = m.getY();
		}
		if(i==2 || (i%4==2))
		{
			x2 = m.getX();
			y2 = m.getY();
		}
		if(i==3 || (i%4==3))
		{
			x3 = m.getX();
			y3 = m.getY();
		}
		if(i%4==0)
		{
			x4 = m.getX();
			y4 = m.getY();
		}
		tf.setText("P1:"+x1+" "+y1+" P2:"+x2+" "+y2+" P3:"+x3+" "+y3+" P4:"+x4+" "+y4+"  "+i);	
		System.out.println(m+"  "+i);
	}

	public void mouseEntered(MouseEvent a){}
	public void mouseExited(MouseEvent b){}
	public void mousePressed(MouseEvent c){}
	public void mouseReleased(MouseEvent d){}

	public void paint(Graphics g)
	{
		if ((i==2)||(i==3)||(i%4==2)||(i%4==3))
		  {g.drawLine(x1, y1, x2, y2);}
		if ((i==4)||(i%4==0)||(i%4==1))
		  {g.drawLine(x3, y3, x4, y4);}
		
		g.setColor(Color.black);
		repaint();
		
		for (int y10=20; y10<=470; y10++)
        {
//        	try
//        	{
//        		Thread.sleep(10);
//        	}
//        	catch(InterruptedException x){}        		        	
//			javax.swing.Timer t = new javax.swing.Timer( 1000, new ActionListener() {
//				  public void actionPerformed( ActionEvent e ) {
//				    g.repaint();}
//				  }
//			//start des Timers:
			//timer.scheduleAtFixedRate(task, 0, 90);
			// wiederholt sich unendlich immer nach einer Sekunde (1000 Millisekunden)
			g.clearRect(100, y10-1, 20, 20);
        	g.fillOval(100,y10,20,20);      
        	g.setColor(new Color(255, 0, 0));
        	        	 
        }
	}
	

	public static void main (String a[])
	{
		ZeigerOrt z = new ZeigerOrt();
	}

}
 
Du warst in deiner Frage nicht wirklich deutlich. Dein Problem ist, dass du nicht zwei Dinge gleichzeitig tun kannst verstehe ich das richtig? Und das Thread.sleep() hast du da drin, um das Fallen des Balles zu simulieren, richtig?
 
Erstmal : den EDT kann man so nicht selbst erzeugen oder setzen oder damit dierekt arbeiten.
EDT steht für EventDispatchThread und ist der Thread der deine GUI überhaupt erst benutzbar macht.
Warum du überhaupt ein SLEEP drin hast verschweigt sich mir. Nutze Swing da dieses automatisch DoubleBuffered ist ... also nichzt flackert.
Dann war sicherlich gemeint das du die aktulisierung eben NICHT im EDT laufen lassen sollst sondern in einem separaten Thread. *Ich kann mir schlecht vorstellen das dir jemand rät sowas im EDT zu machen.*
Dir fehlen wohl einige Grundlagen was GUI angeht. Ich würde vorschlagen das du es erstmal locker mit einem kleinen Malprogramm angehen lässt. Wenn du dann soweit fit bist kann man das ganze animieren und so lernen wie man das ganze in getrenten Threads macht. Ich weis ja nicht wie weit dein Stand ist zur Zeit ... aber es sieht doch etwas holprig und überstürzt aus wie du dich da ran wagst. Ich will dich jetzt nicht rumkommandieren ... aber ein paar Grundlagen sollte man schon drauf haben. Ich selbst kann dir da nur wenig helfen da ich mich wenig mit GUI beschäftige.
 
Tut mir Leid, falls meine Frage nicht verständlich war :)
Ja, ich kann diese beiden Objekte nicht gleichzeitig erzeugen und
@Spikee
doch, er wurde mir tatsächlich empfohlen, aber um sicher
zu gehen, frage ich eben noch hier nach, sonst hätte ich ja gleich losgelegt.
Ich habe mir dieses Programm extra ausgesucht, weil da mehrere Sachen verlangt
sind und ich dadurch erhoffe, mehr darüber zu erfahren.
Was deine Aussage betrifft, ich kenne mich noch nicht in Java aus,
muss ich zustimmen, trotzdem habe ich das Programm aus eigenen Recherchen erzeugt,
es ist bestimmt nicht das Beste aber es ist einfach und dadurch, meiner Meinung nach, verständlich.

Zurück zum Thema,
der sleep() ist gedacht, um das Fallen zu simulieren, nicht um das Flackern zu stoppen.
Ich habe es mit diesem Thread versucht, das konnte aber ja nur schief gehn. Ich hoffe,
ihr könnt mir helfen, wie ich den Thread sonst machen sollte.
 
Du hast meinen Post nicht richtig verstanden.
Es geht darum eine Animation eben NICHT im EDT laufen zu lassen da dadurch wie du schon festgestellt hast der rest blockiert wird *in deinem Fall das Zeichnen*.
Der EDT ist einzig und alleine dafür da auf die GUI ausgeübte Events *Mausklicks , Tastatureingaben , etc* an die Logik und dahinter sitzende Background-Threads weiterzugeben. Der EDT selbst sollte für sowas nie verwendet werden. Einzige ausnahme : Veränderungen der GUI selbst. Dazu zählen aber keine Animationen. Das Thema ist sehr verzahnt ... du siehst ja wie viele Ausnahmen es für alleine für die Regel des EDT gibt. So etwas findet man in fast allen Bereichen von Java. Alleine um alle Ausnahmen zu irgendwelchen Regeln zu nennen bräuchte man um diese zu erfassen ein einzelnes Buch nur für den Index.
 
Hi PeaBull,

willkommen in der Welt der bewegten Bilder :)
Wenn Du Animationen zeichnen möchtest, solltest du Dich mit der Architektur von animierten Systemen (Spielen) auseinander setzen. Die Schwierigkeit liegt eher in der Methodik, also wie man, wann, welche Dinge tut. Stichworte wären "state machine", "timing", "collision detection"...etc. Generell kannst Du
als Startpunkt mal von folgendem groben Schema ausgehen:

---------------------
mainloop (zeitgesteuert per timer oder Berechnung von currentTimeMillis)
- call play

play()
-updateObjects (setze x und y += Geschwindigkeit, etc.)
-checkCollision
-repaint (ruft paint...klar!)

paint()
-drawObjects
-----------------------

Hier mal ein kleines tutorial, ist zwar etwas quick and dirty, wird Dir aber weiterhelfen:
http://zetcode.com/tutorials/javagamestutorial/

Gruß,
OneOf6
 
Zuletzt bearbeitet:
Danke oneof6 ^^
ich werds mir mal anschauen.
@ Spikee:
Ich habe deinen Beitrag verstanden und wusste, was du gemeint hast mit dem EDT, ich habe ja nur gesagt, dass er mir empfohlen wurde.
Wie dem auch sei,
Danke für die ganzen Tipps :)
 
Wie gesagt ... ich kann es mir NICHT vorstellen das dir jemand der halbwegs Ahnung von diesem Thema hat dir empfohlen hat die Animation des Balles IN den EDT zu packen.
Entweder hast du diese Empfehlung falsch verstanden oder der jenige der dir diese gegeben hat nur wenig bis keine Ahnung von dem was er geschrieben hat.
Was passiert wenn du deine Animation in EDT packst ? Da du grade mal 10ms sleep drin hast dürfte das so ziemlich alles andere freezen was du sonst noch damit vorhast ... wie z.B. deine Linie da zu zeichnen. Der Grund : der EDT ist gerade damit beschäftigt eine Aktion auszuführen ... da kann er sich nicht noch gleichzeitig um das von dir erzeugte Event kümmern. Desshalb sollst du ja auch alle Events die du implementierst in einen eigenen Thread stecken und sie dort ablaufen lassen.
Das problem dabei ist allerdings das du den EDT bewusst schalfen legst. Also das er auf überhuapt gar kein Event mehr reagieren kann. Wichtig ist hier nun das erstmal die Animation in einen separaten Thread wandert damit der EDT wieder freigegeben wird und sich um deine Events kümmern kann. Dann wirst du fest stellen das der EDT einmal zum Start den von dir dann ausgelagerten Thread anstößt und sich dann im prinzip langweilt bis er ein Event registriert. Um nun aber den EDT nicht die ganze Zeit mit einem Event zu blockieren *gerade bei I/O-Operationen* lässt du durch den EDT einen weiteren Thread anstoßen der sich dann um das Event kümmert. So laufen deine Animation , das Event und der EDT gleichzeitig. Wenn du jetzt z.B. eine längere I/O-Opertaion auszuführen hast würde deine komplette GUI freezen bis die Operation beendet ist. Durch Multithreading lässt du so etwas aber parallel laufen , so das dein Programm im Hintergrund irgendwelche I/O-Operationen durchführen kann und die GUI benutzbar bleibt.

Das ist EINE der Grundlagen zu GUI und Multithreading ... es gibt aber noch eine vielzahl mehr die du zumindest kennen solltest wenn du dich daran machst ein "Spiel" zu programmieren.
 

Neue Beiträge

Zurück