1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| (*
Codes sources SDL
sur developpez.com
URL : http://jeux.developpez.com/sources/sdl/
Graphisme > Affichage de points derrière le curseur
Ce programme affiche une suite de points à l'écran qui suivent le mouvement de la souris.
Code original en C : Mokona
Code traduit en Pascal : fab56
Version originale : 01/07/2006
Version traduite : 17/02/2007
Ce code-source utilise les en-tête SDL pour Pascal de la Jedi-SDL,
il devrait donc être compatible avec Free Pascal.
J'ai tenté d'être le plus fidèle possible au code original,
j'ai d'ailleurs gardés la plupart des commentaires.
*)
program Points;
uses
SDL,
SDL_image;
const
MAX_MOUSE_POS = 20;
var
{ Pointeur sur la surface représentant l'écran }
Screen : PSDL_Surface;
{ Le buffer de positions de la souris }
MouseX: array[0..MAX_MOUSE_POS] of Word;
MouseY: array[0..MAX_MOUSE_POS] of Word;
MousePos: Word;
Quit: Boolean;
{ Structure évenementiel }
Event: TSDL_Event;
{ Fonction d'affichage principale }
procedure Draw();
var
Rect: TSDL_Rect;
Color: Cardinal;
Index: Word;
begin
{ Définition de la couleur noire afin d'effacer l'écran }
Color := SDL_MapRGB (Screen.format, 0, 0, 0);
SDL_FillRect(Screen, nil, Color);
{ Définition de la couleur bleu pour afficher les carrés }
Color := SDL_MapRGB (Screen.format, 0, 0, 255);
{ Affichage de tous les carrés }
for Index := 0 to MAX_MOUSE_POS do
begin
{ Description du carré : 5 de côté, à la position indiquée par le buffer }
Rect.W := 5;
Rect.h := 5;
Rect.X := MouseX[Index];
Rect.Y := MouseY[Index];
SDL_FillRect (Screen, @Rect, Color);
end;
{ On utilise du double buffer, on change donc de buffer afin d'afficher }
SDL_Flip (Screen);
end;
begin
Quit:=False;
{ Initialisation de la partie Vidéo de SDL }
if ( SDL_Init (SDL_INIT_VIDEO) = -1 ) then
{ En cas d'échec, sortie }
Exit;
{ Demande d'affichage en 640x480 16 bits }
{ SDL_SWSURFACE : la surface est crée en RAM système }
{ SDL_DOUBLEBUF : on utilise deux buffers }
Screen := SDL_SetVideoMode (640, 480, 16, SDL_SWSURFACE or SDL_DOUBLEBUF);
SDL_WM_SetCaption(PChar('Graphisme -> Serpent'), nil);
{ En cas d'echec, on sort }
if (Screen = nil) then
Exit;
{ Boucle principale }
while not Quit do
begin
{ Lecture des évènements dans la queue d'évènements }
while (SDL_PollEvent (@event) > 0) do
begin
case Event.type_ of
{ Evenement de fermture d'application, on sort la boucle }
SDL_QUITEv: Quit:=True;
{ Evenement de mouvement de la souris, on enregistre la nouvelle position }
SDL_MOUSEMOTION: begin
MouseX[MousePos] := Event.motion.x;
MouseY[MousePos] := Event.motion.y;
Inc(MousePos);
if(MousePos = MAX_MOUSE_POS) then
MousePos := 0;
{ Affichage à l'écran }
Draw();
end;
end;
end;
end;
SDL_FreeSurface(Screen);
SDL_Quit;
end. |
Partager