Recent Changes - Search:

Site.SideBar

SDLTest


Makefile.android


all:
	i686-linux-android-gcc sdltest.c -I/opt/android/SDL-1.2.13/include -L/opt/android/SDL-1.2.13 -lSDL -lpthread -static -o sdltest

Makefile.linux


all:
	gcc sdltest.c `sdl-config --cflags --libs` -o sdltest


sdltest.c


#include <SDL.h>
#include <stdio.h>

//int X_RESOLUTION = 1024;
//int Y_RESOLUTION = 768;
// My avd is WGVA (800x480)
int X_RESOLUTION = 480;
int Y_RESOLUTION = 800;
int BPP = 24;

int fullscreen = 1;

const int DELAY = 1;

int quit = 0;

SDL_Surface *surface;
SDL_Surface *piDefender = NULL;
SDL_Surface *piStargate = NULL;

int game_selected = 0; // defender = 0, stargate = 1

void run_program() {
  //  if (game_selected) {
  //    system("mame -skip_gameinfo stargate");
  //}
  //else {
  //  system("mame -skip_gameinfo defender");
  //}
}

SDL_Surface *loadimage(const char *filename) {
  SDL_Surface *image;
  SDL_Surface *temp; 

  temp = SDL_LoadBMP(filename);
  if (temp == NULL) {
    printf("Unable to load bitmap: %s\n", SDL_GetError());
    return NULL;
  }

  image = SDL_DisplayFormat(temp);
  SDL_FreeSurface(temp);

  return image;
}

void Quit( int returnCode )
{
  /* clean up the window */
  SDL_Quit( );
  /* and exit appropriately */
  //exit( returnCode );
}

void init(int argc, char **argv) {
  int videoFlags;

  /* initialize SDL */
  if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
      fprintf( stderr, "SDL initialization failed: %s\n",
               SDL_GetError( ) );
      Quit( 1 );
    }

  //const SDL_VideoInfo *vid = SDL_GetVideoInfo();
  //X_RESOLUTION = vid->current_w;
  //Y_RESOLUTION = vid->current_h;

  /* get a SDL surface */
  //surface = SDL_SetVideoMode(X_RESOLUTION, Y_RESOLUTION, 0, SDL_DOUBLEBUF | SDL_ANYFORMAT | SDL_FULLSCREEN);
  surface = SDL_SetVideoMode(X_RESOLUTION, Y_RESOLUTION, 0, SDL_DOUBLEBUF | SDL_ANYFORMAT );

  /* Verify there is a surface */
  if ( !surface )
    {
      fprintf( stderr,  "Video mode set failed: %s\n", SDL_GetError( ) );
      Quit( 1 );
    }

  SDL_ShowCursor(SDL_DISABLE);

  /*
  //toggle_fullscreen();
  SDL_FreeSurface(surface);
  SDL_Surface* temp;  
  if (!fullscreen) {
    temp = SDL_SetVideoMode(X_RESOLUTION, Y_RESOLUTION, 0, SDL_DOUBLEBUF | SDL_ANYFORMAT | SDL_FULLSCREEN);
  }
  else {
    temp = SDL_SetVideoMode(X_RESOLUTION, Y_RESOLUTION, 0,  SDL_DOUBLEBUF | SDL_ANYFORMAT);
  }
  surface = temp;
  fullscreen = !fullscreen;
  */

}

/* function to handle key press events */
void handleKeyPress( SDL_keysym *keysym )
{
  switch ( keysym->sym )
    {
    case SDLK_ESCAPE:
      /* ESC key was pressed */
      quit = 1;
      break;
    case SDLK_q:
      /* ESC key was pressed */
      quit = 1;
      break;
    case SDLK_l:
      if (game_selected != 0) {
	game_selected = 0;
      }
      break;
    case SDLK_k:
      if (game_selected != 1) {
	game_selected = 1;
      }
      break;
    default:
      break;
    }

  return;
}

void check_input() {
  SDL_Event event;

  while ( SDL_PollEvent( &event ) )
    {
      switch( event.type )
	{
        case SDL_KEYDOWN:
          /* handle key presses */
          handleKeyPress( &event.key.keysym );
          break;
        case SDL_QUIT:
          /* handle quit requests */
          quit = 1;
          break;
        default:
          break;
        }
    }
}

void draw_scene() {
  SDL_Rect dest;
  SDL_Rect src;

  SDL_Surface *image;

  switch(game_selected) {
  case 0:
    image = piDefender;
    break;
  default:
    image = piStargate;
    break;
  }

  SDL_BlitSurface(image, NULL, surface, NULL);
  SDL_Flip(surface);  
}

void main_loop() {
  while(!quit) {
    if (DELAY) {
      SDL_Delay(5);
    }

    check_input();
    draw_scene();
  }
}

int main(int argc, char **argv) {
  init(argc,argv);

  // Load images
  //piDefender = loadimage("/data/misc/data/defender.bmp");
  //piStargate = loadimage("/data/misc/data/stargate.bmp");
  piDefender = loadimage("data/defender.bmp");
  piStargate = loadimage("data/stargate.bmp");






  // Main Loop
  main_loop();

  // It's embarassing and ridiculous, but SDL_Quit takes 3 seconds to run on 
  //   Ubuntu 10.04, so I'm avoiding SDL_Quit by toggling fullscreen and harshly 
  //   exiting the app.
  //SDL_Quit();
  return 0;
}


readme.txt


sdltest

This program runs in Android.  It displays two images.  Press the l and k keys to choose the image to display.  The Q key is for quit, which is inappropriate for android, and crashes the system.

Currently it is configured for the emulator mode with a 480x800 display.

Process to run it on Android:
make -f Makefile.linux
./sdltest
# Press l, k to change images, and q to quit.

Process to run it on Linux:
emulator -avd myavd &
make -f Makefile.android
adb push sdltest /data/misc/
adb shell mkdir    /data/misc/data/
adb push data/defender.bmp /data/misc/data/
adb push data/stargate.bmp /data/misc/data/
adb shell
# cd /data/misc
# ./sdltest

Major problems:
* Hitting the menu button doesn't return to the menu, the app remains.
* Quitting by pressing the Q key seems to basically crash the gui system.
* It is not in a java wrapper, so it is breaking some of the rules for sure.
* I can't run it on my device because I don't have root access.
* The app starts and overrides the locked screen!

Todo:
* Configure the application with a java wrapper.
** Run it without crashing on the emulator
** Run it on my phone.

Edit - History - Print - Recent Changes - Search
Page last modified on January 02, 2014, at 08:23 PM