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)); 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; item : byte; end; TMatrix = array of array of TField; var matrix:TMatrix; pos:Tpoint = (x:1;y:1); inputDir:TDir = dNone; moveVect:TPoint; ...
moveVect := DirVects[TDir(dNone)];
if inputDir in FieldDef [Matrix[pos.x,pos.y].way] then moveVect := DirVects[TDir(inputDir)]; pos.x := pos.x + moveVect.x; 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:
| 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.x := 2; startPunkt.y := 3;
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:
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!