Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android Codeschnipsel

Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

Das Thema "Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand" befindet sich unter Android Codeschnipsel auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 16.07.2009, 15:05   #1 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 25.06.2009
Beiträge: 51
Abgegebene Danke: 0
Erhielt 5 Danke für 4 Beiträge
Standard Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

Herzlich Willkommen zurück in meinem Gedankengut- ich hoffe, es ist nich zu wirr.
Wir haben es bisher geschafft, unser Menü zu steuern, und Spieledaten zu speichern. Das alles würde in Verbindung mit ein paar ListViews, etc. schon ausreichen um beispielsweise ein Börsenspiel zu programmieren.

Aaaber man will ja mehr. Echte Grafik beispielsweise. Android bietet hier eine so genannte SurfaceView, die wir als Basis für ein Grafikpanel nutzen wollen. Dieses Panel wird zudem IGameView implementieren, es soll ja in den Rest unseres Framework integriert werden können.
Code:
public class GamePanel extends SurfaceView implements
    SurfaceHolder.Callback, IGameView {
    protected IViewSetter viewSetter = null;
    protected GameThread thread = null;

    .... <-- Das aus dem vorherigen Teil muss auch noch rein

    /**
     * @param context
     */
    public GamePanel(Context context) {
        super(context);
        // Änderungen am Canvas werden hier verarbeitet
        this.getHolder().addCallback(this);
        // Gamethread erstellen
        this.thread = new GameThread(this);
        // das Panel ist fokussierbar
        this.setFocusable(true);
    }


    /**
     * @return
     * @see de.docjunior.androidengine.GameThread#isRunning()
     */
    public boolean isRunning() {
        return thread.isRunning();
    }

    /**
     * @param running
     * @see de.docjunior.androidengine.GameThread#setRunning(boolean)
     */
    public void setRunning(boolean running) {
        thread.setRunning(running);
    }

    /**
     * spielupdate
     */
    public void updateGame() {
        // TODO: Physikberechnungen, Objekt-KI, etc.
    }

    @Override
    public void onDraw(Canvas canvas) {
        // TODO: Darstellen der Objekte
    }


    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // tote Threads werden wieder erschaffen
        if (!this.thread.isAlive()) {
            this.thread = new GameThread(this);
        }

        // der thread wird gestartet
        thread.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean waiting = true;
        thread.setRunning(false);
        while (waiting) {
            try {
                this.thread.join();
                retry = false;
            } catch (InterruptedException e) {
            //versuche mit thread eins zu werden..
            }
        }
        Log.i(getClass().getSimpleName(), "Thread terminated...");
    }
}
Über Drawables, oder einfach Graphics-Primitive könnten wir im Android schon malen, auch das Abfangen von events ist ein sehr einfaches Unterfangen. Allerdings sieht es ein wenig unglücklich aus, wenn die Gegner sich nur bewegen, wenn man selbst irgendetwas getan hat. Dies ist der große Nachteil eventbasierter Softwaresysteme. Früher zu DOS-Zeiten gab es einen Mainloop der erst einmal geschaut hat, ob irgendetwas neues vom Spieler kam und anschließend die KI, sowie Grafiken aktualisierte.

Dies gilt es, jetzt nachzustellen. Hierbei hilft uns nach meiner Auffassung das Android-Framework nicht sonderlich. Der Java-Standard Allerdings schon. Java bietet die Möglichkeit, Funktionen über Threads parallel ablaufen zu lassen.

Wir schreiben uns also eine Klasse, die als parallel laufender Thread unser Spielefenster aktualisiert. Dies sollte nicht unbedingt permanent passieren. Unser Thread wird sich nach 25ms schlafen legen. Dies ermöglicht uns (je nach Rechenzeit der Einzelschritte) ca. 40 Frames pro Sekunde- mehr als ausreichend.

Threads sind mit Vorsicht zu genießen. Wenn man auf nicht direkt am Thread hängende Daten zugreift, kann das zu ziemlichen Zugrifssproblemen und zum Absturz des Programms führen. Wir müssen uns synchronisieren. Das Ganze kann dann so aussehen.

Code:
public class GameThread extends Thread {
    private boolean running = false;
    private GamePanel gamePanel;

    public boolean isRunning() {
        return running;
    }

    public void setRunning(boolean running) {
        this.running = running;
    }


    public GameThread(GamePanel pGamePanel) {
        this.gamePanel = pGamePanel;
    }

    /* (non-Javadoc)
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        while (isRunning()) {
            Canvas canvas = null;
            try {
            canvas = gamePanel.getHolder().lockCanvas();
            
            synchronized (gamePanel.getHolder()) {
                // spieledaten updaten
                gamePanel.updateGame();
                // spiel neu zeichnen
                gamePanel.onDraw(canvas);
                
            }
                sleep(25);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                if (canvas != null) {
                    gamePanel.getHolder().unlockCanvasAndPost(canvas);
                }
            }
        }
    }

    
}
So, nun kann man seinen canvas je nach Wunsch alle 25ms neu bemalen und das auch noch per Reaktion auf irgendwas. Die Reaktion eines Objekts würde ich an dieses anhängen. Wie, erkläre ich dann beim nächsten Mal. Möglicherweise kann dies etwas länger dauern. Ich hab auch sowas wie Familie und die hat ab jetzt frei..

Kritik und Diskussion sind wie immer erwünscht.
DocJunioR ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei DocJunioR für diesen Beitrag:
Luise Lustig (17.12.2009)
Alt 16.07.2009, 15:24   #2 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 25.06.2009
Beiträge: 51
Abgegebene Danke: 0
Erhielt 5 Danke für 4 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

Bevor noch jemand mosert: Der Code aus diesem Teil ist streckenweise einigen Quellen aus dem Internet entlehnt. Prinzipiell aber nicht einfach abgeschrieben, sondern entsprechend an mein Gedankengut angepasst.
DocJunioR ist offline   Mit Zitat antworten
Alt 16.07.2009, 16:09   #3 (permalink)
Android Guru

Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

threads ist eine allgemeine lösung

es gibt in android noch handler. ich hab schonmal darüber etwas updaten lassen. arbeiten im prinzip wie threads, nur halt ein wenig anders aufgebaut.

kann aber keine vergleiche ziehen, was besser ist
__________________
App Entwicklung
Latest apps: Media Streamer BETA | DailyCash | MoneyManager ( PRO | HD )
swordi ist offline   Mit Zitat antworten
Alt 16.07.2009, 17:32   #4 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 25.06.2009
Beiträge: 51
Abgegebene Danke: 0
Erhielt 5 Danke für 4 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

hatte sie mir im Vorfeld zu diesem Teil nochmal angesehen. Thematisch sind sie zum Verarbeiten von Nachrichten, ansonsten könnte man sie möglicherweise auch nutzen. kannst sie ja mal probieren und das Ergebnis posten. Interessiert mich auch

Geändert von DocJunioR (16.07.2009 um 17:36 Uhr)
DocJunioR ist offline   Mit Zitat antworten
Alt 16.07.2009, 17:47   #5 (permalink)
Android Guru

Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

ich habe sie schon als "art" thread benutzt. wenn ich zeit hab, kann ich das ungefähr mal hier rein posten. muss aber im moment meinen umzug organisieren
__________________
App Entwicklung
Latest apps: Media Streamer BETA | DailyCash | MoneyManager ( PRO | HD )
swordi ist offline   Mit Zitat antworten
Alt 16.07.2009, 19:39   #6 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 25.06.2009
Beiträge: 51
Abgegebene Danke: 0
Erhielt 5 Danke für 4 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

hat zeit. ich werd eh so weiter machen- bin unverbesserlich.

btw. hat schonmal wer es-opengl genauer angeschaut?
DocJunioR ist offline   Mit Zitat antworten
Alt 23.07.2009, 11:41   #7 (permalink)
Neuer Benutzer

Registriert seit: 13.07.2009
Beiträge: 16
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

Zitat:
Zitat von swordi Beitrag anzeigen
threads ist eine allgemeine lösung

es gibt in android noch handler. ich hab schonmal darüber etwas updaten lassen. arbeiten im prinzip wie threads, nur halt ein wenig anders aufgebaut.

kann aber keine vergleiche ziehen, was besser ist
Handler dienen der Implementierung eines Messaging-Systems
und haben mit Threads nicht mehr zu tun, als das letztere sie
zur Kommunikation nutzen können.

Bitte keine Äpfel und Birnen durcheinanderwerfen...
Lemonbaby ist offline   Mit Zitat antworten
Alt 23.07.2009, 11:51   #8 (permalink)
Android Guru

Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

ja sicher sind sie für ein messaging system gedacht, aber man kann sie so verwenden wie auch threads.

ob das jetzt resourcen technischen besser ist, sei mal dahingestellt.
__________________
App Entwicklung
Latest apps: Media Streamer BETA | DailyCash | MoneyManager ( PRO | HD )
swordi ist offline   Mit Zitat antworten
Alt 23.07.2009, 14:21   #9 (permalink)
Neuer Benutzer

Registriert seit: 13.07.2009
Beiträge: 16
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

Zitat:
Zitat von swordi Beitrag anzeigen
ja sicher sind sie für ein messaging system gedacht, aber man kann sie so verwenden wie auch threads.
android.os.Handler != android.os.HandlerThread

In einem anderen Thread beschwerte sich völlig zurecht ein
User darüber, dass hier Entwicklungsthemen sehr verwirrend
bis unverwertbar angehandelt werden. Eine gewisse sprach-
liche Präzision würde hier die Dinge deutlich verbessern. Du
selber magst wissen, wovon Du redest. Sinn dieses Forums
ist aber meiner Meinung nach, auch Usern, die ihre ersten
Schritte in Java machen, eine Hilfe zu sein und tiefere Ein-
blicke in fortgeschrittene Themen der Entwicklung zu geben.
Dazu muss auch mal bereit sein, etwas weiter auszuholen,
um nicht nur in reines Fachgesimpel zwischen erfahrenen
Entwicklern zu verfallen. Je mehr Details man verständlich
beschreibt, desto größer ist die Zielgruppe...
Lemonbaby ist offline   Mit Zitat antworten
Alt 23.07.2009, 15:11   #10 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 25.06.2009
Beiträge: 51
Abgegebene Danke: 0
Erhielt 5 Danke für 4 Beiträge
Standard AW: Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand

uuuh baby, baby its a wild world...
mädels, zerkloppt euch nicht gegenseitig deswegen. er mensch ist nunmal unpräzise. Verallgemeinerung ist immerhin die Stärke deuronaler Verdrahtungen...
DocJunioR ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Die beliebtesten Android Apps aus dem Android Market philipp_weide Foto und Multimedia 290 04.09.2011 17:59
Meine Gedanken zur Spieleprogrammierung - Teil 2 - Spielstandsdaten DocJunioR Android Codeschnipsel 6 16.07.2009 13:31
Meine Gedanken zur Spieleprogrammierung - Teil 1 - Spielstrukturen DocJunioR Android Codeschnipsel 3 16.07.2009 11:31
wo ist meine app im market? swordi Android App Entwicklung 7 04.06.2009 13:02




Du liest gerade: "Meine Gedanken zur Spieleprogrammierung - Teil 3 - Die Leinwand" unter "Android Codeschnipsel" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.