Methode zur "Wegfindung"

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bigfreddy

Betreff: Methode zur "Wegfindung"

BeitragDo, Feb 03, 2005 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo erstmal,

wir, mein Freund und ich, haben früher mit Borland Pascal (f. Win.) programmiert. Da wir, aber mehr Spiele proggen. wolln , sind wir auf BB umgestiegen.
Nun, soweit so gut, wir haben einen 2D-"Ego"-Shooter (klingt doch geil) programmiert.
Jetzt wolln wir aber, dass die Soldaten nicht blöd immer gradaus marschieren, sondern, dass sie z.B.Treppen runtergehen.
Wir haben uns dazu gedanken gemacht und haben so gedacht:

Wir erstellen eine Bitmap, auf der die ganzen möglichen Wege eingezeichnet sind (gelb auf weiß), dann sucht das Prog. die 8 umliegenden Pixel (zum aktuellen Pixel) ab, ob es gelb ist.
Dorthin geht dann der Soldat.Dann die nächsten umliegenden Pixel u.s.w.

Problem: Schnelligkeit von Getcolor()

Wir müssten dann (8 mal max. 15(Max. Zahl von Soldaten)mal gettcolor() (oder vergleichbares) aufrufen...


Weiter haben wir uns überlegt, wir nehmen ein Array/Dim-Feld von 800,600 und schreiben dann dort hinen True , für möglichen Weg, bzw. False.
Dies geht wahrscheinlich etwas schneller, aber wahrscheinlich noch nicht ausgereift.

Also meine/unsere Frage an euch:
Wie kann man das besser verwirklichen, dass die Soldaten nicht immer sturr gradaus gehn?

Vielen Dank im vorraus.
MfG!

P.S.:Wir haben kein Type, sondern Dim-Felder, da die Soldatenzahl immer gleich bleibt...

rambo256

BeitragDo, Feb 03, 2005 0:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutzt Waypoints,die dann eure Soldaten ablaufen.
Wie die dann dahin kommen,könnt ihr dann mit Pathfindingalgorythmen rausfinden.
hier: http://www.blitzbase.de/quellcode/pathfinding.zip
findet ihr solch ein Programm,was dies demonstriert und wo auch der Sourcecode mit dabei ist.
weiterhin gutes gelingen!!
Asus F53z

Das Leben ist eine reine Konkatenation...
 

Omenaton_2

BeitragDo, Feb 03, 2005 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht mit GetColor arbeiten!
Die Grundvorstellung mit den 2 Farben ist gut, aber ihr solltet das abstrakter betrachten.
Diese Grafik sollte in der Wirklichkeit gar keine echte BitMap sein, sondern eine "Projektion". Bildet das BitMap in zum Beispiel eine eine schnelle BANK mit Zahlen (0=Weiß, 1 = Gelb, und mehr ist auch möglich) ab.
Ihr schaut dann nicht nach Farben auf dem Bildschirm sondern nach dem an die gesuchten Stelle in der Bank. Das echte, imaginäre BitMap wird also in Zahlen aufgeteilt und in eine Bank eingelesen.
Also, speichert die Informationen Koordinaten weise und nicht nach echten Farben.

Beispiel:
Ihr habt eine 6x4 Felder großen Level (kann natürlich wesentlich größer sein). Ihr macht eine eine Grafik mit gelb Weiß in eurem Editor.
Ihr erstellt eine Bank mit der Größe 6x4= 24. (Anmerkung: ich würde das erste Feld als Koordinate 1/1 nehmen, und nicht mit Null anfangen, einfacher so.)
Wenn die Bank erstellt wird, steht erstmal überall 0 drin.
Dann geht ihr eure "Grafik" von Links Oben nach rechts Unten Zeile für Zeile durch und checkt die Farbe. Wenn Gelb, dann schreibt ihr da eine 1 rein.

Später in Spiel braucht ihr nur die Feld-ID des auf Begehbarkeit zu überprüfendes Feldes zu ermitteln und dann Anhand dessen schaut ihr in der Bank an der entsprechender Offset nach, ob frei oder nicht.

Spikespine

BeitragDo, Feb 03, 2005 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Übrigen würde ich anstatt GetColor immer ReadPixelFast verwenden.
 

Bigfreddy

BeitragDo, Feb 03, 2005 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke erstmal für die schnelle Hilfe.

@Omenaton_2 :

1.)Meinst du mit Bank eine Dim-Feld?
Wenn nicht, was ist dann eine Bank

2.)Wenn ich dich richtig verstehe, dann soll das so gehen:

Code: [AUSKLAPPEN]

for hilfs=1 to 800
for hilfs2=1 to 600
Wegpunkte(hilfs,hilfs2)=0
next
next


for hilfs=1 to 800
for hilfs2=1 to 600
LockBuffer FrontBuffer()
rgb=ReadPixelFast(MouseX(),MouseY())
r=(rgb And $FF0000)/$10000
UnlockBuffer FrontBuffer()
if r=255 then Wegpunkte(hilfs,hilfs2)=1
next
next


;Füllen der Dim-Felder (rot=1 weiß=0)

Und dann später halt prüfen, ob ne eins oder ne null drinsteht...

@rambo256:Danke, aber des ist für solche Anfänger wie wir es sind nichts...

MfG!

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group