Here's a quick summary of things that may cause problems when moving your
code from one platform to another (you can find a more detailed version of
this in the docs section of the Allegro website).
The Windows and Unix versions require you to write END_OF_MAIN() after your
main() function, which is used to magically turn an ANSI C style main() into
a Windows style WinMain(), and so that the Unix code can grab a copy of your
argv[] parameter.
On many platforms Allegro runs very slowly if you rely on it to
automatically lock bitmaps when drawing onto them. For good performance, you
need to call acquire_bitmap() and release_bitmap() yourself, and try to keep
the amount of locking to a minimum.
The Windows version may lose the contents of video memory if the user
switches away from your program, so you need to deal with that.
None of the currently supported platforms require input polling, but it is
possible that some future ones might, so if you want to ensure 100%
portability of your program, you should call poll_mouse() and
poll_keyboard() in all the relevant places.
Allegro defines a number of standard macros that can be used to check
various attributes of the current platform, or to insulate you from some of
the differences between systems:
ALLEGRO_PLATFORM_STR
Text string containing the name of the current platform.
ALLEGRO_DOS
ALLEGRO_DJGPP
ALLEGRO_WATCOM
ALLEGRO_WINDOWS
ALLEGRO_MSVC
ALLEGRO_MINGW32
ALLEGRO_BCC32
ALLEGRO_UNIX
ALLEGRO_LINUX
ALLEGRO_BEOS
ALLEGRO_QNX
ALLEGRO_GCC
Defined if you are building for a relevant system. Often several of these
will apply, eg. DOS+Watcom, or Windows+GCC+MinGW32.
ALLEGRO_I386
ALLEGRO_BIG_ENDIAN
ALLEGRO_LITTLE_ENDIAN
Defined if you are building for a processor of the relevant type.
ALLEGRO_VRAM_SINGLE_SURFACE
Defined if the screen is a single large surface that is then partitioned
into multiple video sub-bitmaps (eg. DOS), rather than each video bitmap
being a totally unique entity (eg. Windows).
ALLEGRO_CONSOLE_OK
Defined if when you are not in a graphics mode, there is a text mode
console that you can printf() to, and from which the user could
potentially redirect stdout to capture it even while you are in a
graphics mode. If this define is absent, you are running in an
environment like Windows that has no stdout at all.
ALLEGRO_LFN
Non-zero if long filenames are supported, or zero if you are limited to
8.3 format (in the djgpp version, this is a variable depending on the
runtime environment).
INLINE
Use this in place of the regular "inline" function modifier keyword, and
your code will work correctly on any of the supported compilers.
ZERO_SIZE
Use this to declare zero sized arrays, eg. the "char *line[ZERO_SIZE]" in
the BITMAP structure. Some compilers want an actual zero there, while
others want nothing between the [], so this macro enables the same code
to work either way.
LONG_LONG
Defined to whatever represents a 64 bit "long long" integer for the
current compiler, or not defined if that isn't supported.
OTHER_PATH_SEPARATOR
Defined to a path separator character other than a forward slash for
platforms that use one (eg. a backslash under DOS and Windows), or
defined to a forward slash if there is no other separator character.
DEVICE_SEPARATOR
Defined to the filename device separator character (a colon for DOS and
Windows), or to zero if there are no explicit devices in paths (eg. Unix).
USE_CONSOLE
If you define this prior to including Allegro headers, the Windows version
will be set up for building a console application rather than the normal
GUI program.
END_OF_MAIN()
Putting this after your main() function will enable Windows programs to
work with a regular main() routine, so you don't need to change
everything to use WinMain().
|