CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Delphi/SDL] Algo de Damier

Kaoron
Kaoron
Niveau 9
31 juillet 2006 à 22:10:33

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.

Kaoron
Kaoron
Niveau 9
31 juillet 2006 à 22:16:09

Et en plus l´indentation est foutue en l´air... Bon courage a ceux qui liront.

fil_razorback
fil_razorback
Niveau 10
31 juillet 2006 à 22:18:26

Si je peux me permettre une question con, l´affichage des tiles commence à quel coin du damier (à l´écran) ?
Histoire de savoir si c´est bien la 5eme colonne qui deconne et pas la 3eme.

Kaoron
Kaoron
Niveau 9
31 juillet 2006 à 22:26:42

Il commence à gauche.

j´ai trouvé le problème... et je suis furieusement con! lol J´avais simplement oublié de virer les constantes dans la déclaration de TMap.

^^ Enjoy Boulettitude!

Fvirtman
Fvirtman
Niveau 10
31 juillet 2006 à 22:38:07

Arf, j´arrive trop tard :)

Ce que j´allais te conseiller, c´était que comme le carreau a la position 4,0 était faux (par exemple), de calculer a la main en regardant ton code, dans ton double for, la valeur du tile (en prenant i=4 et j=0

Mais tu l´as trouvé avant !
Enjoy !

Kaoron
Kaoron
Niveau 9
31 juillet 2006 à 22:52:42

Wrah... Désolé... j´irais moins vite la prochaine fois :p. J´avais déjà fait la trace sur l´algo. c´est pour ca que le problème était bizarre, et comme toute var est automatiquement initialisée en delphi... ben ca a pas buggé.

Vive la relecture complète!

Sinon vous n´auriez pas quelques conseils à me donner? Niveau structure c´est du bricolage du dimanche soir, et le nez dedans j´arrive pas a anticiper les objets qui pourraient ressortir.

Merci.

Fvirtman
Fvirtman
Niveau 10
31 juillet 2006 à 23:02:33

Une structure ?
Hum, disons que je ne sais pas exactement ce que tu veux faire. mais sinon, on peut considérer une fonction :

int GetTileType(int i,int j)
(je te le fais en C, en gros, une fonction qui prend un i et un j, et qui retourne le type)

A l´intérieur, tu mets ta formule
return (i + j) mod 2;

Et ainsi, tu fais abstraction de cette formule tout le long.

tu veux tracer ta grille ?

for(i=0;i<tailleX;i++)
for(j=0;j<tailleY;j++)
BlitTile(GetTileType(i,j));

tout simplement...

Le joueur est sur une case x,y : savoir le type ?
type = GetTileType(x,y);
Tout simplement

En gros, cela te permet d´isoler a un seul endroit la "structure" de ton terrain, et ensuite, tu en fais abstraction, c´est a dire que rien qu´en modifiant cette fonction, si tu veux, tu ne mets que des cases rouges ou alors un autre motif : sans altérer les autres fonctions.

C´était une petite idée, mais apres je ne sais pas exactement ce que tu veux...

Si tu as as MSN : fvirtman@hotmail.com

Kaoron
Kaoron
Niveau 9
31 juillet 2006 à 23:10:58

Arf non, je pensais structure du programme. Là je fais du procédural méga couplé (coupling? pas bieeeen).

J´apprends en même temps la syntaxe de delphi et le methodes de la SDL... (d´ailleurs la student edition 2003 de chez campuspress sur delphi6 est pas géniale... sont même pas foutus de mettre des renseignement équivalents à un simple en tête de fonction dans leur présentation du pascal objet...).
Alors mon cerveau met les concepts objets de coté et on verra plus tard. mais plus je fais ca, plus je m´embourbe. Enfin je me comprend.

MSN, ok J´ajoute!

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware