Rechercher - Liste des utilisateurs
Version complète : Débutants
Accueil » FunDelphi » Débutants
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
DerF_44
Je cherche le moyen de poser dans 3 var (X, Y, Z) la position du joueur comment faire !??..

var
Map: TMap;
Pos: T3DPoint;
X, Y, Z: Integer;
begin
Map := Player.Map;
Pos := Player.Position;
L'objectif étant de pouvoir modifier les cases qui entourent le joueur avec une description du genre :

Map[Point3D(X-1, Y-1, Z)].Effect := nil;
Map[Point3D(X, Y-1, Z)].Effect := nil;
Map[Point3D(X+1, Y-1, Z)].Effect := nil;
//.........etc

D'avance merci !
sjrd
X := Player.Position.X;
DerF_44
Yes !!..
Effectivement ça coule de source à voir la soluce !..
Mais je n'aurais pas pu trouver tout seul !!!

Merci beaucoup !
DerF_44
Un petit souci bien trop abstrait pour mes (très) modestes connaissances :
J'ai créé une petite unité nommée “Bomb” qui, comme son nom l'indique, détruit tout autour du joueur sur une surface de 3x3 cases… Après l'explosion il ne reste qu'un terrain désolé :

field TDarkGround
name 'Terre sombre';
image 'terresombre';

on DoDraw do
begin
inherited;
DissipateGroundNeighbors(Context);
end;
end;
Tout est détruit sauf l'eau et les murs indestructibles :

field TIndestructibleWall(TWall)
name 'Mur indestructible';

on DoDraw do
begin
inherited;
EditVisualTag := 'X';
end;
end;
Après avoir pas mal galéré avec les histoires de boucles, mon code fonctionne à merveille :

(...)
for I:= -1 to 1 do
for J:= -1 to 1 do
begin
if (Map[Point3D(X+I, Y+J, Z)].Field <> IndestructibleWall) and
(Map[Point3D(X+I, Y+J, Z)].Field <> Water) then
Map[Point3D(X+I, Y+J, Z)].Field := DarkGround;
if Map[Point3D(X+I, Y+J, Z)].Field = Water then
Map[Point3D(X+I, Y+J, Z)] := Water;
end;
(...)
Le gros hic c'est que si dans l'éditeur je veux copier un IndestructibleWall afin de lui attribuer une autre image de mur, cela ne fonctionne pas : Il est vaporisé par l'explosion !!…
J'ai passé pas mal de temps sur ce truc et suis arrivé à mes fins grâce à de la persévérance et beaucoup de tâtonnements, mais là, j'avoue, je n'ai aucune idée de comment gérer le problème !!!
Une soluce magique ??!…
sjrd
Oui
Il faut tester le type du terrain et non son ID exact.
if not ((Map[Point3D(X+I, Y+J, Z)].Field is TIndestructibleWall) or
(Map[Point3D(X+I, Y+J, Z)].Field is TWater)) then
DerF_44
Yesss ! Presque parfait !!
(J'avais bien pensé à poser des "TIndestructibleWall“ mais pas ”conjugués" avec des if not !! )
Ensuite c'est l'eau qui m'a posé des problèmes : Soit elle s'évaporait à l'explosion, soit elle restait bien en place mais ce qu'elle pouvait contenir (effet, bouée, etc) ne se volatilisait pas !!. (Y'a que la barque qui résiste).. Bref, après moult triturations, (et le précieux petit coup de main du Grand Maître) j'y suis parvenu !!
Alors donc, pour récompenser mes efforts, je prends la liberté (et le plaisir !) de proposer ici l'unité "Bomb" :
unit Bomb;

uses
FunLabyBase;

components
BombPlugin: TBombPlugin;
Bombs: TBombs;
DarkGround: TDarkGround;
ExploseLight : TExploseLight;
IndestructibleWall : TIndestructibleWall;
Bomb : TObjectTool
ObjectDef: Bombs;
FindMessage: 'Tu as trouvé une bombe ! '+
'Tu peux la faire exploser avec la touche B.';
end;

field TDarkGround
name 'Terre sombre';
image 'terresombre';

on DoDraw do
begin
inherited;
DissipateGroundNeighbors(Context);
end;
end;

field TExploseLight
name 'Explosion';
image 'ExploseL';

on DoDraw do
begin
inherited;
DissipateGroundNeighbors(Context);
end;
end;

field TIndestructibleWall(TWall)
name 'Mur indestructible';

on DoDraw do
begin
inherited;
EditVisualTag := 'X';
end;
end;

plugin TBombPlugin
hint 'Plugin de la bombe';

on PressKey do
var
Map: TMap;
X, Y, Z: Integer;
I, J: Integer;

begin
if Key = Ord('B') then
begin
Map := Player.Map;
X := Player.Position.X;
Y := Player.Position.Y;
Z := Player.Position.Z;

Player.PlaySound('ImpactBomb.wav');
Player discards 1 Bombs;

for I:= -1 to 1 do
for J:= -1 to 1 do
begin
if not((Map[Point3D(X+I, Y+J, Z)].Field is TIndestructibleWall) or
(Map[Point3D(X+I, Y+J, Z)].Field is TWater)) then
Map[Point3D(X+I, Y+J, Z)]:= ExploseLight;
end;

Player.Color :=$FF000080;
Sleep(100);
Player.Color :=$FF0000FF;

for I:= -1 to 1 do
for J:= -1 to 1 do
begin
if not ((Map[Point3D(X+I, Y+J, Z)].Field is TIndestructibleWall) or
(Map[Point3D(X+I, Y+J, Z)].Field is TWater)) then
Map[Point3D(X+I, Y+J, Z)].Field := DarkGround;
if (Map[Point3D(X+I, Y+J, Z)].Field is Water) then
Map[Point3D(X+I, Y+J, Z)] := Water + nil;
end;
end;
end;
end;

object TBombs
name 'Bombe';
image 'Bombe';

on SetCount do
begin
inherited;

if Value > 0 then
Player.AddPlugin(BombPlugin)
else
Player.RemovePlugin(BombPlugin);
end;

end;

end.

Merci Sjrd !
DerF_44
J'ai besoin de l'avis d'un expert !!
Vue que la vérification “sur le terrain” me semble assez difficile et laborieuse, je voudrais être sûr de la pertinence du code suivant :

if (Player.Tag = 53) and (DiffPlugin.Diff <> 1) then
begin
repeat
Esc53X := Random(94)+1;
Esc53Y := Random(94)+1;

Master.Map['BoardColors'].Map[Point3D(Esc53X, Esc53Y, 2)].Effect := DownStairs;
Master.Map['BoardColors'].Map[Point3D(Esc53X, Esc53Y, 1)].Effect := UpStairs;
if Master.Map['BoardColors'].Map[Point3D(Esc53X, Esc53Y, 1)].Field <> Grass then
begin
Master.Map['BoardColors'].Map[Point3D(Esc53X, Esc53Y, 2)].Effect := nil;
Master.Map['BoardColors'].Map[Point3D(Esc53X, Esc53Y, 1)].Effect := nil;
end;

until Master.Map['BoardColors'].Map[Point3D(Esc53X, Esc53Y, 1)].Effect = UpStairs;
end;
Donc, si j'ai bien capté la chose (après les boucles for, les while & cie !! ) aucune chance de voir un escalier montant posé dans un mur !!!????… (vérif faite uniquement sur l'étage 1, l'étage 2 ne comportant pas de mur..)

Merci d'y jeter un œil !
sjrd
Hum, je trouve ça bizarre de faire d'abord les changements, puis d'annuler les changements s'ils n'étaient pas valide.

Mais en fait je ferais ça beaucoup plus simplement. Si j'ai bien compris tu veux trouver une paire (X, Y) telle qu'en (X, Y, 1) et (X, Y, 2), le terrain est de l'herbe. Puis tu veux mettre un UpStairs en (X, Y, 1) et un DownStairs en (X, Y, 2). Alors je ferais ça :
var
Map: TMap;
Esc53X, Esc53Y: Integer;
begin
if ... then
begin
Map := Master.Map['BoardColors'];

// D'abord trouver une bonne paire (X, Y)
repeat
Esc53X := Random(94)+1;
Esc53Y := Random(94)+1;
until (Map[Point3D(Esc53X, Esc53Y, 1)].Field is TGround) and
(Map[Point3D(Esc53X, Esc53Y, 2)].Field is TGround);

// Puis placer les escaliers
Map[Point3D(Esc53X, Esc53Y, 1)].Effect := UpStairs;
Map[Point3D(Esc53X, Esc53Y, 1)].Effect := DownStairs;
end;
end;
DerF_44
Ah oui, effectivement ta méthode est beaucoup + logique !!!
Il faut dire, pour ma défense, que j'ai pas mal galéré avec des boucles while (!) avant de trouver la fonction until allant de paire avec repeat !. Alors quand j'ai vu que mon code avait l'air de fonctionner, soulagé, je me suis attaqué à un autre souci !!

Je ne suis encore qu'un (tout) petit débutant en FunDelphi, et mon projet est assez monstrueux à gérer, mais qu'est ce que je me régale à écrire du code et le voir prendre vie sur les cartes de mon projet !!
Et puis de tâtonner sur certains trucs me donne des idées pour d'autres choses, et, malgré certaines frustrations de ma non-connaissance dans le domaine de la programmation, j'arrive à peu près à pondre ce que je désire et c'est très plaisant !! Certes je te sollicite un peu souvent, et tes coups de mains sont très précieux pour moi, mais y'a pas à dire : Ce logiciel est vraiment vraiment GÉNIAL !!!

Merci de ta correction !!

(C'est quoi "TGround" ?.. La classe des terrains où le joueur peut se déplacer ??..)
sjrd
DerF_44
(C'est quoi “TGround” ?.. La classe des terrains où le joueur peut se déplacer ??..)
La classe de Grass.
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