Von Canvas (mit BufferStrategy) zu Applet

Status
Nicht offen für weitere Antworten.

fallencake

Mitglied
Hi Forum
Ich bastle im Moment selbst ein Game und habe hier schon das ein oder andere gelesen. Nun würde ich mein Game gerne als Applet veröffentlichen. Da ich aber von Applets keine Ahnung habe und mein Game als Canvas aufgebaut ist will ich bei euch mal um Hilfe fragen.

Hier mal als mehr oder weniger Pseudocode wie mein Game aufgebaut ist:
Java:
public class Game extends Canvas {
private BufferStrategy strategy;
public Game() {
        //Fenster init:
        JFrame frame = new JFrame("Game");
        JPanel panel = (JPanel) frame.getContentPane();
        panel.setPreferredSize(new Dimension(windowx, windowy));
        panel.setLayout(null);
        setBounds(0,0,windowx,windowy);
        panel.add(this);
        setIgnoreRepaint(true);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        
        requestFocus();

        createBufferStrategy(2);
        strategy = getBufferStrategy();
        Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
        g.setColor(Color.black);
        g.fillRect(0, 0, windowx, windowy);
        g.dispose();
        strategy.show();
        run();
}

run() {
        while(true) {
                //Berechnen, Bewegen, etc

                Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
                g.setColor(Color.black);
                g.fillRect(0, 0, windowx, windowy);
                //Noch weitere Sachen zeichnen
                g.dispose();
                strategy.show();
                try { Thread.sleep(looptime); } catch(Exception e) {};
        }
}
}

Wie kann ich dass nun am besten in ein Applet packen?

Meine ganzen Erfahrungen mit Applets:
Java:
public class AppletTester extends Applet {
    public void paint(Graphics g) {
        g.drawString("Hello world!", 50, 25);
    }

}

.. ^^

Könnte ich das oben erstellte Canvas einfach ihrgendwie ins Applet packen so dass ich es gar nicht verändern muss?

Vielen Dank für eure Hilfe/Tipps

Gruss
fallencake
 
S

SlaterB

Gast
> Meine ganzen Erfahrungen mit Applets

musst du erweitern auf Applets nicht nur mit paint sondern auch/ vor allem mit JPanel, JButton & Co.,
findet man doch in jedem Lehrbuch oder wenn man allein bei google > 1 Seiten zu Applets anschaut..

kurz gesagt musst du in der init-Methode das Canvas adden, so wie du es zum ContentPane des JFrame hinzufügst

dass du mindestens zwei Klassen brauchst (Applet + Canvas) sollte wohl noch erwähnt werden ;)
 

fallencake

Mitglied
Hey
Ich weiss war ne einfache Frage.
Ich hab gest Nacht gegooglet, aber ihrgendwie... War wohl schon zu spät :/
kurz gesagt musst du in der init-Methode das Canvas adden, so wie du es zum ContentPane des JFrame hinzufügst
Thx, jetzt klappts (ka was ich gestern verbrochen hab).

Vielleicht kommen auch mal noch anspruchsvollere Fragen ;)
Gruss
fallencake
 

fallencake

Mitglied
Leider habe ich es doch noch nicht ganz hinbekommen.
Wenn ich es einfach adde funktioniert es, allerdings in einem neuen Fenster:
Java:
public class GameApplet extends Applet {
     public void init() {
         Game game = new Game();
     }
 }
Java:
    public Game() {
         
         game=this;
         //Fenster init:
         JFrame frame = new JFrame("Game");
         JPanel panel = (JPanel) frame.getContentPane();
         
         panel.setPreferredSize(new Dimension(windowx, windowy));
         panel.setLayout(null);
         setBounds(0,0,windowx,windowy);
         panel.add(this);
         setIgnoreRepaint(true);
         frame.pack();
         frame.setResizable(false);
         frame.setVisible(true);
         frame.addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent e) {
                 System.exit(0);
             }
         });
         
         requestFocus();
         
         //Key Listerner adden
         addKeyListener(new KeyInputHandler());
         
         createBufferStrategy(2);
         strategy = getBufferStrategy();
         //schwarz zeichnen
         Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
         g.setColor(Color.black);
         g.fillRect(0, 0, windowx, windowy);
         g.dispose();
         strategy.show();
         
     initGame();
     
     }

Wenn ich es so machen will, dass es im gleichen Fenster angezeigt wird, sehe ich einfach ein leeres Fenster (mit der richtigen Grösse).
Java:
public class GameApplet extends Applet {
     public void init() {
         this.setSize(new Dimension(1000, 700));
         Panel p = new Panel();
//Panel zuerst zu Appled adden, damit ich in Game createBufferStrategy(2) aufrufen kann
         add(p);
 
         Game game = new Game(p);
     }
 }
Java:
    public Game(Panel panel) {
         
         game=this;
 
         panel.setPreferredSize(new Dimension(windowx, windowy));
         panel.setLayout(null);
         setBounds(0,0,windowx,windowy);
         panel.add(this);
 
         setIgnoreRepaint(true);
 
         
         requestFocus();
         
         //Key Listerner adden
         addKeyListener(new KeyInputHandler());
         panel.setVisible(true);
         createBufferStrategy(2);
         strategy = getBufferStrategy();
         //schwarz zeichnen
         Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
         g.setColor(Color.black);
         g.fillRect(0, 0, windowx, windowy);
         g.dispose();
         strategy.show();
         
     initGame();
     
     }

Kann mir wer sagen was ich hier falsch mache? Ich nehme an, dass es irgendwas mit repaint() zu tun hat. Oder dass ich irgendwie das falsche Graphics2D Element von strategy.getDrawGraphics() bekomme.

Herzlichen Dank schonmal
Gruss
fallencake
 
S

SlaterB

Gast
geht es ohne die run-Methode?

immer ganz einfach anfangen,
erstmal nur ein Label/ JLabel mit "Hello World" anzeigen und dann Schritt für Schritt mehr

die run-Methode im ursprünglichen Programm wurde aus dem Konstruktor aufgerufen (der damit nie beendet wird..),
beschäftigte wahrscheinlich den main-Thread von public static void main() aus,

wenn beim Applet der gleiche Thread, der später zeichnen soll, die run()-Methode abarbeiten muss,
wird nicht oder nur rudimentär gezeichnet (Vermutung)
 

fallencake

Mitglied
Hey
SlaterB hat gesagt.:
die run-Methode im ursprünglichen Programm wurde aus dem Konstruktor aufgerufen (der damit nie beendet wird..),
beschäftigte wahrscheinlich den main-Thread von public static void main() aus,

wenn beim Applet der gleiche Thread, der später zeichnen soll, die run()-Methode abarbeiten muss,
wird nicht oder nur rudimentär gezeichnet (Vermutung)
Habe ich das jetzt richtig verstanden?: Du meinst, weil im Game() ja eine while(true) Schleife benutzt wird (Die run() Methode) kommt der Thread in der GameApplet Klasse nie über Game game = new Game(p); raus?
Falls ja, das stimmt und zwar beim Aufruf von initGame();. Das habe ich jetzt allerdings mal rausgenommen und nun müsste es schwarz gezeichnet werden.

Java:
public class GameApplet extends Applet {
    public void init() {
        this.setSize(new Dimension(1000, 700));
        Panel p = new Panel();
        add(p);

        Game game = new Game(p);
        System.out.println("blah");
    }
}
blah wird ausgegeben. Leider bleibt das Applet aber weiss.

SlaterB hat gesagt.:
immer ganz einfach anfangen,
erstmal nur ein Label/ JLabel mit "Hello World" anzeigen und dann Schritt für Schritt mehr
Eigentlich hatte ich nicht vor mich im Moment tiefer mit Applets zu beschäftigen.. Ich will nur mein Game auf einer Homepage veröffentlichen (Ohne es in einem zusätzlichen Fester zu öffnen).
Gibt es denn kein kleines Beispiel in dem ein Canvas auf ein Panel gepackt und dieser Panel aufs Applet gepackt wird und Canvas eine BufferStrategy nutzt?


PS: Wenn ich Game game = new Game(p); vor GameApplet.add(p); mache bekomme ich: java.lang.IllegalStateException: Component must have a valid peer beim Aufruf von Game.createBufferStrategy(2);
 

fallencake

Mitglied
> erster Link: dieses Thema hier
:shock:

Ich habe mir noch Quaxli's Spiele Tutorial halb durchgelesen. In seinem 2ten Beispiel macht er es genau gleich wie ich mit der BufferStrategy.
Java:
createBufferStrategy(2);
strategy = getBufferStrategy();
So unüblich ist das also wohl nicht ;)
Und irgendwer muss doch sicher schon mal auf die Idee gekommen sein ein Game das auf diese Art programmiert wurde in ein Applet zu setzen..


Eigentlich würde ich gerne darauf verzichten das Game für das Applet gross um zu bauen.

Ich habe mir aber trozdem mal ein bisschen die Applets angeschaut und das hier gebastelt:
Java:
public class GameApplet extends JApplet implements Runnable {
    int timer;
    public void init() {

        this.setSize(new Dimension(1000, 700));
        Thread t = new Thread(this);
        t.start();
    }
    
    public void paint(Graphics g) {
        super.paint(g);
        Color c = Color.green;
        for(int i = 0;i<timer;i++) {
            c=c.darker();
        }
        g.setColor(c);
        g.fillRect(0, 0, 1000, 700);
        

    }
    public void run() {
        
        while(true) {
            timer++;
            this.repaint();

            try { Thread.sleep(300); } catch(Exception ex) {}
        }
    }
}
So kann man Animationen (Hier ein Farbverlauf) im Applet machen. Aber es ist nicht gebuffert und ja müsste einiges umschreiben um mein Game so sauber umzuschreiben.


Hoffe jemand weiss noch n bisschen mehr :)

Gruss
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T onDrawFrame(GL10 glUnused) und onDraw(Canvas canvas) parallel ? Spiele- und Multimedia-Programmierung 1
R Canvas Circle bewegen? Spiele- und Multimedia-Programmierung 14
T MouseControl : JME Canvas in Swing Gui Spiele- und Multimedia-Programmierung 7
J Fullscreen Mode und Canvas Spiele- und Multimedia-Programmierung 5
M JOGL - Mehr als nur ein Canvas - Texturpool Spiele- und Multimedia-Programmierung 7
F schöne Animationen auf 2D Canvas Spiele- und Multimedia-Programmierung 4
O Facebook-Spiel mit GWT Canvas Spiele- und Multimedia-Programmierung 1
Developer_X Java3D Canvas post Renderer und? Spiele- und Multimedia-Programmierung 5
DamienX Canvas vs JPanel Spiele- und Multimedia-Programmierung 15
R Canvas Spiele- und Multimedia-Programmierung 6
U Canvas Ursprung ändern Spiele- und Multimedia-Programmierung 11
K mit Canvas übereinander zeichnen Spiele- und Multimedia-Programmierung 4
S Probleme mit Canvas! Spiele- und Multimedia-Programmierung 2
R BufferStrategy Flackert Spiele- und Multimedia-Programmierung 3
B BufferStrategy zu BufferedImage? Irgendwie? Spiele- und Multimedia-Programmierung 2
V Problem mit BufferStrategy Spiele- und Multimedia-Programmierung 2
R BufferStrategy vs. paintComponent Spiele- und Multimedia-Programmierung 9
S Probleme mit JMenu in einem JFrame mit BufferStrategy Spiele- und Multimedia-Programmierung 2
S BufferStrategy im JApplet Spiele- und Multimedia-Programmierung 3
J SNAKE-GAME-LOOP / (Applet zu Application) Spiele- und Multimedia-Programmierung 4
H Recheckte nacheinandergenerieren lassen (Applet) Spiele- und Multimedia-Programmierung 2
Rayo Slick Applet Spiele- und Multimedia-Programmierung 12
K Java3D als Applet ohne Installation von Java3d Spiele- und Multimedia-Programmierung 6
S Applikation aus Applet erstellen Spiele- und Multimedia-Programmierung 6
ruerob Eure Meinung über Applet-game Spiele- und Multimedia-Programmierung 12
F Problem mit KeyListener in Applet Spiele- und Multimedia-Programmierung 4
H Cell Invaders Applet Spiele- und Multimedia-Programmierung 99
J Tips für ein kleines Pong-Applet Spiele- und Multimedia-Programmierung 4
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
Z Multiplayer Applet RPG Spiele- und Multimedia-Programmierung 9
Quaxli Applet läuft nicht auf fremder WebSeite/Forum Spiele- und Multimedia-Programmierung 11
A Interaktion von J3D in einem Applet Spiele- und Multimedia-Programmierung 4
O Java3D-Applet ohne Java3D-Runtime ausführen Spiele- und Multimedia-Programmierung 2
G Linie im Applet zeichnen Spiele- und Multimedia-Programmierung 5
T Wie sprech ich das Java Applet mit PHP an? Spiele- und Multimedia-Programmierung 6
B Blender 3D in Java Applet realisieren Spiele- und Multimedia-Programmierung 2
H Tic Tac Toe / 3 Gewinnt OHNE Applet Spiele- und Multimedia-Programmierung 9
Y Applet für "Vier Gewinnt": Welche Klassen verwende Spiele- und Multimedia-Programmierung 10
Kidao Frame oder Applet oder Applet im Frame ? Spiele- und Multimedia-Programmierung 5
S 3d applet - online game Spiele- und Multimedia-Programmierung 4
F Brauche Hilfe bei Bewegung eines Rechtecks [Applet] Spiele- und Multimedia-Programmierung 5
G Pong-Klon (Applet!) Spiele- und Multimedia-Programmierung 4
G Breakout-Klon (Applet!) Spiele- und Multimedia-Programmierung 18
C OpenGl Support für Applet (sun.java2d.opengl=True) Spiele- und Multimedia-Programmierung 3
C Java3D-Applet bleibt weiss! Spiele- und Multimedia-Programmierung 10
M Java3D als Applet auf der Homepaeg Spiele- und Multimedia-Programmierung 7

Ähnliche Java Themen

Neue Themen


Oben