Difference between revisions of "FPC and SDL"

From Free Pascal wiki
Jump to navigationJump to search
Line 123: Line 123:
 
If sdl.pas and jedi-sdl.inc are in the directory of your program, you can omit <tt>-Fu<pathtosdl.pas files> -Fi<pathtosdl.inc files></tt>.
 
If sdl.pas and jedi-sdl.inc are in the directory of your program, you can omit <tt>-Fu<pathtosdl.pas files> -Fi<pathtosdl.inc files></tt>.
  
== Examples ==
+
== 实例 ==
  
 
Creating an empty SDL window:
 
Creating an empty SDL window:
 +
建立一个空的SDL窗口:
  
 
  program sdltest;<br>
 
  program sdltest;<br>
Line 131: Line 132:
 
  {$linklib SDLmain}<br>
 
  {$linklib SDLmain}<br>
 
  uses sdl;<br>
 
  uses sdl;<br>
  var scr: PSDL_Surface; // Our main screen<br>
+
  var scr: PSDL_Surface; // 我们的主屏幕<br>
 
  begin
 
  begin
   SDL_Init(SDL_INIT_VIDEO); // Initialize the video SDL subsystem
+
   SDL_Init(SDL_INIT_VIDEO); // 视始化 视频 SDL 子系统
   scr:=SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE); // Create a software window of 640x480x8 and assign to scr
+
   scr:=SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE); // 建立一个 640x480x8 的软件窗口并且分配给Scr。
   SDL_Quit; // close the subsystems and SDL
+
   SDL_Quit; // 关闭这个子系统和SDL
 
  end.
 
  end.
  

Revision as of 13:48, 14 April 2010

引言

关于SDL的详细信息,请访问 SDL homepage. 这个页面将解释如何在Free pascal中使用SDL, 在何处得到pascal 头文件。

获得在FPC中使用SDL的文件头

在安装 SDL 到你的系统后,你需要 pascal 头才以能在FPC上正常使用 SDL . 在版本 2.2.2之后, most SDL units are included with FPC itself. You can of course also download them from JEDI-SDL in case you need some bug fix or a unit not in the version shipped with FPC.

SDL headers from JEDI-SDL

See JEDI-SDL Home Page.

You can download JEDI-SDLv1.0 Beta..

You can also download and browse current CVS sources, see JEDI-SDL SourceForge CVS for instructions. In short, just do

  cvs -d:pserver:anonymous@jedi-sdl.cvs.sourceforge.net:/cvsroot/jedi-sdl login 

(when prompted for a password, simply press the Enter key)

  cvs -z3 -d:pserver:anonymous@jedi-sdl.cvs.sourceforge.net:/cvsroot/jedi-sdl co JEDI-SDLv1.0

After you downloaded (and eventually unpacked) JEDI-SDL sources, you want to be able to use these units in your programs. For the simplest scenario, just add the following lines to your fpc.cfg file:

 -Fi<jedi-sdl-path>/JEDI-SDLv1.0/SDL/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_Mixer/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_Image/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_Net/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_ttf/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/smpeg/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SFont/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_Sound/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDLMonoFonts/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDLSpriteEngine/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/Cal3D/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/ODE/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDLCtrls/Pas
 -Fu<jedi-sdl-path>/JEDI-SDLv1.0/SDL_flic/Pas

(where <jedi-sdl-path> is the path where you placed jedi-sdl sources).

Alternatively, you can copy all *.pas and *.inc files from these directories to one chosen directory, and add only this chosen directory to your fpc.cfg.

To test that everything works, you can compile and run one of numerous demo programs included, e.g.

 cd <jedi-sdl-path>/JEDI-SDLv1.0/SDLSpriteEngine/Demos/Oxygene/
 fpc -Sd Oxygene.dpr
 ./Oxygene

Note that all jedi-sdl code should be compiled in Delphi-compatible mode. Most jedi-sdl units include jedi-sdl.inc that already has the line {$mode delphi} added, but some example programs don't include jedi-sdl.inc. So be sure to compiled them with -Sd command-line option (or add {$mode delphi} directive).

SDL headers from FreePascal CVS (deprecated)

Get them using CVS:

cvs -d :pserver:cvs@cvs.freepascal.org:/FPC/CVS login

(password is 'cvs')

cvs -d :pserver:cvs@cvs.freepascal.org:/FPC/CVS -z3 co projects/contrib/sdl

Link title

Tips and tricks

SDL_mixer library

When using SDL_mixer, the call to Mix_OpenAudio MUST happen before the call to SDL_SetVideoMode, otherwise you will get a ( sometimes load ) audible pop.

SMPEG library

If you use SDL_mixer you'll notice that it's dependent on smpeg library. For modern Linux distros and FreeBSD this is not a problem (because smpeg is distributed with them), but it can be troublesome e.g. for Windows. You can get smpeg.dll for Windows from SDL_sound for Visual C sources.

Alternatively, you can simply modify the source of SDL_mixer.pas: remove smpeg from it's uses clause and comment out one line in the sources mentioning mp3s (it's a case near the end). Remember that you will also need to have SDL_mixer dll/so that is not linked to smpeg -- otherwise SDL_mixer library will depend on smpeg anyway.

Mac OS X specific issues

SDL Framework and SDL libraries

On Mac OS X, SDL uses Cocoa to setup the drawing window and to handle all events (such as keypresses). This is done using a small piece of code that is automatically called when the program starts up, and which subsequently calls a function with the name SDLmain. More information is available at http://www.libsdl.org/faq.php?action=listentries&category=7#55

There are however two different ways to package/distribute SDL for Mac OS X, and depending on which version you use, the procedure to get this startup code into your program is slightly different.

The framework version

This the version that you get when you download the Mac OS X version of SDL from libsdl.org. In this case, the startup code is only available in source form. It is located on the installation disk image, in the folder devel-lite. After copying the SDL.framework from the disk image to /Library/Frameworks and copying the devel-lite folder anywhere on your hard drive (e.g., in your home directory), you can compile it into libSDLMain.a by opening a Terminal session, navigating to the copied devel-lite folder, and executing the following commands:

gcc -c -o SDLMain.o SDLMain.m -I /Library/Frameworks/SDL.framework/Headers
ar r libSDLMain.a SDLMain.o
ranlib libSDLMain.a

You can then move the generated libSDLMain.a librray anywhere you want. To make sure the linker can find it when you compile SDL applications, pass the -Fl/full/path/to/folder/containing/libSDLMain.a command line parameter to the compiler.

The Unix library version

There is also a "classic Unix" version of SDL for Mac OS X (no framework, just a bunch of separate libraries), which you get if you compile SDL from sources, or if you install SDL using Fink or MacPorts. In this case, libSDLmain.a is already included in a compiled form. You just have to use the compiler's -Fl parameter, as explained in the previous section, to make sure that the linker can find this library.

For FPC 2.2.2 and later

The SDL unit included with FPC includes all necessary framework, library and main procedure name renaming statements, so you no longer have to do anything special. Just add the sdl unit to your program and everything will be taken care of. However, the remarks about libSDLMain in the above section still hold (libSDLMain.a is required by the SDL unit included with FPC).

Note that if you use the original units as distributed by the JEDI team, you may still need to follow the instructions in the section below.

For FPC 2.0.2 to 2.2.0

With fpc 2.0.2 to 2.2.0, and possibly also when using the original SDL units as distributed by the JEDI team, you have to use the -XMSDL_main command line option and tell the linker to include some frameworks:

1) install sdl, for example using fink.

2) Add the following to your program:

 {$linklib gcc}
 {$linklib SDLmain}
 uses sdl;

3) Then, this command line does it:

 fpc -XMSDL_main -k-L/sw/lib -k-lSDL -k-framework -kOpenGL -k-framework -kCocoa -Fu<pathtosdl.pas files> -Fi<pathtosdl.inc files> YourProgram.pas

If you installed the SDL libraries using fink, also add -k-L/sw/lib -k-lSDL to your fpc command.

If sdl.pas and jedi-sdl.inc are in the directory of your program, you can omit -Fu<pathtosdl.pas files> -Fi<pathtosdl.inc files>.

实例 

Creating an empty SDL window: 建立一个空的SDL窗口:

program sdltest;
{$linklib gcc} {$linklib SDLmain}
uses sdl;
var scr: PSDL_Surface; // 我们的主屏幕
begin SDL_Init(SDL_INIT_VIDEO); // 视始化 视频 SDL 子系统 scr:=SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE); // 建立一个 640x480x8 的软件窗口并且分配给Scr。 SDL_Quit; // 关闭这个子系统和SDL end.

You can then compile this code with

 fpc -Fu<pathtosdl.pas files> -Fi<pathtosdl.inc files> example.pas

If you use lazarus, make sure you fill the "other unit files" and "include files" properly.