# Focus auf Applet?



## Triopoly (11. Jun 2005)

So ich bin gerade dabei Snake via Applet zu programmieren.
Klappt eigentlich auch schon alles wunderbar.

Das Problem ist nur das der User zuerst in das Applet klicken muss, damit die Keyevents
abgefangen/gehört werden können.

Kann ich einen Focus via Java direkt auf das Applet setzen?
Oder muss ich das per Java-Script in der HTML Datei tun?
Oder ist dies überhaupt möglich? 

Wenn ja, wie ist das möglich?

So ich kann ja mal nen Link hier rein packen.
Natürlich ist das alles noch im Aufbau auch die Kollisionsabfrage existiert bei der Schlange noch gar nicht und bei
den Wänden nur teilweise.

Snake


----------



## L-ectron-X (11. Jun 2005)

Schreib mal in die init()-Methode

```
this.requestFocus();
```
Hilft das?


----------



## Guest (11. Jun 2005)

Kann ich leider im moment nicht aussprobieren.

Die Init-Methode startet das Applet oder?
Und die muss ich dann überlagern ja?
Kenn mich nicht so gut mit Applets aus.


mfg GagamehlO


----------



## L-ectron-X (11. Jun 2005)

Anonymous hat gesagt.:
			
		

> Die Init-Methode startet das Applet oder?
> Und die muss ich dann überlagern ja?


Wenn man es genau nimmt, startet der Browser das Applet, in dem er es der VM übergibt.
Danach ruft er die init()-Methode auf. In der init()-Methode sollten dann alle Dinge gemacht werden, die dazu dienen, das Applet zu initialisieren. Die init()-Methode wird nur ein einziges Mal, nämlich beim Start des Applets, aufgerufen.
Mit überlagern meinst du wohl überschreiben?


----------



## Guest (11. Jun 2005)

Ja überlagern = überschreiben.
Guido Krüger (JavaBuch) nennt das auch so.

Klar ich Idiot Init = Initialisieren.

mfg GagamehlO


----------



## Guest (11. Jun 2005)

Funzt nicht hier der gesamte Code




```
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;



public class Snake extends Applet implements Runnable
{ 
    private final int WIDTH = 10, HEIGHT = 10;//Standard-Einstellung
    private final Point[] STARTCOORDS = new Point[]{//Standard-Einstellung
    new Point(50,195),
    new Point(40,195),
    new Point(30,195),
    new Point(20,195),
    new Point(10,195),
    new Point(0,195)};
    
    private int score=0;
    private Point direction = new Point(10,0);//Standard-Einstellung
    private Thread move = new Thread(this);
    private Point food = new Point((int)(Math.floor((Math.random()*400))),(int)(Math.floor((Math.random()*400))));
    private Vector coords = new Vector();

public void start() 
{
    move.start();

}

public void stop() {

    move.stop();

}

public void destroy() { }

public void run()
{
    for(int x=0;x<STARTCOORDS.length;x++)
    {
        coords.add(x,STARTCOORDS[x]);
    }
    for(;;)
    {
    
       
       
        Point schwanz = (Point) coords.get((coords.size()-1));
        
        for(int y=(coords.size()-1);y>0;y--)
        {
            coords.remove(y);
            coords.insertElementAt(((Point)coords.get(y-1)),y);
        }
        
        
            Point punkt = (Point) coords.firstElement();
            int horizontal,vertikal;
            horizontal = (int) punkt.getX() + (int) direction.getX();
            vertikal = (int) punkt.getY() + (int) direction.getY();
            punkt = new Point(horizontal,vertikal);
            coords.remove(0);
            coords.insertElementAt(punkt,0);
            
            
            System.out.print("\nFoodX = "+(int) food.getX() + "KopfX = " + (int)((Point)coords.get(0)).getX());
            int kopfx = (int)((Point)coords.get(0)).getX(), kopfy = (int)((Point)coords.get(0)).getY();
            int foodx = (int) food.getX(), foody = (int) food.getY();
        
            if((kopfx >=(foodx-5) && kopfx <= (foodx+5))&&(kopfy >=(foody-5) && kopfy <= (foody+5)))
            {
            food = new Point((int)(Math.floor((Math.random()*390))),(int)(Math.floor((Math.random()*390))));
            coords.add(schwanz);
            score++;
            }
            
            if((kopfx>=391)||(kopfy>=391)||(kopfx<=0)||(kopfy<=0)) stop();
            
            
            
            
            repaint();
            
            
            
            

        try
        {
            Thread.sleep(100);
        }
        catch(Exception e)
        {
            //Nothing
        }            
        
    }

}//run end

public void paint (Graphics g)
{
    g.setColor(Color.red);
    if(coords!=null)
    {
         
        
        for(int x=0;x<coords.size();x++)
        {
            g.fillOval((int)((Point)coords.get(x)).getX(),(int)((Point)coords.get(x)).getY(),WIDTH,HEIGHT);
            
        }
        g.setColor(Color.green);
        g.fillRect((int) food.getX(),(int) food.getY(),10,10);
        g.setColor(Color.black);
        g.drawString("Sie haben " + score + " Punkte!",20,10);
    }
    else g.drawString("Bitte warten es wird geladen",20,10);
    
    
}



    public boolean keyDown(Event e,int key)
    {
        if(key==Event.LEFT)
        {
            if((((int) direction.getX()==10))&&(((int) direction.getY()==0))) direction = new Point(0,-10);
            else if((((int) direction.getX()==-10))&&(((int) direction.getY()==0))) direction = new Point(0,10);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==-10))) direction = new Point(-10,0);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==10))) direction = new Point(10,0);
        }            
        else if(key==Event.RIGHT)
        {
            if((((int) direction.getX()==10))&&(((int) direction.getY()==0))) direction = new Point(0,10);
            else if((((int) direction.getX()==-10))&&(((int) direction.getY()==0))) direction = new Point(0,-10);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==-10))) direction = new Point(10,0);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==10))) direction = new Point(-10,0);
            
            
        }
        
        
        return true;
        
    }



	public void init()
	{
	
		this.requestFocus();
	
	
	
	}//init end


}//class End
```


----------



## L-ectron-X (11. Jun 2005)

Gut, ich habe mir den Code mal in meinen Editor geladen und kompiliert.
Da das Applet sofort mit der Ausführung des Spiels beginnt, würde ich mir erst mal keine Sorgen machen.
Implementiere einfach einen Start-Button, den der Benutzer klicken muss, bevor er das Spiel beginnt und schon hat das Applet den Focus.


----------



## Triopoly (11. Jun 2005)

Ja ich weis das wird direkt gestartet.

Ich habe noch nen Frage zur Logik.
In Zeile 127 die Methode keyDown fängt ja ausgelöst wenn ein Keyevent abgefangen werden soll.
Das komische ist das die Methode nen boolschen Rückgabetyp hat.
Wofür?
Wenn sie sowieso automatisch ausgelöst wird, dann kann ich ja nichts abfangen.

Hoffe ich habe meine Frage verständlich gestellt.

Kann man dem Applet eigentlich auch an Event-Listenern registrieren lassen?
Müsste man das dann in der init() machen???




mfg GagamehlO


----------



## Roar (11. Jun 2005)

die event api die du verwendest ist 10 jahre alt. lies hier: http://www.java-forum.org/de/javabuch/html/k100180.html#kapiteleventhandling


----------



## Guest (11. Jun 2005)

Welche Eventapi meinst du die ich verwende?
Die mit public boolean keyDown(..) ???

Habe das nur auf die schnelle in Irgend nem Tutorial zu Applets enddeckt.
Also könnte ich addKeyListener...
In die Init schreiben?

Das war ja auch meine eigentliche Frage gewesen.


----------



## Guest (11. Jun 2005)

Also kann ich jeder Unterklasse und Unterklasse die von Component abgeleitet wurden
an entsprechen Event-Listener registrieren lassen?
Also auch dem Applet?

Ich denke ich habe das jetzt alles richtig verstanden.

Nur wie kann ich den Focus dennoch auf das Applet bekommen?


----------



## Wildcard (12. Jun 2005)

Ein Applet erbt von Panel. Panels sind per default nich fokusierbar (denke dass das bei einem Applet nicht anders ist). Mach mal:

```
setFocusable(true);
requestFocus();
```


----------



## Guest (13. Jun 2005)

Danke an alle, aber ist jetzt wurscht.

Neue Snake

So dann mal ne Frage, wie kann ich das Flimmern verhindern?
Die Update-Methode bringt mir nichts.
Mit Doppel-buffering? (hieß doch so oder?)


mfg GagamehlO


----------



## L-ectron-X (13. Jun 2005)

Ja, für das DoubleBuffering brauchst du aber die update()-Methode. Nur steckt hinter der ganzen Sache etwas mehr...
Suche bitte mal im Forum danach. Es gibt dazu ergiebige Beiträge.


----------



## GagamehlO (13. Jun 2005)

So hier mal der neue Code






```
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;



public class Snake extends Applet implements Runnable
{ 
    private final int WIDTH = 10, HEIGHT = 10;//Standard-Einstellung
    private final Point[] STARTCOORDS = new Point[]{//Standard-Einstellung
    new Point(50,195),
    new Point(40,195),
    new Point(30,195),
    new Point(20,195),
    new Point(10,195),
    new Point(0,195)};
    
    private int score=0,start;
    private boolean end=false;
    private Point direction = new Point(10,0);//Standard-Einstellung
    private Thread move = new Thread(this);
    private Point food = new Point(10+10*(int)(Math.floor((Math.random()*39))),10+10*(int)(Math.floor((Math.random()*39))));
    private Vector coords = new Vector();
    private Image startimage;
    


public void start() 
{
	
     if(start!=0)  move.start();
}

public void stop() {

    move.stop();

}

public void destroy() { }

public void run()
{
    for(int x=0;x<STARTCOORDS.length;x++)
    {
        coords.add(x,STARTCOORDS[x]);
    }
    for(;;)
    {
    
       
       
        Point schwanz = (Point) coords.get((coords.size()-1));
        
        for(int y=(coords.size()-1);y>0;y--)
        {
            coords.remove(y);
            coords.insertElementAt(((Point)coords.get(y-1)),y);
        }
        
        
            Point punkt = (Point) coords.firstElement();
            int horizontal,vertikal;
            horizontal = (int) punkt.getX() + (int) direction.getX();
            vertikal = (int) punkt.getY() + (int) direction.getY();
            punkt = new Point(horizontal,vertikal);
            coords.remove(0);
            coords.insertElementAt(punkt,0);
            

            int kopfx = (int)((Point)coords.get(0)).getX(), kopfy = (int)((Point)coords.get(0)).getY();
            int foodx = (int) food.getX(), foody = (int) food.getY();
        
            if((kopfx >=(foodx-5) && kopfx <= (foodx+5))&&(kopfy >=(foody-5) && kopfy <= (foody+5)))
            {
            food = new Point(10+10*(int)(Math.floor((Math.random()*37))),10+10*(int)(Math.floor((Math.random()*37))));
            coords.add(schwanz);
            score++;
            }
            
          
            
            
	    for(int x=1;x<coords.size();x++)
	    {
        int teilx = (int)((Point)coords.get(x)).getX();
		int teily =  (int)((Point)coords.get(x)).getY();
		if((kopfx >=(teilx-5) && kopfx <= (teilx+5))&&(kopfy >=(teily-5) && kopfy <= (teily+5)))
        {
		        end=true;
                repaint();
                stop();
                        
		}
		
	    }
            
            
            
            
            if((kopfx>=390)||(kopfy>=390)||(kopfx<=0)||(kopfy<=0))
            {               

                end=true;
                repaint();
                stop();
                        
            }
        repaint();

        try
        {
            Thread.sleep(100-score);
        }
        catch(Exception e)
        {
            //Nothing
        }            
        
    }

}//run end

public void paint (Graphics g)
{
    g.setColor(Color.red);
    if(start==1)
    {
         
        
        for(int x=0;x<coords.size();x++)
        {
            g.fillOval((int)((Point)coords.get(x)).getX(),(int)((Point)coords.get(x)).getY(),WIDTH,HEIGHT);
            
        }
        g.setColor(Color.green);
        g.fillRect((int) food.getX(),(int) food.getY(),10,10);
        g.setColor(Color.black);
        g.drawString("Sie haben " + score + " Punkte !",20,10);
        
        if(end) g.drawString("Gameover! Zum Neustarten bitte die Leertaste drücken",20,200);
    }
    else if(start==0)
    {
    //g.drawString("Start",60,60);
    g.drawImage(startimage,0,0,this);
    }
    else{
        
        g.drawString("Error...",20,20);
    }
    
}



    public boolean keyDown(Event e,int key)
    {
        if(key==Event.LEFT)
        {
            if((((int) direction.getX()==10))&&(((int) direction.getY()==0))) direction = new Point(0,-10);
            else if((((int) direction.getX()==-10))&&(((int) direction.getY()==0))) direction = new Point(0,10);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==-10))) direction = new Point(-10,0);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==10))) direction = new Point(10,0);
        }            
        else if(key==Event.RIGHT)
        {
            if((((int) direction.getX()==10))&&(((int) direction.getY()==0))) direction = new Point(0,10);
            else if((((int) direction.getX()==-10))&&(((int) direction.getY()==0))) direction = new Point(0,-10);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==-10))) direction = new Point(10,0);
            else if((((int) direction.getX()==0))&&(((int) direction.getY()==10))) direction = new Point(-10,0);
        }
	else if((key==32)&&(start==0))
	{
		start=1;
		start();
	}
   -------- [b]else if((key==32)&&(start==1)&&(end))
   --------{
   -------- destroy();
   -------- init();
   --------}[/b]
        
 return true;
        
}



	public void init()
	{
	    
		this.requestFocus();
		MediaTracker bilderladen = new MediaTracker(this);
		startimage = getImage(getCodeBase(), "snake.jpg");
		bilderladen.addImage(startimage,0);
		try
		{
			bilderladen.waitForAll();
		}
		catch(Exception e)
		{
			//nothing
		}
	    start=0;
	
	}//init end


}//class End
```




Ich stehe vor einem neuen Problem.
Wenn ein Gameover erzielt wurde kann der User die Leertaste drücken damit 
Er nochmal spielen kann.
Wie ich ab Zeile 179 besonders hervorgehoben habe weis ich nur nicht wie ich das machen soll.
Nach meiner Logik müsste ich zuerst die Methode destroy() und danach die Methode init() aufrufen jedoch bekomme ich ne haufen an Exceptions.
Wie läd man denn am besten ein Applet neu?


mfg GagamehlO


ps. achja noch mal der Link 


<----Snake----->[/b][/code]


----------



## GagamehlO (14. Jun 2005)

<--Post-hoch-halt-->

Es wäre nett wenn mir mal einer auf meine Frage antworten könnte.


----------



## L-ectron-X (14. Jun 2005)

Eine Möglichkeit: Lass es doch die Seite in den Browser laden, in der das Applet eingebettet ist.

Die destroy()-Methode wird vom Browser aufgerufen, wenn du den Browser schließt, die init()-Methode direkt nach dem Laden. 

Eine andere Möglichkeit: Wenn Du möchtest, dass die Ausführung von vorn beginnt, bringst du das Applet in "Nullstellung". Dazu wäre es gut, wenn die Sachen, die nicht neu initialisiert werden müssen, sondern nur Startwerte erhalten sollen, in einer extra Methode gesetzt werden, die auch von der init()-Methode beim Start aufgerufen werden kann.


----------



## Triopoly (14. Jun 2005)

Das Applet könnte ich dann so in Nullstellung bringen oder?


removeAll();
init(); // In dieser Methode bekommen alle Attribute ihre Startwerte


Init ruft ja wiederum start() auf und ab gehts!

Stimmt das alles so in etwa?


----------



## L-ectron-X (15. Jun 2005)

Alle Methoden aus dem Applet-Lebenszyklus, also auch die start()-Methode werden vom Browser aufgerufen.
Das heißt, die init()-Methode ruft nicht die start()-Methode auf, sondern das macht der Browser direkt nach dem initialisieren des Applets. Natürlich kann der Programmierer die Methoden auch selbst aufrufen.
Daher bietet es sich an, die Komponenten des Applets quasi wie im Konstruktor einer Klasse anzulegen (zu initialisieren) und dann das Applet in der start()-Methode auf seine Anfangswerte zu setzen. Also alles, was dazu dient, kannst du in der start()-Methode ablegen.


----------



## GagamehlO (16. Jun 2005)

Ja aber die Methode removeAll wäre da schon angebracht oder?


----------



## GagamehlO (16. Jun 2005)

Alles klar das kalppt jetzt alles wunderbar.
Muss mich dann nur bald mal mit double buffering beschäftigen  :### 

Aber danke an alle!   


mfg GagamehlO


----------



## L-ectron-X (16. Jun 2005)

Es gibt hier bereits Codebeispiele, dazu einfach die Forumsuche benutzen.


----------

