Bon, autant prévenir tout de suite, ça va être un tantinet longuet là !..
Voulant créer un 3ème exemple faisant un peu la synthèse des 2 premiers, à savoir utiliser la fonction
Random et une temporisation, je me suis lancé dans un projet qui est devenu quasi-inextricable !!..
Voici l'énoncé du projet :
Dès que le joueur va se déplacer, un passage va apparaître pendant 1.5 sec dans le premier mur, à une hauteur aléatoire… Si le joueur parvient à passer, un autre passage s'ouvre dans le deuxième mur, toujours à une position aléatoire, etc etc jusqu'au dernier mur vertical afin d'atteindre le trésor !.
Nous avons donc affaire ici à un parcours sportif où il est nécessaire d'enchainer rapidement les passages, aux emplacements surprises, jusqu'au trésor.
Mon idée initiale était d'utiliser des incréments de X (le mur en question) afin d'utiliser un seul effet (qui ouvre le mur et lance le timer de 1.5 sec) et un seul
on message … do (qui ferme le mur)..
Eh bien, pour rester poli : Quel merdier !!!!!
J'ai testé toutes sortes de combines afin d'incrémenter mon X du mur à ouvrir, tout en gardant le X précédent pour fermer le mur passé, utilisé le Tag du Player, des property, j'ai même créer des object pensant pouvoir récupérer sa valeur par un Player.MonObject, etc etc..
Je suis assez rapidement parvenu à un résultat convainquant pour ouvrir les passages, mais pour les fermer, grosse galère !!.. En effet si le joueur passe 3 murs alors qu'il n'y en a qu'un seul derrière lui de fermé, c'est le bazar !!
Breeeeeef, à force d'essais j'y suis quand même arrivé, mon code fonctionne nickel, mais qu'il est vilain !!
unit PortesSurprises;
uses
FunLabyBase;
messages
MurFerme : TPlayerMessage = 101;
components
GoTimer1 : TGoTimer1;
GoTimer2 : TGoTimer2;
GoTimer3 : TGoTimer3;
GoTimer4 : TGoTimer4;
GoTimer5 : TGoTimer5;
GoTimer6 : TGoTimer6;
GoTimer7 : TGoTimer7;
MursPlugin : TMursPlugin;
effect TGoTimer1
name 'Go1';
property MurY : Integer;
on AfterConstruction do
begin
inherited;
EditVisualTag := 'Départ';
end;
on Exited do
var
Map : TMap;
begin
inherited;
MurY := Random(9);
Map := Master.Map['MainMap'];
Map[1, MurY, 0] := Grass+GoTimer2;
Master.Timers.ScheduleNotificationMsg(1500, Player, msgMurFerme);
Square.Effect := nil;
end;
end;
effect TGoTimer2
name 'Go2';
property MurY : Integer;
on Exited do
var
Map : TMap;
begin
inherited;
MurY := Random(9);
Map := Master.Map['MainMap'];
Map[3, MurY, 0] := Grass+GoTimer3;
Master.Timers.ScheduleNotificationMsg(1500, Player, msgMurFerme);
Square.Effect := nil;
end;
end;
//--------
//--------etc etc jusqu'à effect TGoTimer7 où seule la ligne "Map[3, MurY, 0] := Grass+GoTimer3;" change,
//--------le X s'incrémentant de 2 à chaque fois, et le Grass+GoTimerN de 1...
//--------
plugin TMursPlugin
hint 'Plugin des murs';
property MurX : Integer;
on AfterConstruction do
begin
MurX := -1;
end;
on message MurFerme do
var
Map : TMap;
I : Integer;
begin
MurX := MurX + 2;
Map := Master.Map['MainMap'];
Player.PlaySound('Explosion.wav');
for I := 0 to 8 do
begin
Map[MurX, I, 0].Field := Wall;
end;
end;
end;
end.
Je me suis donc retrouvé une fois de + à me demander comment enregistrer une valeur récupérable depuis n'importe où, et pense fortement que je passe à côté de quelque chose…
Il doit bien y avoir un moyen de synthétiser tout ça, de ne pas se coltiner 7 effets !!!!!
Je n'y suis pas arrivé..
À l'occasion, je suis très intéressé de savoir si il existe un moyen d'obtenir un code plus “propre”, et, à défaut d'une correction pertinente, une piste à explorer !..
Merci d'y jeter un œil.