Irgendwelche Fragen?
F.A.Q.
Registrieren Login

Jetzt einloggen

Verbinden mit:

Einloggen mit Facebook Einloggen mit Google
logo


Passwort vergessen?

Noch kein Mitglied?Jetzt Registrieren

PanjutorialsPanjutorials
  • Tutorials
    • Tutorials

    GameLoopThread - Geräteunabhängige Geschwindigkeit

    • Home
    • Tutorials
    • Android
    • Spiele App für Android 2.3.6 Programmieren
    • GameLoopThread - Geräteunabhängige Geschwindigkeit

    Zunächst brauchen wir erst einmal eine globale Variable:

    
    static final long FPS = 20;
    
    

    Wobei FPS für Frames Per Second steht und wir diesen Wert (statisch) auf 20 setzen.

    Damit nun die Geschwindigkeit der Sprites geräteunabhängig ist, brauchen wir erst einmal eine long Variable TPS (Ticks Per Second) die 1000/FPS ist, also wie viele Millisekunden ein Tick zur Verfügung hat. Dann noch zwei long Variablen für die Startzeit und Schlafzeit die wir alle drei in unserer run() Methode oben einfügen:

    
    long TPS = 1000 / FPS;
    long startTime, sleepTime;
    
    

    Danach sorgen wir noch dafür, dass unsere App nicht zu viel Rechenleistung braucht und lassen unsere App für eine Weile schlafen. Um zu bestimmen wie lange wir sie schlafen lassen sollen benötigen wir unsere Variable sleeptime. Die nichts anderes ist, als die Zeit die wir für einen Tick zur Verfügung haben, minus die Zeit die das Smartphone für das Malen gebraucht hat. Sollte diese kleiner als 0 sein, dann soll die App für 10 Millisekunden schlafen. Somit fügen wir folgenden Code in unsere run()- Methode ein:

    
    sleepTime = TPS - (System.currentTimeMillis() - startTime);
    
    startTime = System.currentTimeMillis();
    
    try { 
    	if (sleepTime > 0) sleep(sleepTime); 
    	else sleep(10); 
    } catch (Exception e) { 
    
    }
    
    

    Damit sich das Bild nun nicht nur von oben nach unten bewegt und dann stehen bleibt, müssen wir unsere Methode onDraw in der GameView Klasse noch modifizieren:

    
    @Override
    protected void onDraw(Canvas canvas) {
    	canvas.drawColor(Color.DKGRAY);
    	if(y == getHeight() - bmp.getHeight()){
    		ySpeed = -1;
    	}
    	else if (y==0){
    		ySpeed = 1;
    	}
    	y= y +ySpeed;
    	canvas.drawBitmap(bmp, 25, y, null);
    }
    
    

    Wenn die y-Position unseres Bildes nun der Höhe des Canvas minus der Höhe des Bildes entspricht, soll die Geschwindigkeit des Bildes umgekehrt werden. Und das Gleiche soll geschehen, wenn das Bild bei der y-Position 0 (also dem oberen Rand) angekommen ist. Damit sich die y-Position nun auch in Abhängigkeit von der Geschwindigkeit bewegt, brauchen wir die Zeile:

    
    y= y +ySpeed;
    
    

    Die nichts anderes sagt, als dass die neue y-Position die alte y-Position + die y-Geschwindigkeit sein soll.

    Am Ende dieses Tutorials sehen die Klassen folgendermaßen aus:

    GameLoopThread Class

    
    package com.panjutorials.lazypudding;
    
    import android.annotation.SuppressLint;
    import android.graphics.Canvas;
    
    public class GameLoopThread extends Thread {
    	static final long FPS = 20;
    	private GameView theView;
    	private boolean isRunning = false;
    
    	public GameLoopThread(GameView theView) {
    		this.theView = theView;
    	}
    
    	public void setRunning(boolean run) {
    		isRunning = run;
    	}
    
    	@SuppressLint("WrongCall") @Override
    	public void run() {
    		long TPS = 1000 / FPS;
    		long startTime, sleepTime;
    		while (isRunning) {
    			Canvas theCanvas = null;
    			startTime = System.currentTimeMillis();
    			try {
    				theCanvas = theView.getHolder().lockCanvas();
    				synchronized (theView.getHolder()) {
    					theView.onDraw(theCanvas);
    				}
    			} finally {
    				if (theCanvas != null) {
    					theView.getHolder().unlockCanvasAndPost(theCanvas);
    				}
    			}
    			sleepTime = TPS - (System.currentTimeMillis() - startTime);
    			try {
    				if (sleepTime > 0)
    					sleep(sleepTime);
    				else
    					sleep(10);
    			} catch (Exception e) {
    
    			}
    		}
    	}
    }
    
    

    GameView Class

    
    package com.panjutorials.lazypudding;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    public class GameView extends SurfaceView {
    
    	private SurfaceHolder surfaceHolder;
    	private Bitmap bmp;
    	private GameLoopThread theGameLoopThread;
    	private int y = 0;
    	private int ySpeed;
    
    	@SuppressLint("WrongCall") public GameView(Context context) {
    		super(context);
    		theGameLoopThread = new GameLoopThread(this);
    		surfaceHolder = getHolder();
    		surfaceHolder.addCallback(new SurfaceHolder.Callback() {
    
    			public void surfaceDestroyed(SurfaceHolder holder) {
    				boolean retry = true;
    				theGameLoopThread.setRunning(false);
    				while(retry){
    					try {
    						theGameLoopThread.join();
    						retry=false;
    					}
    					catch(InterruptedException e) {
    
    					}
    				}
    
    			}
    
    			public void surfaceCreated(SurfaceHolder holder) {
    				theGameLoopThread.setRunning(true);
    				theGameLoopThread.start();
    			}
    
    			public void surfaceChanged(SurfaceHolder holder, int format, int width,
    				int height) {
    				// TODO Auto-generated method stub
    
    			}
    		});
    		bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    	}
    
    	@Override
    	protected void onDraw(Canvas canvas) {
    		canvas.drawColor(Color.DKGRAY);
    		if(y == getHeight() - bmp.getHeight()){
    			ySpeed = -1;
    		}
    		else if (y==0){
    			ySpeed = 1;
    		}
    		y= y +ySpeed;
    		canvas.drawBitmap(bmp, 25, y, null);
    	}
    
    }
    
    
    Vorherig GameLoopThread - Bewegung von Bildern
    Nächste Der Sprite


    Kostenlos

    Spiele App für Android 2.3.6 Programmieren

    • Android 2.3.6 Spiele App Programmieren

      • Lektion1.1
        Vorschau
        Teaser Entwicklung eines Android Spiels
      • Lektion1.2
        Vorschau
        Installation von Java SDK & Eclipse
      • Lektion1.3
        Vorschau
        Download und Installation des Android SDK
      • Lektion1.4
        Vorschau
        Erste App - GameActivity, SurfaceView
      • Lektion1.5
        Vorschau
        GameLoopThread - Bewegung von Bildern
      • Lektion1.6
        Vorschau
        GameLoopThread - Geräteunabhängige Geschwindigkeit
      • Lektion1.7
        Vorschau
        Der Sprite
      • Lektion1.8
        Vorschau
        Animation eines Sprites
      • Lektion1.9
        Vorschau
        Die vier verschiedenen Sprites
      • Lektion1.10
        Wie mache ich am besten weiter?
      • Lektion1.11
        Vorschau
        Erschaffung von Sprites mit zufälliger Farbe
      • Lektion1.12
        Vorschau
        Touchevents und Spritekollision
      • Lektion1.13
        Vorschau
        Rand auf Canvas Zeichnen
      • Lektion1.14
        Vorschau
        Randfarbe auf dem Canvas ändern
      • Lektion1.15
        Vorschau
        Score auf dem Canvas anzeigen lassen
      • Lektion1.16
        Vorschau
        Density - Sachen in gleichem Verhältnis zeichnen
      • Lektion1.17
        Vorschau
        Leben anzeigen
      • Lektion1.18
        Vorschau
        XML - Layouts
      • Lektion1.19
        Vorschau
        Fertigstellung des Gameoverlayouts
      • Lektion1.20
        Vorschau
        Activitys und wie sie funktionieren
      • Lektion1.21
        Vorschau
        Androidmanifest
      • Lektion1.22
        Vorschau
        GameOverActivity - OnClickListener & Intents
      • Lektion1.23
        Vorschau
        Aufrufen der GameOverActivity
      • Lektion1.24
        Vorschau
        Highscore & das Speichern von Werten via SharedPreferences
      • Lektion1.25
        Vorschau
        Highscore & neuesten Score anzeigen lassen
      • Lektion1.26
        Vorschau
        Ladescreen (SplashActivity)
      • Lektion1.27
        Vorschau
        Das Menü - Übungsaufgabe
      • Lektion1.28
        Vorschau
        Dialog – ein Layout über dem SurfaceView anlegen
      • Lektion1.29
        Vorschau
        Den Dialog anzeigen lassen & onBackPressed()
      • Lektion1.30
        Vorschau
        Den Canvas Transparent übermalen
      • Lektion1.31
        Vorschau
        ToggleButton die Vibration einrichten
      • Lektion1.32
        Vorschau
        Sound - Mediaplayer
      • Lektion1.33
        Vorschau
        Fehlerbehebung
      • Lektion1.34
        Vorschau
        Custom Buttons
      • Lektion1.35
        Vorschau
        Timer erzeugen und anzeigen - Teil 1
      • Lektion1.36
        Vorschau
        Timer erzeugen und anzeigen - Teil 2
      • Lektion1.37
        Vorschau
        Heartsprites
      • Lektion1.38
        Vorschau
        Temporäre Sprites
      • Lektion1.39
        Vorschau
        Schöner machen

    Beliebte Kurse

    Spiele entwickeln mit Unity 3D – Erstelle eigene Games in C# - Starter

    Willkommen zum kostenlosen Teil des Kurses: "Spiele entwickeln mit Unity...
    Kostenlos

    Werde zum iOS 11 & Swift Entwickler in 6 Wochen - Starter

    Willkommen zum kostenlosen Teil des Kurses: "Werde zum iOS 11...
    Kostenlos

    Werde zum kompletten Web - Entwickler in nur 6 Wochen - Starter

    Willkommen zum kostenlosen Teil des Kurses: "Werde zum kompletten Web...
    Kostenlos
    Zu den Kursen

    Info

    • About Us
    • Kontakt
    • Blog

    Seite

    • Tutorials

    Support

    • FAQs
    • AGB
    • Impressum und Datenschutzerklärung

    Panjutorials | 2017