Entwickler-Ecke

Multimedia / Grafik - Implementierung von Wänden in Delphi 3


Althippie - Do 02.10.03 12:56
Titel: Implementierung von Wänden in Delphi 3
Hallo und guten Tag!

Schön, dass ihr reinschaut in dieses scheinbar leicht lösbare Problem. Doch für den Informatikkurs meiner Schule, dessen fröhliches Mitglied ich zu sein pflege, kann diese Schwierigkeit einfach nicht meistern, trotz aller Bemühungen.
Dabei möchten wir doch einfach nur einige Wände setzen können. So, dass es ein anständiges Labyrinth gibt, optisch sind wir da auch gar nicht anspruchsvoll, wollen halt nur, dass es funktioniert, auch die Verschachtelung wird nur sehr gering sein, im Prinzip also ein kleines fröhliches Progrämmchen.

Ich würde mich über rege Rückantwort - von Leuten, die diese Bewährungsprobe bereits hinter sich haben - freuen.

Tschüssi


ShadowThief - Do 02.10.03 13:08

für 2d würd ich mich mal mit dem Canvas-Objekt auseinandersetzen, da gibt es dann so lustige funktionen wie MoveTo, LineTo usw.
für 3d is das jetzt schon schwieriger ...

shadow.


maximus - Do 02.10.03 13:50

Wie wäre es matrix-basiert? ...im prinzip ein 2D array, in dem für jeden punkt infos über die möglichen richtungen stehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
type
  TDir = (dNone, dLeft, dRight, dUp, dDown);
  TWayKinds = set of TDir;

const
  DirVects : array[0..4]of TPoint = ((x:0;y:0),(x:-1;y:0),(x:1;y:0),(x:0;y:-1),(x:0;y:1)); // zu ordnung der abstrkten richtungen (TDir) in vectoren
  cWayMax     = 16;
  FieldDef : array[0..cWayMax-1] of TWayKinds =
             ([],
              [dLeft ,dRight],
              [dUp   ,dDown ],
              [dRight,dDown ],
              [dDown ,dLeft ],
              [dLeft ,dUp   ],
              [dUp   ,dRight],
              [dLeft ,dRight,dDown ],
              [dUp   ,dDown ,dLeft ],
              [dLeft ,dRight,dUp   ],
              [dUp   ,dDown ,dRight],
              [dLeft ,dRight,dUp   ,dDown ],
              [dRight],
              [dDown],
              [dLeft],
              [dUp]);


Type
     TField = record
        way   : byte; // index des wegtyps, der in FieldDef definiert ist
        item  : byte;
     end;
  
     TMatrix = array of array of TField; // labyrinth map

var matrix:TMatrix; // irgendwie füllen...am besten mit einem map-editor
     pos:Tpoint = (x:1;y:1);
     inputDir:TDir = dNone;
     moveVect:TPoint;
...
// tasten eingabe auslesen...und irgendwie..zB:
// inputDir := dUp;

  moveVect := DirVects[TDir(dNone)]; 

// beim bewegen des player (pos) auf der map
 if inputDir in FieldDef [Matrix[pos.x,pos.y].way] then  // prüfen ob die richtung, in die man will, möglich ist
   moveVect := DirVects[TDir(inputDir)]; // echte richtung holen

 pos.x := pos.x + moveVect.x; // bewegen
 pos.y := pos.y + moveVect.y;

...
...is halt nicht ganz einfach aber sehr dynamisch und effektiv!

PS: zu jedem fieldDef-index würde man ein bild machen, zB. eine T-kreuzung [dLeft ,dRight,dUp] und es an die richtige stelle auf dem spielfeld zeichnen.


bIce - Do 02.10.03 19:57

Eine 3. Möglichkeit, die auch aus einem 2D Array besteht ist, dass Du die Fläche die passierbar ist mit 0 belegst und die Wände mit einer 1.
Dann musst Du bei einer Reaktion auf eine Taste zunächst überprüfen ob das Feld wohin bewegt werden soll passierbar ist oder nicht.
Bsp (im Pseudocode)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
// Das ist die Karte
karte : array[0..4] of array[0..3] of Boolean = 
 ( (1, 1, 1, 1),
  (1, 0, 0, 1),
  (1, 1, 0, 1),
  (1, 0, 0, 1),
  (1, 1, 1, 1) );

startPunkt: TPoint;

// startPunkt initiieren
startPunkt.x := 2; startPunkt.y := 3;

// Hier die Tastaturbehandlung
 if wennNaechstesKeineWand(startPunkt, richtung) then begin
   bewege(startPunkt, richtung);
   zeichneKarte(karte);
   zeichneSpieler(startPunkt);
end;


mimi - Do 02.10.03 20:46

kann mir jemmand erklären was die vorteile von "matrix" sind ?

willst du es drei D haben ?
weil für zwei d hätte ich auch noch was:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const
 mapX= 39;
 MapY=23;

type
  TMap= record
    Tex, Typ:Integer;  
  end;

var
  Map:TMap

draw:
...
create:
...


wenn man dann auch noch DelphiX nutz oder GLXTreem ist das sehr einfach.


Anonymous - Fr 03.10.03 11:53

@mimi:
mich würde jetzt mal interessieren wie das zur Lösung des Problems beitragen soll :roll:

Ich glaube nicht dass man in einem Informatikkurs viel Wert auf besonders Tolle Optik legt.


mimi - Fr 03.10.03 11:58

Zitat:

Ich glaube nicht dass man in einem Informatikkurs viel Wert auf besonders Tolle Optik legt.

wie kommst du auf obtik ?
du musst die wände ja verwalten und das macht man am besten in einem 2D array oder nicht ?


Anonymous - Fr 03.10.03 12:20

allerdings sehe ich da keinen Array und ich weiß dann auch nicht, warum man GLXTreem nehmen sollte.


maximus - Fr 03.10.03 12:42

mimi hat folgendes geschrieben:
...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const
 mapX= 39;
 MapY=23;

type
  TMap= record
    Tex, Typ:Integer;  
  end;

var
  Map:TMap

draw:
...
create:
...


wenn man dann auch noch DelphiX nutz oder GLXTreem ist das sehr einfach.


das soll anscheinend ein witz sein...so einen pseudo lösungsansatz muss man erstmal hinkriegen :evil:

...nix für ungut mimi...aber is'n bisschen mager.


Anonymous - Fr 03.10.03 12:43

das erinnert mich irgendwie an code aus seinem Snake ... :roll:


mimi - Fr 03.10.03 13:02

du hast recht, es wäre einfacher gewesen einfach zu sagen:
schau dir mal diesen link hier an:
http://www.delphi-forum.de/viewtopic.php?t=10073
anstant sich jetzt zu streiten *G* oder ?


NCortex - Fr 03.10.03 15:23

neee mimi wäre auch nicht viel bessa... das tutorial is zwar super.. keine Frage, aber es is zu komplex, er wollte ja nur ne lösung für die wände haben...


Anonymous - Fr 03.10.03 16:23

Zu komplex... eher nutzlos (in diesem Fall)
Und für die Wände sind schon mehrere Lösungen gepostet worden.


Althippie - Sa 04.10.03 19:37

Hallo nochmal,
vielen Dank für eure vielfältigen Lösungsvorschläge und Beiträge, leider interessieren wir uns nur für eine 3D-Animation. Ein einfaches vor- und zurückgehen neben Wänden wäre schon ein großer Schritt und würde uns sehr weiterhelfen.


mimi - Sa 04.10.03 19:54

dann hilf dir vileicht glScene weiter oder direckt openGL, weil das wird dann nicht so einfach.