Bon alors voici des remarques plus détaillées, qui t'aideront à écrire du code plus joli, et donc de meilleure qualité. De plus, cela t'aidera à mieux comprendre certaines choses.
En-tête
uses
FunLabyBase, FLBSimpleEffects;
FLBSimpleEffects ne doit plus être utilisé. Je sais, la doc est obsolète
FunLabyBase suffit à avoir accès à tous les composants qui sont prévus de base dans FunLabyrinthe.
const
idGrass = 'Grass';
idWall = 'Wall';
Ceci doit être supprimé. Le fait de mettre
uses FunLabyBase rend ces
const inutiles. Je sais, c'est le bouton "Code Source" du ssq qui a produit ce code, et lui en a besoin. Mais une fois que tu passes en fnd et que tu mets le
uses FunLabyBase, il faut les supprimer.
Les 3 CounterOnViewPlugin
Comme je l'ai dit dans mon post précédent, il serait mieux de faire un seul
type TCounterOnViewPlugin, mais de créer 3
instances de ce type. Il vaut d'ailleurs mieux
nommer correctement les trois instances (composants). Tu peux même personnaliser certaines propriétés directement là où tu déclares les 3 instances (dans
components). Cela donne :
components
StepCounter: TCounterOnViewPlugin
MsgFormat: 'Pas : %d';
TextX: 12;
TextY: 8;
end;
LevelCounter: TCounterOnViewPlugin
MsgFormat: 'Niveau %d';
TextX: 309;
TextY: 8;
end;
MaxStepCounter: TCounterOnViewPlugin
MsgFormat: 'Pas requis maximum : %d';
TextX: 12;
TextY: 280;
end;
plugin TCounterOnViewPlugin3
hint 'Pas requis';
property MsgFormat: string;
property Counter: Integer;
property BackColor: TColor32;
property FontColor: TColor32;
property TextX: Integer;
property TextY: Integer;
on AfterConstruction do
begin
inherited;
MsgFormat := '%d';
BackColor := clWhite32;
FontColor := clBlack32;
TextX := 8;
TextY := 8;
end;
on DrawView do
var
Text: string;
Extent: TSize;
begin
Bitmap.Font.Name := 'Tahoma'; {don't localize}
Bitmap.Font.Size := 8;
Text := Format(MsgFormat, [Counter]);
Extent := Bitmap.TextExtent(Text);
Bitmap.FillRectTS(TextX-2, TextY, TextX+Extent.cx+2, TextY+Extent.cy,
BackColor);
Bitmap.RenderText(TextX, TextY, Text, 12, FontColor);
end;
end;
L'usage de Map[X, Y, Z]
Dans ton code tu as :
field TPas(TGround)
name 'Terrain à pas + murs';
image 'Fields/Grass';
on Entering do
begin
CounterOnViewPlugin.Counter := CounterOnViewPlugin.Counter + 1;
end;
on Entered do
begin
Master.Map['MainMap'].Map[Pos.X+1,Pos.Y+2,Pos.Z].Field := Wall;
end;
end;
D'abord, pourquoi avoir choisi Entering et Entered ? N'est-il pas plus logique de mettre les deux dans Entered. Pour rappel : Entering sert à empêcher le jouer de venir sur la case. Entered sert à faire quelque chose lorsque le joueur est entré sur la case.
De plus, la ligne compliquée avec Master.Map peut être simplifiée de beaucoup. Je sais, tu es parti de ce que produit le "Code source" des ssq. Mais les ssq ne savent rien, et c'est pourquoi ils mettent toujours beaucoup de code qui en fait est inutile... au cas où. Mais toi, tu sais qu'en fait il n'y a qu'une seule Map, et que c'est celle où se trouve actuellement le joueur que tu veux modifier. Tu peux faire simplement :
Map[Pos.X+1, Pos.Y+2, Pos.Z].Field := Wall;
C'est évidemment valable à tous les autres endroits avec le Master.Map.
if..else et begin..end
effect TBouty(TCounterEffect)
name 'touby';
on Execute do
begin
if CounterOnViewPlugin.Counter > CounterOnViewPlugin3.Counter then
Player.MoveTo(Point3D(3, 3, 0))
else
Master.Map['MainMap'].Map[5, 79, 0] := Grass;
CounterOnViewPlugin.Counter := 0;
Master.Map['MainMap'].Map[6, 79, 0] := Grass;
end;
end;
Ici il y a un problème de syntaxe. Si tu relis
ce passage de l'aide, tu remarqueras que tu dois entourer les trois dernières instructions avec un
begin..end supplémentaire. Sinon le
else ne porte que sur la première instruction. Quel est le résultat alors ? Eh bien c'est que les deux dernières instructions seront
toujours exécutées, même si le test du
if est vrai !
Il faut donc écrire (avec au passage, la simplification du Master.Map) :
on Execute do
begin
if CounterOnViewPlugin.Counter > CounterOnViewPlugin3.Counter then
Player.MoveTo(Point3D(3, 3, 0))
else
begin
Map[5, 79, 0] := Grass;
CounterOnViewPlugin.Counter := 0;
Map[6, 79, 0] := Grass;
end;
end;
Voilà j'ai atteint le bout
J'espère que ces indications pourront t'aider