Notice: I have updated the code snippet. Please take a look at post #3. Updated to make the code more pure multi-threaded.
Link for the lazy ---> Link.
Android: I have created a multi-threaded Looper game loop. Please give feedback!
I recommend you to try OpenGL ES, it will be way more easy to use GLSurfaceView in the end
The reason I use a simple SurfaceView is done for demonstration purposes only. I don't want to give out intermediate levels of Android stuffs all of a sudden.
Anyway, thanks for the feedback, and you'll probably like this one.
[color=#FF0000]Multi-Threaded Looper game loop, version 2.0.
Basic class (version 2.0)
GameView class (version 2.0)
Again, please provide feedback. Thanks for viewing!
Anyway, thanks for the feedback, and you'll probably like this one.
[color=#FF0000]Multi-Threaded Looper game loop, version 2.0.
Basic class (version 2.0)
package ff.ff;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
public class Basic extends Activity implements Runnable {
Thread thread;
GameView view;
Looper loop;
public void onCreate(Bundle b){
super.onCreate(b);
view = new GameView(this);
setContentView(view);
}
//How to start off the Looper loop after initialization.
public void run(){
Looper.prepare();
loop = Looper.myLooper();
//You can set infinite amounts of Handler objects. Here, I set up 2 of them
//for demonstration.
view.setHandler(new Handler(), new Handler());
Looper.loop();
}
//How to quit a Looper loop.
public void onPause(){
super.onPause();
loop.quit();
boolean retry = true;
while (retry){
try{
thread.join();
retry = false;
}
catch (InterruptedException e){
retry = true;
}
}
view.onPause();
}
//How to begin the initialization of the Looper loop.
//Notice the Thread() begins here.
public void onResume(){
super.onResume();
thread = new Thread(this);
thread.setName("Activity Thread");
thread.start();
view.onResume();
}
}
GameView class (version 2.0)
package ff.ff;
import android.app.Activity;
import android.graphics.Canvas;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class GameView extends SurfaceView implements Runnable {
SurfaceHolder holder;
Thread gameThread;
volatile boolean running;
// Any amount of handlers here. You can also create an array of Handler objects
// to your heart's content.
Handler handler1;
Handler handler2;
//Etc...
public int red;
public int blue;
Runnable r1 = new Runnable() {
public void run() {
/*
* This is the place where you update your objects' states in. This is
* placed in the tick() method, which is used below.
*/
red++;
if (red > 255)
red = 0;
Log.d("handler 1", Integer.toString(red));
}
};
//Same goes for this Runnable and other future Runnable implementations.
Runnable r2 = new Runnable(){
public void run(){
blue++;
if (blue > 255)
blue = 0;
Log.d("handler 2", Integer.toString(blue));
}
};
public GameView(Activity a) {
super(a);
holder = getHolder();
}
public void setHandler(Handler h1, Handler h2) {
handler1 = h1;
handler2 = h2;
}
//Here's how you quit a thread. Since Thread.stop() is deprecated, this is the more accepted version.
//NOTE: Oracle devs should implement this new method to replace the old stop().
public void onPause() {
running = false;
boolean retry = true;
while(retry) {
try {
gameThread.join();
retry = false;
}
catch(InterruptedException e) {
retry = true;
}
}
}
//This is how you resume a paused thread. Notice the "volatile" boolean at the top.
//It's used here.
public void onResume() {
running = true;
gameThread = new Thread(this);
gameThread.setName("Game Thread");
gameThread.start();
}
public void run() {
while(running) {
tick();
/*
* This is where you do the rendering / drawing. The game loop's basic structure is now
* complete. As for the tweaking that may be missing, it's up to the developers to
* create and fix them.
*
* I only give out the basic template of the Multi-Threaded Looper game loop.
*
* 8/16/2012 - This is updated. It's now Multi-Threaded Looper game loop v2.0.
*/
if (holder != null) {
if (holder.getSurface().isValid()) {
Canvas c = holder.lockCanvas();
c.drawARGB(255, red, 255, blue);
holder.unlockCanvasAndPost(c);
}
}
}
}
public void tick() {
//Increase the number of Handlers here. For an array of Handler elements, create a for... loop.
if (handler1 != null)
handler1.post(r1);
if (handler2 != null)
handler2.post(r2);
//Etc...
}
}
Again, please provide feedback. Thanks for viewing!
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement