Je me suis attelé depuis ce matin a la conception d´un Moteur d´affichage isométrique en Delphi (pascal objet) avec la Librairie Jedi-SDL, et j´ai fini par rencontrer un problème, apparemment pas énormissime, mais que je ne comprends pas : en initialisant une map avec le simple aglorithme de damier ( Map[x,y]<= (x + y) mod 2; ), j´obtiens à l´affichage ce machin :
http://img505.imageshack.us/img505/7825/isotestsdlscreendi8.png
L´algo fonctionne correctement jusqu´a la 4eme colonne, et apres ca part en vrille.
Voilà le code source de mon prog (grassement inspiré (mais pas pompé) d´une démo livrée avec la SDL). Le code est un encore crade et pas parfaitement conceptualisé (en fait je fais du pas a pas en apprenant a me servir de la SDL, avec divers retours en arrière, changements de type, refonte de procédures...). Enfin bon, si vous pouviez y jeter un coup d´oeil.
NOTE : les parties entre accolades {...} sont soit des commentaires, soit du code inhibé (concepts pas terminés).
program iso_test_sdl;
uses
SysUtils,
SDL,
SDL_image,
Classes;
const
WINDOW_TITLE = ´Isometric test avec Delphi et JEDI-SDL´;
SCREEN_WIDTH = 640;
SCREEN_HEIGHT = 480;
SCREEN_BPP = 16;
type
TMapTile = record
Tile : Byte;
WalkEvent : Byte;
Walkable : boolean;
end;
TMap = record
Layer : Byte;
PosX : integer;
PosY : integer;
TileArray : array[0..3, 0..3] of TMapTile;
end;
TZone = record
GroundMapIndex : Byte;
MapList : array[0..4,0..3] of integer;
MapArray : array[0..3] of TMap;
end;
var
screen, image : PSDL_surface;
Map : TMap;
Maph : byte = 4;
Mapw : byte = 5;
{-------------------------------------------------
--------------}
function QuitEvent : boolean;
//Renvoie true si évenement de sortie
var
event: TSDL_EVENT;
done : boolean;
begin
done:=false;
while ( SDL_PollEvent( @event ) = 1 ) do
begin
if event.type_ = SDL_QUITEV then
begin
Done : = true;
end;
end;
result : = done;
end;
procedure Close();
begin
SDL_FreeSurface( Image );
SDL_Quit; //On quitte
end;
{-------------------------------------------------
----------------}
Procedure DrawMap(image : PSDL_surface);
{Affiche l´objet Map}
var
i,j : byte;
rectd, rects: TSDL_Rect;
begin
rects.w : = 128;
rects.h : = 64;
for i:=0 to maph do
begin
rectd.x : = (64*i);
rectd.y : = 200+(32*i);
for j:=0 to mapw do
begin
rects.x:= Map.TileArray[i][j].Tile *128;
rects.y:=0;
SDL_BlitSurface(image, @Rects, Screen, @
Rectd);
rectd.x : = rectd.x +64;
rectd.y : = rectd.y -32;
end;
end;
end;
Procedure InitMap{(Filename : string)};
//Initialise l´objet Map
var
{ FileStream : TFileStream;
C : Char;
Temp : Array[0..3,0..3]of Char;}
i, j : integer;
begin
{ Filestream:= TFilestream.Create(Filename,fmOpen
Read);
try
try}
for i : = 0 to Maph do
begin
for j : = 0 to Mapw do
begin
{ FileStream.ReadBuffer( C, SizeOf( C ) );}
Map.tilearray[i][j].tile:= ((i+j) mod 2);
end;
end;
{ except on E: Exception do
Log.LogError( E.Message, ´SetupMap´ );
end;
finally
FileStream.Free;
end; }
end;
{Procedure InitZone();
//Initialise un objet Zone
var
Zone : TZone;
i : integer;
Begin
end;}
var
Quit : boolean;
{-------------------------------------------------
-------------}
begin
if ((SDL_Init(SDL_INIT_VIDEO)=-1)) then //Initiali
sation SDL
begin
exit;
end;
SDL_WM_SetCaption(´Isometric test avec Delphi et
SDL´,nil); //Titre de la fenetre
screen:=SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGH
T,SCREEN_BPP,SDL_HWSURFACE); //Attributs de la fen
etres
image : = IMG_Load( PChar( ´grass.bmp´ ));
SDL_SetColorKey(image, SDL_SRCCOLORKEY or SDL_RLEACCEL,
SDL_MapRGB(image.format, 0, 0, 0));
SDL_ShowCursor(0); //Cache la souris
Quit:=false;
while ( not Quit ) do
begin
Quit:= QuitEvent ;
InitMap;
DrawMap(image);
SDL_Flip(Screen);
end;
SDL_ShowCursor(1);
Close;
end.