From Python to Android

Published October 29, 2014 by Janosch Henze, posted by redw0lf
Do you see issues with this article? Let us know.
Advertisement

I have published this article to my blog before, but because it is not so frequently visited and I did not find much advice for this subject I am writing the same article down here to share with everyone. This article is about porting a game written in python with pygame to Android. To do so we will use the pygame subset for Android, which can be obtained here. The pygame subset for android has ported a subset of the pygame architecture to the Android architecture. Hence it allows us to easily program games in python and port them to an Android application. This article will explain how to do so by using the breakout game, programmed by myself and obtainable here: breakoutgame.zip

In the end we will have a breakout game on our Android device which can be controlled by swipe gestures or by tilting? the android device itself. If you want to rebuild what we will build during this article you will need the following programs:

  • A Java Development Kit e.g. via Oracle? or OpenJDK
  • Python 2.7 and pygame obtainable here and here
  • Device Drivers for your Android device, if you are using Windows? and a little help for Linux here
  • pygame subset for Android (PGS4A), obtainable here

These programs are more or less needed if you want to run the breakout game itself and then later port it to your Android device. If you plan to skip this part and simply run the game on your local PC, the pygame library is not needed. The whole porting and programming is just one more click apart.

Setting everything up

The first three parts just need to be installed, either via a package management system if you are using Linux or by downloading and installing them if you are using Windows. PGS4A just needs to be extracted in a folder of your choice. As far as my project setup is concerned this looks like the following and can be viewed on github:

  • ./pgs4a/ directly containg all PGS4A stuff
  • ./pgs4a/breakout/ containing all the python source code and our main.py
  • ./pgs4a/breakout/data/ containing all images and so on for our game

This structure needs to be like this because PGS4A will only work this way. Now mostly everything is set up, except PGS4A - we will start with this. First you should test if everything is up and running for PGS4A by running: cd pgs4a ./android.py test

This should return green text stating All systems go!? This basically means that we met all prerequesites.

After this we need to install the corresponding Android SDK which can be done by executing ./android.py installsdk

This should start the installation of the needed Android SDK. During this installation you are asked to accept the TOS of the Android SDK and if you would like to create an application signing key, which is needed if you want to publish your application on the Play store.

You should answer both questions with yes. The key is needed later on for some signing purposes and the installation process. But be warned if you want to sell the application in the Play store you will need to recreate a key, because the key created during this process uses no password.

If you have finished successfully you will be rewarded with? It looks like you're ready to start packaging games.

Important: At this point you must make sure that you actually installed an SDK! You may get an error or a warning that the filter android-8 is not accepted. If you received such an error you need to manually install the Android 8 sdk. This can be done by running ./android-sdk/tools/android

androidSDKManager.png

Now the Android SDK manager should come up. You may need to update Tools before you actually see the same content as in the window above from there you can now install the Android API 8, which is needed to port pygame to Android. This will install the required API manually, which is needed because PGS4A has long not been updated. After this we are nearly ready to start porting our breakout pygame to Android.

Adding Android to breakout

In this part we are going to actually add the android device stuff to our game. For this purpose I would recommend you read through and download the source code. Now you should be capable of running the code within your python environment and be able to play the breakout game. If not make sure you have done everything right regarding the setup of your python and pygame. All modifications, and we do not have much modifications, are performed in the main.py, which includes the main function of our game. The modification includes importing the Android stack of PGS4A,? initializing? the Android stack, map Android-specific keys and adding some Android-specific stuff. Afterwards we should be capable of playing without further modifications to our game. Importing the Android package should be done below our standard imports in the main file. Hence we need to change the header with the imports to something which looks like this:


import pygame, sys, os, random from pygame.locals 
import * from breakout.data.Ball 
import Ball from breakout.data.Bar 
import Bar from breakout.data.Block 
import Block 

# Import the android module. If we can't import it, set it to None - this 
# lets us test it, and check to see if we want android-specific behavior. try: 
import android except ImportError: android = None 

Now we have imported the Android-specific commands and are able to ask if we can access them or not via the android variable. The next step would be to initialize the Android environment and map some keys, we do this after we initialized pygame and set some parameters:


def main(): 
  """this function is called when the program starts. it initializes everything it needs, then runs in a loop until the function returns.""" 
  # Initialize Everything 
  width = 800 
  height = 600 
  pygame.init() 
  
  screen = pygame.display.set_mode((width, height)) 
  pygame.display.set_caption('break0ut') 
  pygame.mouse.set_visible(0) 
  background = pygame.Surface(screen.get_size()) 
  background = background.convert() 
  background.fill((0, 0, 0)) 
  
  # Map the back button to the escape key. 
  if android: android.init() 
    android.map_key(android.KEYCODE_BACK, pygame.K_ESCAPE) 

At the bottom of the above code we checked if the Android package was loaded, if this is the case we initialize the android subsystem and map the back key of our Android device to the Escape key. So if we wanted to add a menu to our application which is normally called with the Escape key this would open the menu. In this particular example of breakout the Escape key will exit the game. Next we have to react to some Android-specific stuff, which is needed in each game. The game may be put into a pause mode, e.g. when the application is switched or the user tries to go back to the home screen. To react to this kind of? behavior? we have to add the specific code to our game loop:


# main game loop 
while 1: clock.tick(60) 
  # Android-specific: 
  if android: 
    if android.check_pause(): 
      android.wait_for_resume() 

This would wait for a resume of our application if our game application was set in the pause mode. Due to the checks for the android variable we are capable of playing the same game on the PC as well as on our Android device. If you want to start the PC version simply run the main.py and you are ready to go. With these last additions to our main source code, we are now capable of porting our breakout game to an Android Application and develop on the PC using our standard setup.

The porting process

Now we have reached the point were we want to put everything we have created so far to our Android device. To do so we need to configure our setup, which is easily done running the following command: ./android.py configure breakout Make sure that the breakout folder exists before you execute the command otherwise you will get some errors. After you have executed this command you will be asked several questions including the name of the application and the package. As far as the package is concerned make sure not to use any special characters including -, _ and so on, otherwise you will get errors later in the process. As far as the rest of the questions are concerned I have stuck to the default answers. After you have finished you should be able to see a file called .android.json in the breakout folder, which should look like this:


{
	"layout": "internal", 
	"orientation": "landscape", 
	"package": "net.sc.breakout", 
	"include_pil": false, 
	"name": "breakout", 
	"icon_name": "breakout", 
	"version": "0.1", 
	"permissions": ["INTERNET", "VIBRATE"], 
	"include_sqlite": false, 
	"numeric_version": "1"
}

The next and last step before we can play our game on our Android device is the compilation and the installation of the apk on our phone. Both is handled by the following command line: ./android.py build breakout release install Before you execute the command make sure you have created an assets folder.

If you have not the execution will fail and you are not capable of compiling the application. I guess the creator of the PGS4A forgot or did not implement stuff to create folders. Also as I mentioned before PGS4A is an old application and therefore may not work very well. If you have done everything correctly you should be able to play the game on your android device or the emulator you have connected or started. It should look very similar to the picture below. You should now be capable of porting any game created with pygame to android.

breakoutOnAndroid.png

 

Cancel Save
0 Likes 4 Comments

Comments

rbsupercool

Thanks a lot, it was a nice article. :) . I'll try the PGS4A soon..

October 30, 2014 02:56 PM
gasto

Cool, using Pygame games to port it on android. It seems like a dream became true.

October 31, 2014 10:46 PM
bulfinator

Hey. Thanks for putting this up it really helped me a lot. I cam across a few issues with pgs4a myself namely with the mixer module. Looping doesn't work and any workarounds I could find involved edditing the mixer module. See my answer to this stack overflow question for details - http://stackoverflow.com/questions/8458700/how-do-you-loop-music-in-pygame-subset-for-android/29279299#29279299

I had this quite quircky game I made using pygame and I managed to port it to android. I probably would have given up if I hadn't come across this.

Thanks a bunch Janosch.

I even put it up on google play - https://play.google.com/store/apps/details?id=org.brendanbulfin.firstreality

April 25, 2015 11:39 AM
bcl

when I ran the build I got an error that whitelist.txt could not be found. I created the file, but now I get another error that AndroidManifest.tmpl.xml cannot be found. Any help would be greatly appreciated. Thanks

August 21, 2015 02:45 AM
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!

Using the pygame subset for android allows us to easily port a game written with python and pygame to Android. Hence we are capable of developing a game in python on the PC and let it run on our favorite Android device.

Advertisement

Other Tutorials by redw0lf

redw0lf has not posted any other tutorials. Encourage them to write more!
Advertisement