Rechercher - Liste des utilisateurs
Version complète : Nouvelle unité : Money
Accueil » FunDelphi » Nouvelle unité : Money
1 2 3 4 5 6 7
sjrd
Alors pour faire perdre tous les ObjectDef qu'a le joueur, il faut faire :
ObjectDef.Count[Player] := 0;
ce qui, je sais, est contre-intuitif.

Pour placer l'objet sur la case, en fait c'est impossible. Car on ne peut placer qu'un Outil sur une case, et qu'un ObjectDef n'a pas d'outil associé. Donc il faut avoir une property en plus, qui contient le Tool qu'il faudra mettre en faisant
Square.Tool := Tool;
DerF_44
Merci !!.. (Effectivement le "ObjectDef.Count := 0;" je l'aurais pas trouvé tout seul celui-là !!)

Alors maintenant une petite colle !!..
Comme j'ai pas mal galéré avec mes outils qui disparaissent et réapparaissent mais qu'on ne peut pas prendre, j'ai maintenant l'idée d'indiquer à l'effet quelle direction est interdite avec tel outils !…
Fastoche :

if (Player has at least 1 ObjectDef) and (Player.Direction = diNorth) then
begin
bla bla "pas possible de trimbaler ...."
ObjectDef.Count[Player] := 0;
Square.Tool := Tool;
Et c'est nickel, ça fonctionne : si le joueur arrive sur la case avec une autre direction que le nord il peut reprendre l'objet laissé !..
Alors the question : Comment intégrer tout ça dans une property ???!!..
J'ai essayé avec “property LockDirection : String” où l'on entre diNorth (ou autre) mais le if n'en veut pas !.
J'ai testé avec la property Direction ………………………………. Ça Marche !!!!!
En écrivant ce message j'ai choppé l'astuce !!..

property Direction : TDirection;
..
..
..
if (Player has at least 1 ObjectDef) and (Player.Direction = Direction) then

Mais… mais en fait c'est simple le FunDelphi !!!
(Mais bizarre me semblait avoir testé et il me renvoyait une erreur du style manque FunLabyBaseComponent ou un truc comme ça !?…)

Bon, et bien ce ne sera donc qu'un message de remerciementS !.
sjrd
Oui le FunDelphi est tout de même sensé être simple, in fine. En tous cas une fois qu'on a bien assimilé toute une série de concept. Après on peut généralement exprimer très simplement tout ce qu'on a envie de faire.
En tous cas moi j'aime beaucoup travailler en FunDelphi. Je ne recours au Delphi que si je n'ai pas le choix.
DerF_44
Ouais, plus je “bosse” avec FunLabyrinthe plus je me rends compte à quel point cette appli est vraiment géniale !!.. C'est sincère, je m'éclate comme un petit fou avec, j'ai plein d'idées à exploiter et en bidouillant je fais toutes sortes de découvertes, c'est géant !.. En dehors de la prise en main par un débutant complet, qui reste, à mon avis, un peu hard, (mais quelques tutos pourraient y remédier, je veux bien m'en occuper lorsque je serais plus à l'aise) ce logiciel permet de créer des choses déconcertantes de simplicité d'une part, et des trucs incroyablement complexes d'autre part.. C'est vraiment très très bien foutu !!..

Petite question (ben ça fait longtemps non !?.. )
À quoi servent les property “Tag” de tous les composants !?…
Je me suis amusé à me servir du Tag du joueur en m'en servant un peu comme points de vie, enfin plutôt en points de mort !.. Lorsque le joueur rencontre une araignée (du genre 30 Kilos la bestiole quoi !) et qu'il ne peut la détruire, son Tag augmente de 1 point à cause d'une piqûre que lui inflige la bête !… Lorsque le Tag est à 6 le joueur est averti que ça commence à craindre grave, et à 10, Player is dead = Game Over !..
Alors je commence à imaginer une unité “LifePoints” plugin sur le joueur qui débuterait avec un capital de 100 pts et qui perdrait des points en cas d'actions difficiles ou ratées… À 0 pts = le joueur perd… (of course, sur son chemin il pourrait trouver une potion lui faisant augmenter son capital pts de vie !)
Et mon idée serait d'utiliser les Tag des composants qui détermineraient le nombre de points à soustraire de celui du joueur !… Est-ce possible ?… Les Tag sont de type integer ?.. (un nombre entier positif ou négatif ?.. et donc si on a un Tag de -10 sur un outil, le joueur augmentera son capital vie de 10 ..?)
Et juste pour être certain : Si j'attribue (pendant l'édition d'un projet) à une épée un Tag de 3, lorsque le mode jeu commence cette valeur sera conservée ?!… (même après exportation du projet ?.)..

Encore merci de tes écoutes sjrd..

Un autre “truc” me taraude l'esprit depuis quelques jours : Y'a t-il moyen de faire entrer un string de la part du joueur ??… (l'idée initiale est une porte à code alphanumérique, mais j'ai d'autres idées !… )
sjrd
DerF_44
À quoi servent les property “Tag” de tous les composants !?…
À rien. Juste que si on en a besoin pour quelque chose, ben il est là.
DerF_44
Je me suis amusé à me servir du Tag du joueur en m'en servant un peu comme points de vie, enfin plutôt en points de mort !.. Lorsque le joueur rencontre une araignée (du genre 30 Kilos la bestiole quoi !) et qu'il ne peut la détruire, son Tag augmente de 1 point à cause d'une piqûre que lui inflige la bête !… Lorsque le Tag est à 6 le joueur est averti que ça commence à craindre grave, et à 10, Player is dead = Game Over !..
Alors je commence à imaginer une unité “LifePoints” plugin sur le joueur qui débuterait avec un capital de 100 pts et qui perdrait des points en cas d'actions difficiles ou ratées… À 0 pts = le joueur perd… (of course, sur son chemin il pourrait trouver une potion lui faisant augmenter son capital pts de vie !)
Oui bonne idée. Mais en fait il y a les attributs du joueur qui sont faits pour ça. Une fois que tu as fait :
attributes
LifePoints;
ben tu peux remplir l'attribut LifePoints du joueur dans l'inspecteur d'objets, et tu peux écrire
Player.LifePoints
DerF_44
Et mon idée serait d'utiliser les Tag des composants qui détermineraient le nombre de points à soustraire de celui du joueur !… Est-ce possible ?… Les Tag sont de type integer ?.. (un nombre entier positif ou négatif ?.. et donc si on a un Tag de -10 sur un outil, le joueur augmentera son capital vie de 10 ..?)
Pourquoi pas, mais une property dédiée est toujours mieux.
DerF_44
Et juste pour être certain : Si j'attribue (pendant l'édition d'un projet) à une épée un Tag de 3, lorsque le mode jeu commence cette valeur sera conservée ?!… (même après exportation du projet ?.)..
Oui. FunLabyrinthe est très malin pour tout ce qui est sauvegarde des choses.
DerF_44
Un autre “truc” me taraude l'esprit depuis quelques jours : Y'a t-il moyen de faire entrer un string de la part du joueur ??… (l'idée initiale est une porte à code alphanumérique, mais j'ai d'autres idées !… )
Techniquement, oui, c'est possible, puisqu'on peut attendre la frappe au clavier de n'importe quelle touche, et savoir laquelle c'est. Mais il n'y a rien de “tout fait” qui tienne en une commande. Il faudrait écrire une unité tout à fait non triviale pour pouvoir le faire. Je peux mettre ça dans ma todo list.
DerF_44
Excellent !!.. J'aime !.. Merci !

Alors donc, j'enchaîne, Voici un premier jet :


unit LifePoints;

uses
FunLabyBase, TestLifePoints, FunLabyGraphics;

attributes
LifePoints;

components
BadSpider : TBadSpider;

obstacle TBadSpider
name 'araignée mortelle';
image 'araignee';
property LostLifePoints : Integer;

on Pushing do
begin

if Player can Marteler then
begin
Square.Obstacle := nil;
Exit;
end else
Player.LifePoints := Player.LifePoints + LostLifePoints; // (valeur LostLifePoints de l'araignée = -10)
Player.ShowMessage (Format(
'Oups !.. %d points de vie !.. ',[LostLifePoints]));
Player.ShowMessage (Format(
'Il te reste %d points de vie..',[Player.LifePoints]));
end;
end;

end.

(On ne se moque pas, cela fait partie de mes premières unités écrites de toutes pièces !)
Passons sur la ‘procédure’ utilisée dans le “Money” de Xaumina pour afficher en permanence dans la fenêtre de jeu les points de vie, ça me semble complexe et je ne suis pas sûr que cela m'intéresse (préférant les avertissements du genre “cool tu es encore en pleine forme” ou “C'est pas bon du tout, te reste 3 points de vie !!”),
mais un problème m'interpelle : Comment, mais surtout puis-je placer mes conditions avec if qui annonceront la vitalité du joueur ??..

Genre :
if Player.LifePoints < 10 then
Player.ShowMessage ('t'es mal barré là, te faut une potion revigorante d'urgence !“)

Sachant qu'il va y avoir d'autres bestioles pas sympas, je souhaiterais regrouper les conditions dans un ”paragraphe" propre au joueur et non les répéter pour chaque bébête !……

Cela doit commencer par un On…. Do, mais lequel !!??.. Et où le poser ??..
(Je n'ai pas trouvé l'astuce miraculeuse pendant la rédaction de ce message !. et j'avoue que c'est un point encore assez abstrait pour moi).


PS: Désolé de te solliciter aussi souvent, je vais me calmer, mais que veux-tu, FunLabyrinthe me fascine et me passionne !!. (j'en suis à regarder (un tout petit peu) des tutos sur le Delphi !!.. C'est grave docteur !?..)



sjrd
Première remarque : il vaut mieux ne pas donner le même nom à l'unité et à un truc. Donc si tu as un attribut LifePoints, il vaut mieux de pas appeler l'unité LifePoints.
Sinon il y a de l'idée.

Pour rassembler des choses à un même endroit, tu peux déclarer une procédure.
procedure AddLifePoints(Player: TPlayer; Amount: Integer);
begin
Player.LifePoints := Player.LifePoints + LostLifePoints;
Player.ShowMessage (Format(
'Oups !.. %d points de vie !.. ',[Amount]));
Player.ShowMessage (Format(
'Il te reste %d points de vie..',[Player.LifePoints]));
end;
et l'appeler en faisant :
end else
AddLifePoints(Player, LostLifePoints);
end;
Bon cela dit, si tu veux en faire quelque chose d'aussi avancé, en fait je partirais carrément sur redéfinir les LifePoints comme un ObjectDef :
components
LifePoints: TLifePoints;

object TLifePoints
name 'Points de vie';
image 'BodyParts/Heart';
end;
Ca permet toujours d'écrire
Player.LifePoints
et on peut toujours l'éditer dans l'inspecteur d'objets (depuis LifePoints et non plus depuis Player). Mais on gagne en plus le fait que c'est visible dans dans la liste des objets du joueur, et on peut faire des trucs comme
Player discards 3 LifePoints;
DerF_44
Whouahh !!.. Voilà une réponse riche de possibles !!..
Merci beaucoup sjrd !.
Je m'en vais bidouiller tout ça sur le champs !..
(et du coup pas mal de modif' à faire par ci par là avec ces nouveaux éléments !)
DerF_44
Bon, je rame grave avec l'option procedure y'a toujours un truc pas déclaré ou une autre embrouille qui me perturbe… Je vais persévérer mais plus tard…
Je pense opter pour l'option ObjectDef en ce qui concerne mon unité “LifePointsCounter”
Par contre je voudrais une petite précision technique :
Dans mon précédent post, où je faisais part du premier jet de mon unité, si le joueur ne pouvait donner un coup de marteau à l'araignée (Marteler) il perdait des pts de vie, MAIS se retrouvait SUR l'obstacle (l'araignée) et donc pouvait le franchir… En testant diverses bidouilles j'en suis arrivé à mettre “Cancel;” après le dernier message

end else
Player.LifePoints := Player.LifePoints + LostLifePoints;
Player.ShowMessage (Format(
'Oups !.. %d points de vie !.. ',[LostLifePoints]));
Player.ShowMessage (Format(
'Il te reste %d points de vie..',[Player.LifePoints]));
Cancel;
end;
Et ça fonctionne parfaitement : Le joueur ne peut franchir l'obstacle !… (ce que je voulais pour cet exemple)
Et, ma question : Quelle est la différence entre “Exit” et “Cancel” ?..
DerF_44
Bon, je galère…. Voici où j'en suis :


unit TestLifePointsCounter;

uses
FunLabyBase, TLifePointsCounter;

components
BadSpider : TBadSpider;
LifePoints: TLifePoints;

object TLifePoints
name 'Points de vie';
image 'BodyParts/Heart';
end;

obstacle TBadSpider
name 'araignée mortelle';
image 'araignee';
property LostLifePoints : Integer;

on Pushing do
begin

if Player can Marteler then
begin
Square.Obstacle := nil;
Exit;
end else

Player.LifePoints := Player.LifePoints + LostLifePoints;
Player.ShowMessage (Format(
'Oups !.. %d points de vie !.. ',[LostLifePoints]));
Player.ShowMessage (Format(
'Il te reste %d points de vie..',[Player.LifePoints]));
Cancel;
end;
end;

end.

Et donc maintenant je voudrais savoir comment (et où !) placer une procedure (valable pour d'autres vilaines bêtes !) qui affichera le message “Il te reste %d points de vie…” et un message en fonction du nb de pts de vie du joueur… (si pts <10 alors avertissement)… Ainsi que la condition si Pts de Vie = 0 alors le joueur perd..
N'y a t-il pas en FunDelphi la possibilité de poser des Labels et des Goto comme en Basic ?!..

Allez, promis, après je te laisse tranquille !!!

NB: Tout ça n'est pas indispensable, mon unité fonctionne sans problème et je peux très bien copier/coller 4 ou 5 lignes de codes pour chaque vilaines bestioles, c'est juste dans le but de comprendre et bien cerner les subtilités du FunDelphi !..
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