Case dynamique

Bruto Messages postés 214 Date d'inscription jeudi 21 mars 2002 Statut Membre Dernière intervention 14 mai 2004 - 4 nov. 2002 à 12:56
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 - 6 nov. 2002 à 23:53
Je suis entrain de développer un petit jeu et je dois créer un plateau de cases où l'utilisateur pourra se déplacer. Ces cases seront représentées par des objets de type TShape.
Afin de rendre une structure claire dans mon programme, j'utilise des classes spécifiques.
Pour exemple :

//Représente une case - options, ...
TCase = Class
private
FNum: Byte;
FAdjacant: array [1..AdjCase] of Integer;
FVisible: Boolean;
FCase: TShape;
FX:Integer;
FY:Integer;
public
...
end;

//Représente toutes les cases du plateau de jeu
TCases = Class
private
FTabCases: array [1..NbrCase] of TCase;
public
procedure Create(AOwner: TComponent);
procedure Init(Decal:TPoint);
end;

Remarquez que je possède une variable de FCase qui est l'objet TShape.

Mon problème est que je n'arrive pas à créer les cases sur une fenêtre.
Pouvez-vous m'aider de créer chaque case sur la fenêtre spécifiée sachant que je dois pouvoir manipuler ses propriétés via la classe TCases.
Ainsi j'atteinds une case avec un format du type :
FTabCases[Index].Num_Case := Index;
...

Dois-je modifier mon procédé ? ...
Merci.

;) Bruto --- Le p'tit belge --- pour vous servir

5 réponses

cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
4 nov. 2002 à 13:47
Cet avis n'engage que moi mais je n'aurai pas dans ce cas utiliser des classes mais des Record :
TCase = Record
FNum: Byte;
FAdjacant: array [1..AdjCase] of Integer;
FVisible: Boolean;
FCase: TShape;
FX:Integer;
FY:Integer;
end
Ensuite pour le tableau des cases, soit un tableau dynamique :
Cases:Array Of TCase
Soit une list :
Cases:TList;

Pour le tableau dynamique il suffit de faire SetLength(Cases,NbrCase) puis d'initialiser les propriété de chaque case.

Pour le TList regarde le source que j'ai déposé sur le site pour son utilisation.

Dans la cas du tableau dynamique, une fois que les cases sont définies, pour créer les cases il suffit de faire :
For Index:=0 To High(Cases) do With Cases[Index] Do
Begin
FNum:=Index;
Fshape:=TShape.Create(Form1);
FShape.Parent:=Form1; // ou autre
FShape.Top :=...
FShape.Left :=...
// et un truc qui te sera très utile :
FShape.Tag :=Index;
// ClickCase est une procédure à dénifir ( si besoin )
FShape.OnClick := ClickCase;
End;

Note à la fin de FShape.Tag:=Index; ainsi sur les évènement lié aux cases il est très facile de retrouver la case dans le tableau :
Procedure TForm1.ClickCase(Sender:TOBject)
Var LaCase:Integer;
Begin
LaCase:=TShape(Sender).Tag;
With Cases[LaCase] Do ...
End;

--- :sleepy) Nono du Moulin :sleepy) ---
0
Bruto Messages postés 214 Date d'inscription jeudi 21 mars 2002 Statut Membre Dernière intervention 14 mai 2004
4 nov. 2002 à 14:29
Ok je teste & je te fais signe si cela marche.
Il est vrai que Record sera plus facile.

PS : dois-je libérer chaque TShape de la mémoire même s'il appartient à une fenêtre ? ( comme il y a l'aspect dynamique, j'hésite )

Merci Nono40 pour ton aide ainsi qu'aux autres qui font de ce site un livre d'or.
Bonne prog à tous.

;) Bruto --- Le p'tit belge --- pour vous servir
0
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
4 nov. 2002 à 15:20
Non, il n'est pas nécessaire de libérer les TShape créés ainsi. Comme ils sont créés et associés à un propriétaire, le propriétaire se chargera de leur destruction.

--- :sleepy) Nono du Moulin :sleepy) ---
0
Bruto Messages postés 214 Date d'inscription jeudi 21 mars 2002 Statut Membre Dernière intervention 14 mai 2004
6 nov. 2002 à 18:21
Salut Nono40 & les autres,

voilà j'ai modifier mon source mais j'ai gardé l'option Class.

Le prob est que la méthode que tu m'as décrit ne marche pas à fond:

procedure TCase.Create(AOwner:TComponent);
begin
...
FCase := TShape.Create(AOwner);
FCase.Parent := AOwner;
...
end;

Si je mets un TWinControl au lieu du TComponent, alors il y a une violation ...
Mais si je laisse TComponent, il s'arrête sur :
FCase.Parent := AOwner;
& me dit qu'il y a une erreur --> type incompatible TWinControl & TComponent

Que dois-je faire pour que cela marche, je ne vois pas ?

Merci d'avance à tous pour l'aide.

;) Bruto --- Le p'tit belge --- pour vous servir
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
6 nov. 2002 à 23:53
Il FAUT mettre un TWinControl, car seuls les contrôles windows peuvent contenir d'autres controles ou composants.

Mais je ne pense pas que l'erreur vient de là. Je je t'avais conseillé des Record c'est à cause du principe de réservation de la mémoire. Quand tu définis un type
Type TMachin=Record...
Puis une variable
Var MonMachin:TMachin;
Alors l'espace mémoire occupé par MonMachin est réservé automatiquement.
Quand tu défini un typ
Type TMachin=Class (...)...
Puis une variable de type
Var MonMachin:TMachin;
La mémoire utilisée par mon machin n'est pas réservée tant que MonMachin.Create n'est pas appelée.

Dans ton exemple tu ne définis que les type, comment sont définie les instances ? Si tu veux utiliser les classes tel que tu le défini, il faut définir une instance pour les cases :
Var Cases:TCases;

Puis au début du programme allouer la mémoire pour créer l'intance :
Cases:=TCases.Create;
Mais ensuite tu à le même problème pour les cases elle-même, car les tableau FtabCases, ne contient pas les instances des cases tant que tu ne les a pas créées de toute pièce :
For i:=1 to NbrCase Do Cases.FTabCases[i]:=TCase.Create;
Ceci est aussi à effectuer à l'initialisation du programme.

Maintenant seulement tu as le droit d'utiliser les champ des cases et donc de créer les TShape.
With Cases.FTabCases[N] Do
Begin
FCase := TShape.Create(AOwner);
FCase.Parent := AOwner;
End;

Donc en resumé vérifie bien que dans ton programme tu crées bien des instances de tes classes avant de les utiliser !

( avec les Record tout est réservé par le compilateur, donc la gestion est plus simple dans ce cas)

--- :sleepy) Nono du Moulin :sleepy) ---
0
Rejoignez-nous