Version 21 (modified by Anders Feder, 12 years ago) ( diff )

--

This page documents how 0 A.D. might be ported to the Android platform.

Plan

  1. Set up a generic Android NDK build environment.
  2. Find and adapt replacement libraries for every dependency in the PC edition.
  3. Port graphics and sound to OpenGL ES and OpenSL ES, respectively.
  4. Come up with a suitable UI for mobile devices.
  5. Implement the new UI on Android.
  6. Build the package with Android NDK and SDK.
  7. Publish the package on Android Market.
  8. Rock.

Target devices

Samsung Galaxy Nexus

  • 720×1280 px at 316 ppi
  • !16:9 aspect-ratio
  • 16M colors
  • Multi-touch, capacitive touchscreen

Design

User Interface

Due to the vastly different controls and form factor, the whole user interface of the game needs to be rethought for the Android edition.

Camera

Camera panning is performed by applying inverse swipe gestures on the screen:

  • Swipe down - pan camera up.
  • Swipe up - pan camera down.
  • Swipe left - pan camera right.
  • Swipe right - pan camera left.

Additionally, the further from the center of the screen the swiping motion begins, the faster the panning will be.

Camera rotation is performed by applying a circular swipe gesture on the screen:

  • Swipe clockwise - rotate camera clockwise.
  • Swipe counter-clockwise - rotate camera counter-clockwise.

The closer to the center the swiping motion begins, the faster the rotation will be, such that when a circular gesture is complete, the camera has completed a full rotation.

Camera zoom is performed by applying a pinching gesture on the screen:

  • Pinch in - zoom out.
  • Pinch out - zoom in.

The camera may also be panned by touching near the edge of the screen:

  • Touch near edge of screen - pan camera in the direction of the given edge.

The camera may also be panned by touching a position on the minimap:

  • Touch position on minimap - pan camera to the corresponding position on the map.

Entity selection

If touch is applied to an entity and immediately released, the entity is immediately selected.

  • Touch and release entity - immediately select entity.

If touch is applied to the game world for more than ~0,25s, a brief tactile feedback vibration is executed, and the interface enters 'selective mode.'

  • Touch game world for more than ~0,25s - enter 'selective mode' and execute brief tactile feedback vibration.

If a swipe began in an entity and ended in selective mode, a circular selection is drawn with its center in the entity where the gesture began and a radius equal the length of the swipe, and selective mode ends.

  • Complete swipe beginning in entity while in selective mode - draw circular selection with center in the entity and radius equal the length of the swipe and exit selective mode.

If a swiping began on terrain and ended in selective mode, a bounding box selection is drawn with one corner where the gesture began and the opposite corner where the gesture ended, and selective mode ends.

  • Complete swipe beginning on terrain while in selective mode - draw bounding box selection with one corner where the gesture began and opposite corner where the gesture ended and exit selective mode.

Libraries

Android-compatible replacements must be found for all the dependencies of the PC edition. This is what we have so far:

  • GCC - The Android NDK provides its own ndk-build tool for compiling.
  • Subversion - Assuming this is just for obtaining the source, this can be done on a PC workstation.
  • SDL - Is already ported to Android.
  • Boost - There is an unofficial port.
  • zlib - libz is part of the native NDK.
  • libpng - There's unofficial ports like this one.
  • libxml2 - Google publishes a tree that is tuned to compile on Android.
  • OpenGL - This must be ported to OpenGL ES.
  • OpenAL - This should be ported to OpenSL ES.
  • zip - Not sure which exact library this refers to?
  • libogg - May be covered by Tremor (below).
  • libvorbis - This can be done with Tremor.
  • libcurl - May be ported like this.
  • Gamin - Don't know about this one. It's used for monitoring file hotloading which doesn't seem as useful on an Android device.
  • CMake - All build tools are provided by the NDK.

In addition to the external dependencies above, the following are bundled with the game:

  • NVTT - We don't need any of its fancy features like CUDA support or image-loading tools, just the basic CPU-only compression library, so it should be buildable with no significant external dependencies (though its build system might need fixing).
  • Spidermonkey - Presumably, Spidermonkey has been ported as part of Fennec. We can't use Android's native V8 engine since we rely on some complex API features, so porting would be a huge amount of work. SpiderMonkey isn't API-compatible or behaviour-compatible across versions, so it'd be best to use the same 1.8.5 release as we use on PCs if possible; I think the standard releases are meant to work on ARM, so that should be okay.
  • Enet - From a quick check, I see no dependencies outside of libc, so this should compile natively.
  • FCollada - We use a customised/bugfixed version of FCollada, so a port of the standard version of FCollada probably wouldn't work. Our own version has no significant dependencies other than libxml2.

Implementation

This section will detail all the steps necessary to build the game for Android, so anyone can replicate it.

Note: See TracWiki for help on using the wiki.