Rechercher - Liste des utilisateurs
Version complète : Débutants
Accueil » FunDelphi » Débutants
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
sjrd
Non ça ne pose pas de problème si tu les mets dans les deux.

Tu es sûr que tu n'en avais pas enlevée une de trop ?
DerF_44
Euh.. En fait je pense qu'effectivement après ma manip' brutale, 2 ou 3 unités se sont trouvées absentes !!
J'ai donc retenté la chose en sélectionnant les unités une par une, tranquillement et à tête reposée,
en vérifiant bien tous mes uses de tous mes .fnd et …… C'est OK !!
Ma liste Fichier|Unités utilisées… est grandement allégée et tout semble fonctionner nickel !!


Merci !


PS: Par contre re-voici des petits bug report depuis quelques temps (rien à voir avec la manip' des unités !)
alors que mon projet est trèèèès loin d'être complet !!!
Moi qui croyais écrire correctement le FunDelphi !..
Ils n'apparaissent uniquement que lorsque mon .fnd principal (et seulement lui !) est ouvert et que je compile !..
Pas de bug report si tous les source sont ouverts ou le principal + un ou quelques uns d'autres !! Bizarre !!..
Mais bon, pour l'instant : Même pas peur !
DerF_44
Bon, c'est décidé et c'est parti : J'attaque une re-re-écriture complète de mon projet !!!
Les deux raisons principales sont :
Un découpage et un agencement de mes unités plus judicieux d'une part, (enfin, j'essaye !!)
et la découverte toute récente des attributes !.
Dans mon unité principale je déclare BoxNb : Integer dans mes attributes, et, toujours dans mon unité principale,
je souhaite “appeler” une procedure qui se trouve dans une unité secondaire…
Petit blèm : Dans ma procedure (in unité secondaire) impossible de faire reconnaître un Player.BoxNb !!?
Je précise que mon unité secondaire est déclarée dans les uses de mon unité principale..
Qu'ai-je encore manqué !!??…

MàJ du post :

Yesss !!.. Il m'a suffit de “re-déclarer” mon BoxNb dans un attributes de l'unité secondaire !!!
C'est vraiment fun le FunDelphi !!!
Mais je laisse ce post pour obtenir confirmation de la légitimité de mon “bricolage” !!
Merci.
sjrd
Euh ouais c'est un peu bizarre ton bricolage.

Je rappelle que, depuis une unité A, on peut “voir” tout ce qui est dans une unité B qui est dans les uses de A, mais pas l'inverse.
C'est ton unité secondaire qui devrait uses l'unité où est déclaré l'attribut BoxNb.
DerF_44
Aïe !.. Oui c'est encore très abstrait pour moi tous ces “cheminements” de déclarations !.
Ok, bon alors j'ai viré mon BoxNb de attributes de l'unité principale pour le poser dans la secondaire, et c'est ok..
Mais je trouve la “logique” un peu particulière de déclarer un élément dans l'unité B alors que principalement utilisé dans l'unité A !?..
DerF_44
J'ai besoin d'une astuce technique, mais quasi-mathématique aussi !.
Comme ça fait 2 aprèm' que je suis dessus, je me permets de soumettre mon problème ici
parce qu'il est fort possible qu'un magicien trouve la soluce en une poignée de secondes !
J'ai réalisé une petite animation du déplacement du joueur sur le plateau de jeu de mon projet :
Attention : Lorsque j'écris “case” il s'agit d'une case du plateau de jeu, et non d'une case de Map !
attributes
Compartment: Integer; //--------------------------n° de case où se trouve le joueur
CompartmentForMove: Integer; //----------------cases incrémentées par la varaible I (pour l'animation)
SquareExe: Boolean; //----------------------------si True, effet sur la case executé

procedure CompartmentDestination(Player: TPlayer);
var
Dest: TQualifiedPos;

begin
Dest.Map := Player.Master.Map['GameBoardMap'];

case Player.CompartmentForMove of
0: Dest.Position := Point3D(01, 15, 1);
1: Dest.Position := Point3D(01, 19, 1);
//--------------------------------------------etc...
63: Dest.Position := Point3D(16, 10, 1);
end;

if Player.SquareExe = True then
Player.MoveTo(Dest,true)
else
Player.MoveTo(Dest,false);

end;

effect TDices
//---------------blabla etc, tirage de 2 dés donne "DicesResult"

I := Player.Compartment + 1; //--------pour commencer l'animation à la case suivante
Player.Compartment := Player.Compartment + DicesResult; //-----prochaine case à atteindre

if Player.Compartment > 63 then //---------là je pense que cette condition n'est pas placée au bon endroit !.
Player.Compartment := 126 - Player.Compartment; //------si le joueur dépasse la case n°63, il retourne en arrière

Player.SquareExe := False;

while I < Player.Compartment do //--------début de l'animation
begin
Player.CompartmentForMove := I; //---le joueur va donc "survoler" les cases une à une
CompartmentDestination(Player);
Sleep(300);
Inc(I);
end; //---------------------------------------fin de l'animation lorsque le n° de case sera le n° de destination - 1

Player.CompartmentForMove := Player.Compartment; //----n° de case "survolée" = n° de case de destination
Player.SquareExe := True; //---cette fois-ci l'effet de la case sera executé

CompartmentDestination(Player);

Ok, tout cela fonctionne à merveille, cool ! (Mais je n'y suis pas arrivé du premier coup !! )
Là où ça se gâte, c'est pour gérer l'animation du joueur lorsqu'il doit revenir en arrière après la case n°63 !!!!!!!!!
Je suis perdu là !..
J'ai essayé divers bidouillages genre :
while I < Player.Compartment do
begin
Player.CompartmentForMove := I;
CompartmentDestination(Player);

if VirtualCompartment > 63 then //-----(var VirtualCompartment := Player.Compartment;)
begin
VirtualCompartment := 126 - Player.Compartment;
Sleep(300);
Inc(I,-1); //--------------c'est possible ça !??
end else
begin
Sleep(300);
Inc(I);
end;
Mais sans succès !!.. (on ne rit pas !)
Une soluce miraculeuse ??!..
sjrd
Inc(I, -1) c'est possible, mais ça s'écrit mieux avec Dec(I, 1), qui lui-même est équivalent à Dec(I); D'ailleurs Inc(I, 1) est équivalent à Inc(I);

Sinon je ne comprends pas bien ce que tu cherches à faire. Peux-tu expliquer un peu plus, en français, la suite de cases que tu voudrais faire suivre au joueur ?
DerF_44
Ok, tout d'abord, merci pour les infos “Inc(I)” et “Dec(I)”..
Ensuite je vais tenter une explication plus claire :
Le joueur parcours un plateau de jeu composé de 63 cases…
Grâce à 2 dés il progresse sur le plateau.
Le n° de la case où il se trouve est un attribut (Player.Compartment),
et cet attribut sera modifié par le résultat des dés (Player.Compartment := Player.Compartment + DicesResult)..
Une procédure (CompartmentDestination) s'occupe de poser le joueur sur la case de destination..
Voulant réaliser une petite animation du déplacement du joueur, une petite boucle permet de poser brièvement le joueur
sur toutes les cases situées entre la case où le joueur se trouvait avant le lancer de dés, et la case de destination
(en utilisant la procédure, et un Boolean afin de ne pas exécuter les cases “survolées”..)…
Jusque là, no blèm ! Comme je disais, je n'y suis pas parvenu du premier coup mais maintenant c'est ok !.
Le hic c'est le “dépassement” de la case 63 : En effet si le joueur n'arrive pas exactement sur la case 63,
il doit repartir dans l'autre sens pour terminer le comptage des dés :
Si le joueur est à la case 60, que le résultat des dés est égal à 10, il va jusqu'à 63 puis reviens pour atterrir à la case 56 !
Ce que nous donne la formule if Player.Compartment > 63 then Player.Compartment := 126 - Player.Compartment;
Alors donc, comment gérer ceci du côté de l'animation !???..
Comment élaborer une boucle qui incrémentera I jusqu'à 63, puis dé-incrémentera I jusqu'à la case de destination !?..
(en fait la case juste avant la case de destination !)
Mes dernières idées projettent d'utiliser une variable (VirtualCompartment) qui, contrairement à la vraie case de destination (Player.Compartment) pourrait avoir une valeur > à 63, puis d'utiliser le résultat des dés (DicesResult) afin de faire une deuxième boucle pour partir dans l'autre sens depuis la case 63….
Autre hic : Si, dans une boucle while, j'utilise une condition, que celle-ci est vraie, puis-je sortir de la boucle avec Cancel ?.. ou Exit ?!… La différence n'est pas encore bien claire pour moi !…
En espérant avoir été un peu + explicite…
Merci de ton attention.
sjrd
OK !

Alors d'abord je ferais une fonction indépendante qui va prendre sur elle la partie “mathématique” du problème :
function ComputeNextCompartment(Current, DicesResult: Integer): Integer;
begin
Result := Current + DicesResult;
if Result > 63 then
Result := (2*63) - Result;
end;
Ensuite, dans la boucle, on va faire passer I de 1 à DicesResult-1. Et pour chaque tel I, on appelle ComputeNextCompartment(Player.Comparment, I). On met le résultat dans Player.CompartmentForMove, et on fait comme tu faisais.
À la fin, on met aussi à jour Player.Compartment et Player.SquareExe pour le déplacement final.
var
Origin, I: Integer;

Player.SquareExe := False;
I := 1;
while I < DicesResult do
begin
Player.CompartmentForMove := ComputeNextCompartment(Player.Compartment, I);
CompartmentDestination(Player);
Sleep(300);
Inc(I);
end;

Player.CompartmentForMove := ComputeNextCompartment(Player.Compartment, I);
Player.Compartment := Player.CompartmentForMove;
Player.SquareExe := True;
CompartmentDestination(Player);
Note aussi que cette boucle while s'écrit plus élégamment avec une boucle for, si tu n'as pas peur :
// Pas la ligne "I := 1;"
for I := 1 to DicesResult-1 do
begin
Player.CompartmentForMove := ComputeNextCompartment(Player.Compartment, I);
CompartmentDestination(Player);
Sleep(300);
end;
DerF_44
Whouaah !!! Je dois avouer qu'à la première lecture de ta réponse, je n'ai pas compris la moitié du code !!
Maintenant ça va un peu mieux, j'en capte l'essence, même si je ne suis pas sûr de pouvoir “re-conjuguer” la chose pour d'autres trucs !…
Mais je vais assez rapidement m'y confronter puisque je compte utiliser cette “méthode” pour gérer toutes les cases multiples de 9 (les oies !)
qui font rejouer avec le même DicesResult !!!

En tout cas ça fonctionne nickel !!!!

Et je suis content aussi, parce que je pensais également utiliser une sorte de “sous-routine” externe pour gérer le calcul !…
(Mais ça m'aurait pris au moins 50 lignes de codes !!!! )

Merci, merci, merci, merci, merci, et… MERCI !



PS:
J'imagine que la variable “Origin” faisait partie d'un brouillon mental !?…
Non, je n'ai pas peur des boucles avec for, je les trouve même plus “rassurantes” que celles avec while ou repeat !!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB