Rechercher - Liste des utilisateurs
Version complète : EXEMPLES FunDelphi
Accueil » FunDelphi » EXEMPLES FunDelphi
1
DerF_44
Allez, c'est parti pour un nouveau sujet qui, j'espère, en inspirera certains pour créer des labyrinthes, et d'autres pour publier des codes instructifs !.

J'ouvre le bal avec un code qui permet de poser un trésor à un emplacement aléatoire :



Le joueur est placé sur un effet qui posera un trésor quelque part sur l'herbe dans la zone de droite…

Voici le code :
unit TresorAleatoire;

uses
FunLabyBase;

components
PoseTresor : TPoseTresor;

function OkPourPoserTresor(Square: TSquare): Boolean private;
begin
Result := (Square.Field is TGround) and (Square.Effect = nil) and
(Square.Tool = nil) and (Square.Obstacle = nil);
end;

effect TPoseTresor
name 'Pose du trésor';

on AfterConstruction do
begin
inherited;
EditVisualTag := 'Tréso';
end;

on Exited do
var
Map : TMap;
TresorX : Integer;
TresorY : Integer;

begin
inherited;
Map := Master.Map['MainMap'];

repeat
TresorX := Random(21-11+1) + 11;
TresorY := Random(11);
until OkPourPoserTresor(Map[Point3D(TresorX, TresorY, 0)]);

Map[Point3D(TresorX, TresorY, 0)].Effect := Treasure;
Square.Effect := nil;
end;
end;

end.
- La fonction "OkPourPoserTresor“ permet de renvoyer ”Vrai“ si la case de destination est bien issue de TGround, et qu'il n'y a ni effet, ni outil et ni obstacle dessus.
- ”on Exited do“ pose le trésor dès que le joueur quitte la case où se trouve l'effet déclencheur.
- ”repeat….until" choisit une case aléatoire jusqu'à ce que les conditions définies par la fonction OkPourPoserTresor soient vraies.
- "Random(21-11+1) + 11“ donne un nombre compris entre 11 et 21, la coordonnée x du trésor, ce qui le placera exclusivement dans la zone de droite.
- ”Random(11)“ donne un nombre compris entre 0 et 10, la coordonnée y du trésor.
- ”Map(Point3D(TresorX, TresorY, 0)).Effect := Treasure;" pose le trésor aux coordonnées choisies aléatoirement.
Bien évidemment, de la même manière, il est possible de poser n'importe quel élément (terrain, effet, outil, obstacle ou même Player) sur une carte.

Puisse ce petit code permettre quelques surprises dans vos labyrinthes !!


DerF_44
Voici un exemple de code, relativement simple, permettant de grandement compliquer l'évolution du joueur dans un labyrinthe,
puisqu'il fait intervenir…… le temps !..



Dès que le joueur va commencer de se déplacer, une lourde porte (les murs marrons) va “lentement” coulisser
jusqu'à obstruer complètement le passage en direction du trésor !.

unit MovingWall;

uses
FunLabyBase;

messages
BlocMobile1 : TPlayerMessage = 101;
BlocMobile2 : TPlayerMessage = 102;
BlocMobile3 : TPlayerMessage = 103;
BlocsMobiles : TPlayerMessage = 104;

components
MurMobile : TMurMobile;
GoTimer : TGoTimer;
MurMobilePlugin : TMurMobilePlugin;

field TMurMobile
name 'Mur mobile';
image 'Fields/FireWall';

on Entering do
begin
inherited;
Cancel;
end;
end;

effect TGoTimer
name 'Déclencheur compte à rebours';

on AfterConstruction do
begin
inherited;
EditVisualTag := 'Départ';
end;

on Exited do
begin
inherited;
Master.Timers.ScheduleNotificationMsg(2000, Player, msgBlocMobile1);
Master.Timers.ScheduleNotificationMsg(4000, Player, msgBlocMobile2);
Master.Timers.ScheduleNotificationMsg(6000, Player, msgBlocMobile3);
Master.Timers.ScheduleNotificationMsg(8000, Player, msgBlocsMobiles);
Square.Effect := nil;
Player.PlaySound('Passage secret.wav');
end;

end;

plugin TMurMobilePlugin
hint 'plugin du mur mobile';

on message BlocMobile1 do
var
Map : TMap;
begin
Map := Master.Map['MainMap'];
Map[3, 4, 0].Field := Hole;
Map[6, 4, 0].Field := MurMobile;
end;

on message BlocMobile2 do
var
Map : TMap;
begin
Map := Master.Map['MainMap'];
Player.PlaySound('Passage secret.wav');
Map[4, 4, 0].Field := Hole;
Map[7, 4, 0].Field := MurMobile;
end;

on message BlocMobile3 do
var
Map : TMap;
begin
Map := Master.Map['MainMap'];
Map[5, 4, 0].Field := Hole;
Map[8, 4, 0].Field := MurMobile;
end;

on message BlocsMobiles do
var
Map : TMap;
begin
Map := Master.Map['MainMap'];
Map[6, 4, 0].Field := Grass;
Map[7, 4, 0].Field := Grass;
Map[8, 4, 0].Field := Grass;
Map[6, 3, 0].Field := MurMobile;
Map[7, 3, 0].Field := MurMobile;
Map[8, 3, 0].Field := MurMobile;
end;

end;

end.
L'idée est d'attacher au Player un Plugin comportant les modifications des Field, déclenchées par un
Master.Timers.ScheduleNotificationMsg(Temps en ms, Destinataire, NomDuMessage)…
Pour donner l'illusion d'un mur coulissant, on utilise ici 4 TPlayerMessage distincts avec un décalage de 2000 ms (2 sec) pour chacun d'eux.

Je ne suis pas parvenu à simplifier davantage le code, mais je suis sûr qu'il existe une soluce plus “compacte”,
ne serait-ce que pour les déclarations des Map de chaque on message … do.

Non contents d'arpenter des labyrinthes qu'avec ses neurones, il va falloir en plus devenir rapides !!


DerF_44
Pour ce troisième exemple de code FunDelphi, voici un petit mélange des deux premiers !.
À savoir une “surprise” aléatoire + une course poursuite avec le temps :



Ici, dès que le joueur va quitter sa case de départ, une brèche va s'ouvrir, (pendant 1,5 seconde !),
dans le mur qui est à sa droite, à une position aléatoire !.
Si il parvient à emprunter le passage ainsi offert, une autre ouverture va apparaître sur le mur suivant,
et ainsi de suite jusqu'au dernier mur permettant l'accès au trésor…
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'à l'effet TGoTimer7..
//---------------------------------On incrémente à chaque fois le X de Map, de 2 en 2,
//---------------------------------et on pose le GoTimer suivant...

effect TGoTimer7
name 'Go7';
property MurY : Integer;

on Exited do
var
Map : TMap;
begin
inherited;
MurY := Random(9);
Map := Master.Map['MainMap'];
Map[13, MurY, 0].Field := Grass;
Master.Timers.ScheduleNotificationMsg(1500, Player, msgMurFerme);
Square.Effect := nil;
end;
end;

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.
L'astuce consiste donc à poser un effet sur l'ouverture du mur qui déclenchera l'ouverture suivante..
Le Master.Timers.ScheduleNotificationMsg commandera au bout de 1500 ms (1.5 sec)
le on message … do du Plugin qui s'occupera de poser une case-mur sur toute la hauteur grâce à une petite boucle.

Il est à noter qu'il existe une autre méthode de gestion des effets, un peu plus “compacte”, proposée par sjrd : Post du 21 nov 2012 [funlabyrinthe.com]
Puisse ce petit exemple vous inspirer pour mettre vos réflexes à l'épreuve !!

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