getting initial game render/update loop working

Put problem concerning Views, Layouts and other XML-Resources (like AndroidManifest) here.

getting initial game render/update loop working

Postby supagu » Mon Jun 08, 2009 7:30 am

okay I've only just started stuffing around with android and java, I've got a spinning textured quad up, and now i went to set up some render and update loop.
I've looked in the SDK at the jetboy and luner lander sample and it looks like an awful lot of crap.

I want to separate out the view/renderer/application from my game:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. class Game
  3.  
  4. {
  5.  
  6.         public Game()
  7.  
  8.         {
  9.  
  10.                 mGame = this;
  11.  
  12.         }
  13.  
  14.        
  15.  
  16.         public void Init(GL10 gl, Resources res)
  17.  
  18.         {
  19.  
  20.                 mDevice = new Device(gl, res);
  21.  
  22.         mRB = mDevice.CreateRenderBuffer();
  23.  
  24.         mRB.CreateQuad(null);
  25.  
  26.         mTexture = mDevice.CreateTexture("icon");
  27.  
  28.         }
  29.  
  30.        
  31.  
  32.         public boolean Update()
  33.  
  34.         {      
  35.  
  36.                 return true;
  37.  
  38.         }
  39.  
  40.        
  41.  
  42.         public void Render()
  43.  
  44.         {
  45.  
  46.         mDevice.Begin();
  47.  
  48.        
  49.  
  50.         Matrix r1 = new Matrix();
  51.  
  52.         r1.SetIdentity();
  53.  
  54.         r1.SetRotateY(mAngle);
  55.  
  56.        
  57.  
  58.         Matrix r2 = new Matrix();
  59.  
  60.         r2.SetIdentity();
  61.  
  62.         r2.SetRotateX(mAngle*0.25f);
  63.  
  64.        
  65.  
  66.         Matrix m = new Matrix();
  67.  
  68.         m.SetIdentity();
  69.  
  70.         //m.SetScale(new Vector(0.5f, 0.5f, 0.5f));
  71.  
  72.         m = m.Multiply(r1);
  73.  
  74.         m = m.Multiply(r2);
  75.  
  76.         m.SetTranslation(new Vector(0, 0, -3.0f));
  77.  
  78.         mDevice.SetMatrix(m, Device.MatrixMode.Model);
  79.  
  80.  
  81.  
  82.         mDevice.Bind(mTexture);
  83.  
  84.         mDevice.Render(mRB);
  85.  
  86.        
  87.  
  88.         mAngle += 0.01f;
  89.  
  90.        
  91.  
  92.         mDevice.End();
  93.  
  94.         }
  95.  
  96.        
  97.  
  98.         public void Resize(int width, int height)
  99.  
  100.         {
  101.  
  102.                 mDevice.Resize(width, height);
  103.  
  104.         }
  105.  
  106.        
  107.  
  108.         static Game Get()
  109.  
  110.         {
  111.  
  112.                 return mGame;
  113.  
  114.         }
  115.  
  116.        
  117.  
  118.         static Game mGame;
  119.  
  120.        
  121.  
  122.  
  123.  
  124.     private Texture                     mTexture;
  125.  
  126.     private float                       mAngle;
  127.  
  128.     private Device                      mDevice;
  129.  
  130.     private RenderBuffer        mRB;
  131.  
  132. }
  133.  
  134.  
  135.  
  136. public class AppEntry extends Activity
  137.  
  138. {
  139.  
  140.     /** Called when the activity is first created. */
  141.  
  142.     @Override
  143.  
  144.     public void onCreate(Bundle savedInstanceState)
  145.  
  146.     {
  147.  
  148.         super.onCreate(savedInstanceState);
  149.  
  150.        
  151.  
  152.         mGame = new Game();
  153.  
  154.  
  155.  
  156.         requestWindowFeature(Window.FEATURE_NO_TITLE);
  157.  
  158.        
  159.  
  160.         mView = new AppView(getApplication());
  161.  
  162.         mRenderer = new AppRenderer(this);
  163.  
  164.         mView.setRenderer(mRenderer);
  165.  
  166.         setContentView(mView);
  167.  
  168.  
  169.  
  170.         //mThread.setState(Thread.STATE_RUNNING);
  171.  
  172.         //mThread.setState(Thread.STATE_READY);
  173.  
  174.     }
  175.  
  176.    
  177.  
  178.     private Game                        mGame;
  179.  
  180.     private AppView             mView;
  181.  
  182.     private AppRenderer         mRenderer;
  183.  
  184.     private AppThread           mThread;
  185.  
  186. }
  187.  
  188.  
  189.  
  190. class AppThread extends Thread
  191.  
  192. {
  193.  
  194.         @Override
  195.  
  196.     public void run()
  197.  
  198.         {
  199.  
  200.                 while (Game.Get().Update())
  201.  
  202.                 {
  203.  
  204.                 }
  205.  
  206.         }
  207.  
  208. }
  209.  
  210.  
  211.  
  212. class AppView extends GLSurfaceView
  213.  
  214. {
  215.  
  216.         public AppView(Application app)
  217.  
  218.         {
  219.  
  220.                 super(app);
  221.  
  222.         }
  223.  
  224.        
  225.  
  226.         @Override
  227.  
  228.         public boolean onKeyDown(int keyCode, KeyEvent event)
  229.  
  230.         {
  231.  
  232.             if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
  233.  
  234.             {
  235.  
  236.                 return true;
  237.  
  238.             }
  239.  
  240.             return super.onKeyDown(keyCode, event);
  241.  
  242.     }
  243.  
  244. }
  245.  
  246.  
  247.  
  248. class AppRenderer implements GLSurfaceView.Renderer
  249.  
  250. {
  251.  
  252.     public AppRenderer(Activity app)
  253.  
  254.     {
  255.  
  256.         mActivity = app;
  257.  
  258.     }
  259.  
  260.    
  261.  
  262.     public void onSurfaceCreated(GL10 gl, EGLConfig config)
  263.  
  264.     {
  265.  
  266.         Game.Get().Init(gl, mActivity.getResources());
  267.  
  268.     }
  269.  
  270.  
  271.  
  272.     public void onDrawFrame(GL10 gl)
  273.  
  274.     {
  275.  
  276.         Game.Get().Render();
  277.  
  278.     }
  279.  
  280.  
  281.  
  282.     public void onSurfaceChanged(GL10 gl, int width, int height)
  283.  
  284.     {
  285.  
  286.         Game.Get().Resize(width, height);
  287.  
  288.     }
  289.  
  290.    
  291.  
  292.     private Activity            mActivity;
  293.  
  294. }
  295.  
  296.  
Parsed in 0.042 seconds, using GeSHi 1.0.8.4


so the rendering is working fine, how ever the following problems exist:
1. onKeyDown never gets called, so cant get input for my game
2. getting a thread working to update the game. Is a thread even required? is there no application.update() ?
supagu
Developer
Developer
 
Posts: 32
Joined: Sun Jun 07, 2009 3:50 am

Top

Postby supagu » Tue Jun 16, 2009 10:36 am

:shock: is this really unknown to people?

attempt #2:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. package BlackCarbon.MarbleTilt;
  3.  
  4.  
  5.  
  6. import android.app.Activity;
  7.  
  8. import android.app.Application;
  9.  
  10. import android.content.res.Resources;
  11.  
  12. import android.graphics.Canvas;
  13.  
  14. import android.os.Bundle;
  15.  
  16. import android.os.Handler;
  17.  
  18. import android.os.HandlerThread;
  19.  
  20. import android.os.Message;
  21.  
  22.  
  23.  
  24. import android.opengl.GLSurfaceView;
  25.  
  26. import android.view.KeyEvent;
  27.  
  28. import android.view.SurfaceHolder;
  29.  
  30. import android.view.Window;
  31.  
  32.  
  33.  
  34. import javax.microedition.khronos.egl.EGLConfig;
  35.  
  36. import javax.microedition.khronos.opengles.GL10;
  37.  
  38.  
  39.  
  40. import BlackCarbon.Library.Device;
  41.  
  42. import BlackCarbon.Library.Matrix;
  43.  
  44. import BlackCarbon.Library.RenderBuffer;
  45.  
  46. import BlackCarbon.Library.Vector;
  47.  
  48. import BlackCarbon.Library.Texture;
  49.  
  50. import BlackCarbon.Library.Font;
  51.  
  52.  
  53.  
  54. class Game
  55.  
  56. {
  57.  
  58.         public Game()
  59.  
  60.         {
  61.  
  62.                 mGame = this;
  63.  
  64.         }
  65.  
  66.        
  67.  
  68.         public void Init(GL10 gl, Resources res)
  69.  
  70.         {
  71.  
  72.                 mDevice = new Device(gl, res);
  73.  
  74.         mRB = mDevice.CreateRenderBuffer();
  75.  
  76.         mRB.CreateQuad(null);
  77.  
  78.         mTexture = mDevice.CreateTexture("mini");
  79.  
  80.         mFont = mDevice.CreateFont("mini");
  81.  
  82.         }
  83.  
  84.        
  85.  
  86.         public boolean Update()
  87.  
  88.         {      
  89.  
  90.                 return true;
  91.  
  92.         }
  93.  
  94.        
  95.  
  96.         public void Render()
  97.  
  98.         {
  99.  
  100.         mDevice.Begin();
  101.  
  102.        
  103.  
  104.         Matrix r1 = new Matrix();
  105.  
  106.         r1.SetIdentity();
  107.  
  108.         r1.SetRotateY(mAngle);
  109.  
  110.        
  111.  
  112.         Matrix r2 = new Matrix();
  113.  
  114.         r2.SetIdentity();
  115.  
  116.         r2.SetRotateX(mAngle*0.25f);
  117.  
  118.        
  119.  
  120.         Matrix m = new Matrix();
  121.  
  122.         m.SetIdentity();
  123.  
  124.         //m.SetScale(new Vector(0.5f, 0.5f, 0.5f));
  125.  
  126.         m = m.Multiply(r1);
  127.  
  128.         m = m.Multiply(r2);
  129.  
  130.         m.SetTranslation(new Vector(0, 0, -3.0f));
  131.  
  132.         mDevice.SetMatrix(m, Device.MatrixMode.Model);
  133.  
  134.  
  135.  
  136.         mDevice.Bind(mTexture);
  137.  
  138.         mDevice.Render(mRB);
  139.  
  140.        
  141.  
  142.         mAngle += 0.01f;
  143.  
  144.        
  145.  
  146.         // lets draw some text
  147.  
  148.         Matrix textTransform = new Matrix();
  149.  
  150.         textTransform.SetIdentity();
  151.  
  152.         textTransform.SetTranslation(new Vector(-1.8f, -1.8f, -3.0f));
  153.  
  154.         mFont.RenderText(mDevice, textTransform, "Hello World!");
  155.  
  156.        
  157.  
  158.         mDevice.End();
  159.  
  160.         }
  161.  
  162.        
  163.  
  164.         public void Resize(int width, int height)
  165.  
  166.         {
  167.  
  168.                 mDevice.Resize(width, height);
  169.  
  170.         }
  171.  
  172.        
  173.  
  174.         static Game Get()
  175.  
  176.         {
  177.  
  178.                 return mGame;
  179.  
  180.         }
  181.  
  182.        
  183.  
  184.         static Game mGame;
  185.  
  186.        
  187.  
  188.  
  189.  
  190.         private Font                    mFont;
  191.  
  192.     private Texture                     mTexture;
  193.  
  194.     private float                       mAngle;
  195.  
  196.     private Device                      mDevice;
  197.  
  198.     private RenderBuffer        mRB;
  199.  
  200. }
  201.  
  202.  
  203.  
  204. class AppThread extends Thread
  205.  
  206. {
  207.  
  208.         AppThread(AppEntry application)
  209.  
  210.         {
  211.  
  212.                 mApplication = application;
  213.  
  214.         }
  215.  
  216.        
  217.  
  218.         public SurfaceHolder GetSurface()
  219.  
  220.         {
  221.  
  222.                 return mApplication.mView.getHolder();
  223.  
  224.         }
  225.  
  226.        
  227.  
  228.         @Override
  229.  
  230.     public void run()
  231.  
  232.         {
  233.  
  234.                 boolean bRunning = true;
  235.  
  236.         while (bRunning)
  237.  
  238.         {
  239.  
  240.                 bRunning = Game.Get().Update();
  241.  
  242.                
  243.  
  244.                 try
  245.  
  246.                 {
  247.  
  248.                                 sleep(20);
  249.  
  250.                         }
  251.  
  252.                 catch (InterruptedException e)
  253.  
  254.                         {
  255.  
  256.                                 // TODO Auto-generated catch block
  257.  
  258.                                 e.printStackTrace();
  259.  
  260.                         }
  261.  
  262.         }
  263.  
  264.         /*
  265.  
  266.                 SurfaceHolder surfaceHolder = GetSurface();
  267.  
  268.                 boolean bRunning = true;
  269.  
  270.         while (bRunning)
  271.  
  272.         {
  273.  
  274.             Canvas c = null;
  275.  
  276.             try
  277.  
  278.             {
  279.  
  280.                 c = surfaceHolder.lockCanvas(null);
  281.  
  282.                 synchronized (surfaceHolder)
  283.  
  284.                 {
  285.  
  286.                     //if (mMode == STATE_RUNNING)
  287.  
  288.                         bRunning = Game.Get().Update();
  289.  
  290.                        
  291.  
  292.                     //Game.Get().Render(); done below!
  293.  
  294.                 }
  295.  
  296.             }
  297.  
  298.             finally
  299.  
  300.             {
  301.  
  302.                 // do this in a finally so that if an exception is thrown
  303.  
  304.                 // during the above, we don't leave the Surface in an
  305.  
  306.                 // inconsistent state
  307.  
  308.                 if (c != null)
  309.  
  310.                 {
  311.  
  312.                         surfaceHolder.unlockCanvasAndPost(c);
  313.  
  314.                 }
  315.  
  316.             }
  317.  
  318.         }*/
  319.  
  320.     }
  321.  
  322.        
  323.  
  324.         public AppEntry mApplication;
  325.  
  326. }
  327.  
  328.  
  329.  
  330. class AppHandler extends Handler
  331.  
  332. {
  333.  
  334.         @Override
  335.  
  336.         public void handleMessage(Message msg)
  337.  
  338.         {
  339.  
  340.             super.handleMessage(msg);
  341.  
  342.         }
  343.  
  344. }
  345.  
  346.  
  347.  
  348. class AppView extends GLSurfaceView implements SurfaceHolder.Callback
  349.  
  350. {
  351.  
  352.         public AppView(Application app)
  353.  
  354.         {
  355.  
  356.                 super(app);
  357.  
  358.         }
  359.  
  360.        
  361.  
  362.         @Override
  363.  
  364.         public boolean onKeyDown(int keyCode, KeyEvent event)
  365.  
  366.         {
  367.  
  368.             return super.onKeyDown(keyCode, event);
  369.  
  370.     }
  371.  
  372.        
  373.  
  374.         private AppHandler mHandler = new AppHandler();
  375.  
  376. }
  377.  
  378.  
  379.  
  380. class AppRenderer implements GLSurfaceView.Renderer
  381.  
  382. {
  383.  
  384.     public AppRenderer(Activity app)
  385.  
  386.     {
  387.  
  388.         mActivity = app;
  389.  
  390.     }
  391.  
  392.    
  393.  
  394.     public void onSurfaceCreated(GL10 gl, EGLConfig config)
  395.  
  396.     {
  397.  
  398.         try
  399.  
  400.         {
  401.  
  402.                 Game.Get().Init(gl, mActivity.getResources());
  403.  
  404.         }
  405.  
  406.         catch (Exception e)
  407.  
  408.         {
  409.  
  410.                 e.printStackTrace();
  411.  
  412.         }
  413.  
  414.     }
  415.  
  416.  
  417.  
  418.     public void onDrawFrame(GL10 gl)
  419.  
  420.     {
  421.  
  422.         Game.Get().Render();
  423.  
  424.     }
  425.  
  426.  
  427.  
  428.     public void onSurfaceChanged(GL10 gl, int width, int height)
  429.  
  430.     {
  431.  
  432.         Game.Get().Resize(width, height);
  433.  
  434.     }
  435.  
  436.    
  437.  
  438.     private Activity            mActivity;
  439.  
  440. }
  441.  
  442.  
  443.  
  444. public class AppEntry extends Activity
  445.  
  446. {
  447.  
  448.     /** Called when the activity is first created. */
  449.  
  450.     @Override
  451.  
  452.     public void onCreate(Bundle savedInstanceState)
  453.  
  454.     {
  455.  
  456.         super.onCreate(savedInstanceState);
  457.  
  458.        
  459.  
  460.         mGame = new Game();
  461.  
  462.  
  463.  
  464.         requestWindowFeature(Window.FEATURE_NO_TITLE);
  465.  
  466.        
  467.  
  468.         mView = new AppView(getApplication());
  469.  
  470.         mRenderer = new AppRenderer(this);
  471.  
  472.         mView.setRenderer(mRenderer);
  473.  
  474.         setContentView(mView);
  475.  
  476.        
  477.  
  478.         // register our interest in hearing about changes to our surface
  479.  
  480.         SurfaceHolder holder = mView.getHolder();
  481.  
  482.         holder.addCallback(mView);
  483.  
  484.        
  485.  
  486.         mThread = new AppThread(this);
  487.  
  488.         mThread.start();
  489.  
  490.     }
  491.  
  492.    
  493.  
  494.     public Game                         mGame;
  495.  
  496.     public AppView                      mView;
  497.  
  498.     public AppRenderer          mRenderer;
  499.  
  500.     public AppThread            mThread;
  501.  
  502. }
  503.  
  504.  
Parsed in 0.051 seconds, using GeSHi 1.0.8.4


so i've got drawing and update
i just have no input which i think is the last bit i need to get working
supagu
Developer
Developer
 
Posts: 32
Joined: Sun Jun 07, 2009 3:50 am

Postby Iceman2 » Wed Jul 22, 2009 3:50 am

Just wondering if you got it to work. If so would appreciate you showing code.
Iceman2
Freshman
Freshman
 
Posts: 3
Joined: Sat May 02, 2009 9:36 pm

Top

Return to View, Layout & Resource Problems

Who is online

Users browsing this forum: No registered users and 6 guests