Forum FunLabyrinthe

Le jeu de labyrinthe fun et gratuit - Retour au site

  • Vous n'êtes pas connecté.

#1 mars 1, 2011 00:33:41

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

Rivière Inima : comment créer des énigmes difficiles ?

Xaumina
En fait, ce que je veux, c'est la formule qui concerne l'eau, la bouée et le plugin de la bouée. Vous l'avez deviné, c'est pour faire un terrain ciel qu'on peut survoler avec des ailes, et qui fait apparaître un plugin quand on va sur le terrain (ce serait un terrain en plus, pas sur le terrain ciel directement).

L'eau c'est relativement simple :
actions
  GoOnMyWater;

field TMyWater
  name 'Mon eau';
  image 'Fields/Water';

  // Permettre de passer au-dessus avec la planche
  on message Plank do
  begin
    if Kind = pmkPassOver then
      not Player.AbleTo(GoOnMyWater);
  end;

  // Appliquer le fondu des terrains avoisinant
  on DoDraw do
  begin
    inherited;

    DissipateGroundNeighbors(Context);
  end;

  // Empêcher de venir si ne peut pas GoOnMyWater
  on Entering do
  begin
    if Player can GoOnMyWater then
      Exit;

    Cancel;
    if KeyPressed then
      Player.ShowMessage('Il faudrait une bouée pour aller dans l''eau.');
  end;

  // Activer la bouée si on est téléporté dans l'eau
  on Entered do
  begin
    Player.DoAction(GoOnMyWater);
  end;
end;

Le plugin pour la bouée ressemblerait à ceci :
plugin TMyBuoyPlugin
  hint 'Plugin de la bouée';

  action GoOnMyWater;

  on AfterConstruction do
  begin
    PainterBefore.AddImage('Plugins/Buoy');

    inherited;
  end;

  on Moved do
  begin
    if not (DestSquare.Field is TMyWater) then
      Player.RemovePlugin(Self);
  end;
end;

Finalement, l'objet bouée ressemblerait à ceci :
object TMyBuoy
  name 'Bouée';
  image 'Objects/Buoy';

  action GoOnMyWater then
    Player.AddPlugin(MyBuoyPlugin);
end;

Bon je viens de pondre tout ça sans tester. Donc il y a peut-être un ou deux couacs.

En fait FunLabyBase n'est pas écrite en FunDelphi, mais en Delphi. Et en plus, elle n'est pas écrite en un seul fichier : il y en a 9 ! FunLabyBase est un alias pour ces 9 unités qui forment toutes les cases de base de FunLabyrinthe.


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#2 mars 1, 2011 13:09:07

intello
De : Yvelines
Enregistré : 2010-07-25
Messages : 167
Réputation: +  9  -
Profil  

Rivière Inima : comment créer des énigmes difficiles ?

Merci beaaucoup pour la liste des on...do . Peut-tu m'expliquer en quoi consiste les actions DoDraw, Moving et Moved ?


========================================
Pas, Flèches rapides, Flèches masquées, Impossible par Maxime, Elévateurs & Terrains vides,
Jeu de boutons

Admirez mes jeux de flèches, de téléporteurs , d'escaliers , de pas ou de boutons !


Notez ces labyrinthes

Hors-ligne

#3 mars 1, 2011 15:52:46

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

Rivière Inima : comment créer des énigmes difficiles ?

DoDraw est exécuté à chaque fois que le composant doit être dessiné à l'écran. Que ce soit sur une carte, ou dans la palette des composants de l'éditeur, ou n'importe où ailleurs.

Le comportement par défaut (inherited) est de dessiner le Painter. On peut modifier ça par exemple pour, comme le trou, faire un fondu des cases adjacentes, ou toute autre chose qu'on voudrait faire.

Le MovingMonster par exemple, demande à son Monster associé de se dessiner à sa place. Les trains (locomotives et voitures) effectuent une rotation de leur Painter en fonction de leur orientation courante. Il y a plein d'usages possibles.

--------------

Moving est appelé entre le Exiting du terrain de la case d'où on vient, et le Entering de celui où on va. La barque se sert de cet événement pour faire d'abord tourner le joueur avant qu'il puisse réellement avancer. La planche se sert de cet événement pour court-circuiter le comportement du trou ou de l'eau et passer au-dessus.

De la même manière, Moved est appelé entre le Exited de la case d'où on vient et le Entered de celle où on va. Dans le temple de l'eau, plusieurs plugins exploitent le Moved pour activer des événements lorsque le joueur change de zone (par ex. remettre les blocs à leur place).


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#4 mars 1, 2011 17:24:54

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

Rivière Inima : comment créer des énigmes difficiles ?

Xaumina
En fait, je pensai que la pierre passerait sous un pont, puisque ce n'est ni un effet, ni un terrain, ni un obstacle, ni un outil. mais ça bloque quand même. Est-ce que je pourrais avoir l'expression Fundelphi pour arranger ça ?

Voilà. Il faut utiliser ce code :
unit Rocks;

uses
  FunLabyBase, MovableBlocks, SimpleBridges;

components
  MyMovableBlock: TMyMovableBlock;

function IsBadForMoveRock(PosComponent: TPosComponent): Boolean;
begin
  Result := (PosComponent is TSquareModifier) and
    not (PosComponent is TSimpleBridge);
end;

poscomponent TMyMovableBlock(TMovableBlock)
  on IsMoveAllowed do
  var
    BehindQPos: TQualifiedPos;
    I: Integer;
    PosComp: TPosComponent;
  begin
    BehindQPos.Map := Context.Map;
    BehindQPos.Position := Behind;

    Result := IsDestSquareValid(Context, Context.Map[Behind]) and
      (not IsAnyPosComponent(BehindQPos, IsBadForMoveRock)) and
      (CanCrossZones or IsSameZone(Context.Map, Context.Pos, Behind));

    // Can only push the block under a bridge, not above
    if Result and IsAnyPosComponent(BehindQPos, TSimpleBridge) then
    begin
      for I := 0 to Master.PosComponentCount-1 do
      begin
        PosComp := Master.PosComponents[I];

        if (PosComp is TSimpleBridge) and
          SameQPos(BehindQPos, PosComp.QPos) then
        begin
          Result :=
            not (NegDir[Player.Direction] in TSimpleBridge(PosComp).OpenedDirs);
          Break;
        end;
      end;
    end;
  end;
end;

end.

Mais il faut aussi que tu remplaces SimpleBridges.fnd par celui que j'ai attaché à ce message. Puis n'oublie pas de faire Tout recompiler.


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Pièces jointes :
attachment SimpleBridges.fnd (2,2 KB)

Hors-ligne

#5 mars 1, 2011 17:58:14

Xaumina
Enregistré : 2011-01-20
Messages : 191
Réputation: +  5  -
Profil   Envoyer un courriel  

Rivière Inima : comment créer des énigmes difficiles ?

Merci encore !

Hors-ligne

#6 mars 7, 2011 13:45:29

Xaumina
Enregistré : 2011-01-20
Messages : 191
Réputation: +  5  -
Profil   Envoyer un courriel  

Rivière Inima : comment créer des énigmes difficiles ?

Et pour les effets ?
Je viens d'essayer la formule, mais ça ne fonctionne pas. Et j'ai bien tout recompilé, après avoir téléchargé la nouvelle version de SimpleBridges.

Modifié Xaumina (mars 7, 2011 13:52:49)

Hors-ligne

#7 mars 7, 2011 16:42:41

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

Rivière Inima : comment créer des énigmes difficiles ?

C'est-à-dire ? Tu veux que la pierre puisse aller sur les effets ?

Dans ce cas, il faut ajouter, en plus de ce qu'il y a déjà :
  on IsDestSquareValid do
  begin
    Result := (Square.Field is TGround) and
      (Square.Tool = nil) and (Square.Obstacle = nil);
  end;

Si tu veux qu'elle puisse aussi aller sur les outils, bah tu retires aussi le test qui concerne Square.Tool.


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#8 mars 7, 2011 18:15:58

Xaumina
Enregistré : 2011-01-20
Messages : 191
Réputation: +  5  -
Profil   Envoyer un courriel  

Rivière Inima : comment créer des énigmes difficiles ?

Je parlais aussi des pierres qui ne veulent pas aller sous les ponts (le formule ne fonctionnait pas).
Où place-t-on la formule pour les effets ?

Modifié Xaumina (mars 7, 2011 18:22:22)

Hors-ligne

#9 mars 7, 2011 19:40:37

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

Rivière Inima : comment créer des énigmes difficiles ?

Xaumina
Où place-t-on la formule pour les effets ?

À l'intérieur de TMyMovableBlock.
Xaumina
Je parlais aussi des pierres qui ne veulent pas aller sous les ponts (le formule ne fonctionnait pas).

Oulah... Ca c'est quasiment impossible à mettre en place. Pour avoir ça il faudrait plus que des Simple bridges.
Il faudrait commencer à utiliser des ponts beaucoup plus sophistiqués, basés non pas sur des PosComponent, mais sur de véritables étages, où les ponts sont un étage au-dessus de la case au-dessus de laquelle ils passent.

Dans l'absolu, c'est possible : c'est avec des ponts sophistiqués et des étages multiples que fonctionne Murs, murets et tunnels. Mais on ne peut pas récupérer bêtement ce qui est utilisé pour Murs, murets et tunnels, et le travail d'adaptation me demanderait plus de temps que je ne peux en allouer à mes loisirs pour le moment.

Donc, à moins que quelqu'un d'autre ait le courage d'entreprendre ça, il va falloir que tu prévoies ton labyrinthe de telle manière que les pierres ne peuvent pas aller au-dessus des ponts. Remarque : tu peux justifier ceci par le fait que la pierre serait trop lourde et casserait le pont


---
Sébastien Doeraene
Auteur de FunLabyrinthe

Hors-ligne

#10 mars 8, 2011 12:53:13

Xaumina
Enregistré : 2011-01-20
Messages : 191
Réputation: +  5  -
Profil   Envoyer un courriel  

Rivière Inima : comment créer des énigmes difficiles ?

Je ne voulais pas que les pierres aillent sur les ponts : ça me convient donc parfaitement, j'avais juste fait une petite erreur dans ma formule.
Toujours concernant les pierres et les effets, je croyais que les pierres sur les boutons poussoirs les enfonceraient. Mais ce n'est pas le cas. Puis-je avoir la formule ?

Hors-ligne

Pied de page

Modération

Powered by DjangoBB

Lo-Fi Version