Programm von Graphik abkapseln



  • hi peoplez

    ich wollte einfach mal mit nem freund zusammen ein simples spiel (snake) programmieren. allerdings auch nach allen regelnd er kunst, sprich sauber und gut designed

    da ich mich mit grafik nicht auskenne, er sich aber mit java applets auskennt dachten wir uns, ich mache den logischen teil er den graphischen
    naja wir haben kein plan wie man das machen könnte

    mittlerweile hab ich mir was applet wissen angeeignet und wir sollten beide in der alge sein alleine ein snake auf die beine zu stellen, allerdings nicht grafikunabhängig (sprich man gibt dem snake teil eine klasse oder so die für grafik zuständig ist und dann reicht das) sondern der appletteil und das spiel greifen ziemlich ineinander

    wie kann man sowas designen?



  • Du könntest für jedes Objekt Logik und Darstellung einfach in 2 Klassen Teilen. Die Klasse Schlange enthält dann z.B. nur die Logik und die Klasse SchlangeDarstellung enthält die Funktionen zur Darstellung, die benötigten Bilder etc.

    SchlangeDarstellung könnte dabei von Schlange erben oder eine Variable vom Typ Schlange haben. Beides hat so seine Vor- und Nachteile.



  • @Tobiking2:
    Das halte ich für keine so gute Idee. Wär doch ein wenig doppelt gemoppelt, wenn die Logik für sich steht, und die Darstellung aber von der Logik erbt.
    Oder hab ich dich da falsch verstanden?



  • Cox schrieb:

    @Tobiking2:
    Das halte ich für keine so gute Idee. Wär doch ein wenig doppelt gemoppelt, wenn die Logik für sich steht, und die Darstellung aber von der Logik erbt.
    Oder hab ich dich da falsch verstanden?

    du meinst jetzt tobiking oder?

    ich hab vorhin mal mit meinen bruder geredet der hat mal einen flipper geschrieben aber der meint auch das es recht schwer ist etwas sinnvoll von graphic abzukapseln...
    und theoretisch wenn man alles auslagert wird ja auch die performance beeinträchtigt von wegen methoden aufrufen und sowas (wobei das ja echt in dem stadium egal ist, premature optimizing)

    und wie könnte man ein menu aufgebaut aus den standart java.awt buttons (und dergleichen) da noch mit einbringen?

    achja noch ne offtopic frage:
    ich hab ein java applet tutorial durchgeguckt und da wurden die methoden keyDown, mouseDown sowie Thread (start stop und so) eingeführt
    mein compielr sagt aber das is veraltet und deprecated
    was ist denn der aktuelle pendant dazu?



  • Cox schrieb:

    @Tobiking2:
    Das halte ich für keine so gute Idee. Wär doch ein wenig doppelt gemoppelt, wenn die Logik für sich steht, und die Darstellung aber von der Logik erbt.
    Oder hab ich dich da falsch verstanden?

    Das Erben ist durch die stärkere Bindung auf jeden Fall nicht so flexibel wie die Variante mit der Variabel. Allerdings bietet es eine recht simple Möglichkeit Logik und Grafik zu trennen. Man kann halt jeder Funktion die Schlange als Parameter erwartet dann auch SchlangeDarstellung übergeben. Hat man vorher die Funktionen von Schlange festgelegt könnte man parallel die Darstellung entwerfen. Ansonsten kann man ohne Wissen über eine Klassen natürlich auch nicht die Darstellung implementieren.

    Die Variante mit der Variable ist etwas komplexer weil man Schlange und SchlangeDarstellung seperat erstellt und man darauf achten muss das die Darstellung auch immer eine Referenz auf das richtige Schlangen Objkekt besitzt. Dafür kann man Darstellungen recht problemlos austauschen.

    Skym0sh0 schrieb:

    und theoretisch wenn man alles auslagert wird ja auch die performance beeinträchtigt von wegen methoden aufrufen und sowas (wobei das ja echt in dem stadium egal ist, premature optimizing)

    Bevor Funktionsaufrufe sich spürbar bemerkbar machen braucht man sehr viele (tausende oder zehntausende) davon. Und wenn das eintrifft ist die Warscheinlichkeit recht groß das der JIT Compiler von Java diese irgendwann eliminiert. Da gibt es definitiv größere Performancefresser.

    Skym0sh0 schrieb:

    und wie könnte man ein menu aufgebaut aus den stan**** java.awt buttons (und dergleichen) da noch mit einbringen?

    Ich kenne mich mit Applets nicht so gut aus, aber meine das es ähnlich war wie bei normalen Swing Applikationen. Da könnte man zuerst einfach ein JPanel mit den Buttons anzeigen und sobald das Spiel gestartet wird, wird das Panel entfernt und man fügt das Panel auf dem gezeichnet wird in das Fenster/Applet.

    Skym0sh0 schrieb:

    achja noch ne offtopic frage:
    ich hab ein java applet tutorial durchgeguckt und da wurden die methoden keyDown, mouseDown sowie Thread (start stop und so) eingeführt
    mein compielr sagt aber das is veraltet und deprecated
    was ist denn der aktuelle pendant dazu?

    Vorrausgesetzt die Applets basieren auch auf Swing, gibt es für Tastatur- und Mausevents entsprechenden Listener: KeyListener und MouseListener. Das einfachste dabei ist wenn deine Applet Klasse die Interfaces KeyListener/MouseListener implementiert und sich selber als Listener hinzufügt. Das dürfte dann kaum Unterschied zu der Variante mit den deprecated Funktionen machen.

    Zum Thema Thread.stop kann ich eigentlich nur auf die Doku verweisen: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#stop()
    Ein Thread soll sich halt selber beenden und nicht irgendwo mitten in der ausführung gestoppt werden.



  • Vererbung ist hier falsch. Man braucht nur Komposition.

    class SnakeDraw {
        void setX(x)
        void setY(y)
    
        // draws the snake on x/y
        void draw()
    }
    
    class Snake {
        SnakeDraw snakeDraw = new SnakeDraw()
    
        // runs the game
        void run() {
            while (running) {
                input()
                snakeDraw.draw()
            }
        }
    
        // process input
        void input() {
            snakeDraw.setX(x)
            snakeDraw.setY(y)
        }
    }
    


  • Tobiking2 schrieb:

    Skym0sh0 schrieb:

    und theoretisch wenn man alles auslagert wird ja auch die performance beeinträchtigt von wegen methoden aufrufen und sowas (wobei das ja echt in dem stadium egal ist, premature optimizing)

    Bevor Funktionsaufrufe sich spürbar bemerkbar machen braucht man sehr viele (tausende oder zehntausende) davon. Und wenn das eintrifft ist die Warscheinlichkeit recht groß das der JIT Compiler von Java diese irgendwann eliminiert. Da gibt es definitiv größere Performancefresser.

    sag ich ja

    @DEvent:
    aber wie kann man das noch in ein reinzwiebeln?

    kennt jemand ne gute seite für java applications mit grafik?



  • Skym0sh0 schrieb:

    Tobiking2 schrieb:

    Skym0sh0 schrieb:

    und theoretisch wenn man alles auslagert wird ja auch die performance beeinträchtigt von wegen methoden aufrufen und sowas (wobei das ja echt in dem stadium egal ist, premature optimizing)

    Bevor Funktionsaufrufe sich spürbar bemerkbar machen braucht man sehr viele (tausende oder zehntausende) davon. Und wenn das eintrifft ist die Warscheinlichkeit recht groß das der JIT Compiler von Java diese irgendwann eliminiert. Da gibt es definitiv größere Performancefresser.

    sag ich ja

    @DEvent:
    aber wie kann man das noch in ein reinzwiebeln?

    kennt jemand ne gute seite für java applications mit grafik?

    Ich weis nicht was du meinst. Grafik fuer Java wird meist ueber das Drawable und das Drawable2D gemacht. Allerdings kannst du auch eine 2D Bibliothek wie Picolo benutzen.

    Und das Design der Klassen kannst du dir das MVC (Model View Controller) Pattern ansehen.



  • DEvent schrieb:

    Vererbung ist hier falsch. Man braucht nur Komposition.

    class SnakeDraw {
        void setX(x)
        void setY(y)
    
        // draws the snake on x/y
        void draw()
    }
    
    class Snake {
        SnakeDraw snakeDraw = new SnakeDraw()
    
        // runs the game
        void run() {
            while (running) {
                input()
                snakeDraw.draw()
            }
        }
    
        // process input
        void input() {
            snakeDraw.setX(x)
            snakeDraw.setY(y)
        }
    }
    

    Dein Snake entspricht jetzt aber eher einem SnakeController.
    Und die Position ist meiner Meinung etwas, was auch in einem Schlangen-Objekt mit nicht-grafischer Repräsentation gebraucht wird. Um z.B. zu berechnen, ob die Schlange gerade auf ne Wand trifft, oder eine andere Schlange frisst. Usw.



  • l'abra d'or schrieb:

    Dein Snake entspricht jetzt aber eher einem SnakeController.
    Und die Position ist meiner Meinung etwas, was auch in einem Schlangen-Objekt mit nicht-grafischer Repräsentation gebraucht wird. Um z.B. zu berechnen, ob die Schlange gerade auf ne Wand trifft, oder eine andere Schlange frisst. Usw.

    Stimmt, deswegen ist es ja auch Model, Controller und View. Die Position gehört in das Model, View ist zum Zeichnen und der Controller vermittelt.



  • ich mach hier einfahc mal rum und poste danach meine klassen kapselungen und den ganzen kram

    make it run, make it faster

    so nach dem prinzip programmier ich grad


Anmelden zum Antworten