Forum FunLabyrinthe

Le jeu de labyrinthe fun et gratuit - Retour au site

  • Vous n'êtes pas connecté.

#1 nov. 13, 2012 20:52:59

DerF_44
De : Nantes
Enregistré : 2011-10-24
Messages : 271
Réputation: +  0  -
Profil   Envoyer un courriel  

Débutants

À l'usage des débutants, comme moi, et afin d'illustrer les propos précédents, voici un petit exemple, tout simple, permettant de “speeder” le jeu :

Lorsque le joueur passera sur l'effet (Go), il disposera de 4 secondes et demie pour rejoindre la sortie au nord..
Passé ce délai le passage vers l'extérieur se transformera en un mur !..
Voici le code .fnd :
unit PassageTemporise;

uses
FunLabyBase;

messages
SortieBloquee : TPlayerMessage = 123;

components
GoTimer : TGoTimer;
SortieBloqueePlugin : TSortieBloqueePlugin;

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

on AfterConstruction do
begin
inherited;
EditVisualTag := 'Go';
end;

on Execute do
begin
inherited;
Master.Timers.ScheduleNotificationMsg(4500, Player, msgSortieBloquee); //---ici le 4500 = 4.5 secondes !
end;
end;

plugin TSortieBloqueePlugin
hint 'plugin qui bloque la sortie';

on message SortieBloquee do
begin
Master.Map['MainMap'].Map[4, 0, 0].Field := Wall;
end;
end;

end.
Ne pas oublier d'attacher le plugin au joueur, en mettant à True le SortieBloqueePlugin dans l'inspecteur d'objet !
En espérant avoir fait au plus simple (The Master me corrigera !), puisse cet exemple donner des idées !!




(°!°) DerF

Modifié DerF_44 (nov. 13, 2012 21:04:42)

Hors-ligne

#2 nov. 14, 2012 11:02:50

sjrd
De : Belgique
Enregistré : 2010-04-11
Messages : 481
Réputation: +  14  -
Profil   Envoyer un courriel  

Débutants

Ça me semble très bien Bien joué !


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#3 nov. 14, 2012 13:06:15

DerF_44
De : Nantes
Enregistré : 2011-10-24
Messages : 271
Réputation: +  0  -
Profil   Envoyer un courriel  

Débutants

Merci !


(°!°) DerF

Hors-ligne

#4 nov. 17, 2012 12:19:11

DerF_44
De : Nantes
Enregistré : 2011-10-24
Messages : 271
Réputation: +  0  -
Profil   Envoyer un courriel  

Débutants

Juste une petite vérification, je suis presque sûr mais voudrais être complètement certain !
NbAleatoire2 := Random(54)+1; //---Donne un nombre compris entre 1 et 54 inclus.
NbAleatoire1 := Random(54-0+1)+0; //---Donne un nombre compris entre 0 et 54 inclus (=Random(54) ?)
NbAleatoire3 := Random(54-14+1)+14; //---Donne un nombre compris entre 14 et 54 inclus.

if Random > 0.5 then
Player.ShowMessage('Pile !')
else
Player.ShoMessage('Face !'); //---Jeu du pile ou face (une chance sur deux).

Tout cela est-il correct !?..

J'en profite aussi pour annoncer que je serais assez partant pour ouvrir un sujet spécifique d'exemples sur le forum, comportant quelques bouts de codes .fnd à l'usage des débutants. J'en ai quelques uns à poser, à mon rythme, tranquillement, et cela pourrait inciter d'autres personnes à faire de même !..
Il n'y pas mieux que l'apprentissage par l'exemple et de plus ce serait plus confortable pour rechercher
une info par la suite, au lieu de parcourir tout le forum !



(°!°) DerF

Hors-ligne

#5 nov. 17, 2012 13:21:40

sjrd
De : Belgique
Enregistré : 2010-04-11
Messages : 481
Réputation: +  14  -
Profil   Envoyer un courriel  

Débutants

Bon je mets tout en code parce que sinon mes notations ne passent pas.

De manière générale :
- Random(N) avec N un entier > 0 donne un nombre compris entre 0 inclus
et N exclu, que je note [0, N[ (où de manière équivalente,
entre 0 et N-1 inclus, que je note [0, N-1]).
- Random sans paramètre donne un nombre flottant compris entre 0 inclus
et 1 exclu, donc [0, 1[.

On peut donc en conclure :
- Random(54)+1 = [0, 54[ + 1 = [1, 55[ = [1, 54]
- Random(54-0+1)+0 = Random(55)+0 = [0, 55[ + 0 = [0, 55[ = [0, 54]
- qui n'est pas égal à Random(54) = [0, 54[ = [0, 53]
- Random(54-14+1)+14 = Random(41)+14 = [0, 41[ + 14 = [14, 55[ = [14, 54]

Plus généralement, étant donné L et H des nombres entiers avec L <= H :
- Random(H-L+1)+L = [0, H-L+1[ + L = [L, (H-L+1)+L[ = [L, H+1[ = [L, H]

Pour le pile ou face, en fait il faudrait mettre Random >= 0.5 (et non >)
car ainsi on divise l'intervale [0, 1[ en [0, 0,5[ et [0,5, 1[.


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Modifié sjrd (nov. 18, 2012 11:22:12)

Hors-ligne

#6 nov. 17, 2012 13:55:53

DerF_44
De : Nantes
Enregistré : 2011-10-24
Messages : 271
Réputation: +  0  -
Profil   Envoyer un courriel  

Débutants

Ah bah mince, ça devient confus pour moi ces manipulations de Random !..
Un jour tu cites :
Pour obtenir un nombre aléatoire entre A et B inclus, la formule générale est
Random(B-A+1) + A;

Alors donc si je souhaite obtenir un nombre compris entre 50 et 100 (les 2 limites incluses) j'écris bien :
Random(100-50+1) + 50;

Pour un dé à jouer à 6 faces c'est bien :
Random(6) + 1;

Pour le pile ou face, ok, là j'ai bien capté !!


(°!°) DerF

Hors-ligne

#7 nov. 18, 2012 11:23:19

sjrd
De : Belgique
Enregistré : 2010-04-11
Messages : 481
Réputation: +  14  -
Profil   Envoyer un courriel  

Débutants

OK oui tout ça est vrai.
Mon précédent message est mal passé car j'utilisais des crochets pour mes notations, ce qui a interféré avec les balises du forum. Je l'ai édité et tout mis en code, comme ça ça passe. Tu peux donc relire mon message précédent.


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#8 nov. 18, 2012 12:10:03

DerF_44
De : Nantes
Enregistré : 2011-10-24
Messages : 271
Réputation: +  0  -
Profil   Envoyer un courriel  

Débutants

Aaaah yesss !! Ça va beaucoup mieux là !
(Je commençais à me poser de drôles de questions !)
Effectivement, maintenant tout est beaucoup plus clair !. Ouf !!
Et donc c'est ok, j'ai bien tout capté !
Merci sjrd !



(°!°) DerF

Hors-ligne

#9 nov. 20, 2012 21:48:21

DerF_44
De : Nantes
Enregistré : 2011-10-24
Messages : 271
Réputation: +  0  -
Profil   Envoyer un courriel  

Débutants

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.


(°!°) DerF

Hors-ligne

#10 nov. 21, 2012 09:08:49

sjrd
De : Belgique
Enregistré : 2010-04-11
Messages : 481
Réputation: +  14  -
Profil   Envoyer un courriel  

Débutants

Bah c'est pas mal, encore.

Tu peux te débarrasser des 7 définitions de classes TGoTimerN par une seule TGoTimer avec deux properties : une pour la valeur de MurX et l'autre pour le GoTimerN+1. Tu peux assigner ces propriétés lorsque tu crées les composants tout en haut (ce qui implique de les créer dans l'ordre inverse ^^) :
components
GoTimer7: TGoTimer
MurX: 13;
end;
GoTimer6: TGoTimer
MurX: 11;
NextGoTimer: GoTimer7;
end;
...
GoTimer1: TGoTimer
MurX: 1;
NextGoTimer: GoTimer2;
end;

effect TGoTimer
name 'Go';
property MurX: Integer;
property MurY: Integer;
property NextGoTimer: TGoTimer;

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


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

Pied de page

Modération

Powered by DjangoBB

Lo-Fi Version