Hallo liebe Java-Forum-Community,
seit ca. einem Monat sitze ich nun an meinem ersten "größeren" Android-Game. Das Grundprinzip ist an Pou angelehnt. Man hat einen Character den man hochleveln kann, in dem man Minispiele spielt. Mit dem eigentilichen Coden komme ich auch gut klar, aber mir stellt sich eine Frage:
Der Code des MainThreads ist ja für alle Minispiele gleich.
Jetzt meine Frage:
Wir sind uns sicherlich alle einig, dass wenn man das für 10 Minispiele macht viel zu viele Dateien entstehen. Daher würde ich das ganze gerne abstracter machen. Jedes Minispiel extends von SurfaceView. Daher habe ich schon probiert eine Instance von Surfaceview im Constructor zu übergeben und dann mit einer switch-case zu schauen welches Game nun ausgeführt werden soll aber die idee habe ich sehr schnell wieder verworfen.
Jetzt meine Frage: War der Ansatz richtig? Sollte man das überhaupt "abstracter" machen? Hat jeden vielleicht einen neuen Ansatz für mich?
Danke schon mal im vorraus.
Grüße Robat
seit ca. einem Monat sitze ich nun an meinem ersten "größeren" Android-Game. Das Grundprinzip ist an Pou angelehnt. Man hat einen Character den man hochleveln kann, in dem man Minispiele spielt. Mit dem eigentilichen Coden komme ich auch gut klar, aber mir stellt sich eine Frage:
Der Code des MainThreads ist ja für alle Minispiele gleich.
Java:
public class MainThread extends Thread
{
////////////////////////////////
// Constances
////////////////////////////////
public static final int MAX_FPS = 30;
private static final String TITLE = "MainThread";
////////////////////////////////
// Fields
////////////////////////////////
public static Canvas canvas;
private double avarageFPS;
private boolean running;
private SurfaceHolder holder;
private GameView view; // kann sich ändern
////////////////////////////////
// Constructor
////////////////////////////////
public MainThread(SurfaceHolder holder, GameView view)
{
super();
this.holder = holder;
this.view = view;
}
////////////////////////////////
// Overriden Methodes
////////////////////////////////
/**
* If this thread was constructed using a separate
* <code>Runnable</code> run object, then that
* <code>Runnable</code> object's <code>run</code> method is called;
* otherwise, this method does nothing and returns.
* <p>
* Subclasses of <code>Thread</code> should override this method.
*
* @see #start()
* @see #stop()
*/
@Override
public void run()
{
// temporary vars
long startTime = 0;
long timeMillis = 1000/MAX_FPS;
long waitTime = 0;
long totalTime = 0;
long targetTime = 1000/MAX_FPS;
int frameCount = 0;
while(running)
{
startTime = System.nanoTime();
canvas = null;
try
{
canvas = this.holder.lockCanvas();
synchronized (holder)
{
this.view.update();
this.view.draw(canvas);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (canvas != null)
{
try
{
holder.unlockCanvasAndPost(canvas);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
timeMillis = (System.nanoTime() - startTime) / 1000000;
waitTime = targetTime - timeMillis;
try
{
if (waitTime > 0)
{
this.sleep(waitTime);
}
}
catch (Exception e)
{
e.printStackTrace();
}
totalTime += System.nanoTime() - startTime;
frameCount++;
if (frameCount == MAX_FPS)
{
avarageFPS = 1000/((totalTime/frameCount)/1000000);
frameCount = 0;
totalTime = 0;
Log.d("test", String.valueOf(avarageFPS));
System.out.println(avarageFPS);
}
}
}
////////////////////////////////
// Getters and Setters
////////////////////////////////
public void setRunning(boolean running)
{
this.running = running;
}
public double getAvarageFPS()
{
return avarageFPS;
}
}
Jetzt meine Frage:
Wir sind uns sicherlich alle einig, dass wenn man das für 10 Minispiele macht viel zu viele Dateien entstehen. Daher würde ich das ganze gerne abstracter machen. Jedes Minispiel extends von SurfaceView. Daher habe ich schon probiert eine Instance von Surfaceview im Constructor zu übergeben und dann mit einer switch-case zu schauen welches Game nun ausgeführt werden soll aber die idee habe ich sehr schnell wieder verworfen.
Jetzt meine Frage: War der Ansatz richtig? Sollte man das überhaupt "abstracter" machen? Hat jeden vielleicht einen neuen Ansatz für mich?
Danke schon mal im vorraus.
Grüße Robat
Zuletzt bearbeitet: