Wegfindung für "Pacman" -> Problem mit Berechnu
Übersicht

![]() |
M0rgensternBetreff: Wegfindung für "Pacman" -> Problem mit Berechnu |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey Leute.
Ich hab grade ein kleines Problem bei meinem Nebenprojekt. Es ist im Prinzip Pacman, bisher nichts wirklich extras drin. Es geht jetzt drum, meinen Geistern eine neue Richtung zu geben, wenn sie an eine Mauer stoßen. Das Problem ist, dass sie sich pixelweise bewegen und deshalb hängen bleiben, sobald sie was anderen machen sollen, als sich hoch und runter zu bewegen. Der Code fürs Bewegen der Geister sieht momentan so aus: BlitzMax: [AUSKLAPPEN] Method Move() Und der Code für die Funktion GetDirection() sieht folgendermaßen aus: BlitzMax: [AUSKLAPPEN] Method GetDirection() Der Geist bewegt isch am Anfang super nach unten. Abe wenn er dann an die Wand unten kommt, dann bewegt er sich gar nicht mehr. Kann mir bitte jemand sagen, wie ich das besser berechne? Also, irgendwie ne Toleranz oder so einbaue, bzw was ich am besten da mache? Lg, M0rgenstern |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
tausch doch mal so durch:
BlitzMax: [AUSKLAPPEN] If iDirection = 1 Then dann biegt er an einer Wand immer um 90° ab. |
||
![]() |
Chrise |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMax: [AUSKLAPPEN] Select iDirection wäre es so nicht sogar noch effizienter und übersichtlicher? ![]() |
||
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet. |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh verdammt.
Da hab ich mich total vertan mit den Zahlen. Danke dafür. Tut mir echt leid. Lg M0rgenstern Edit: aber selbst wenn ich statt diesem code den auskommentierten code in getdirection benutze hängt der geist sich auf. Da muss eher irgendwas bei der Kollisionsberechnung in der Methode Move sein. Das meinte ich eigentlich. Lg M0rgenstern. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eigentlich müsste er wenigstens rückwärts wieder rauskönnen.
Beziehen sich deine Koordinaten Fx und Fy auf die Mitte deiner Spielfigur oder auf die linke obere Ecke? Denn nur, wenn sie sich auf die Mitte beziehen, stimmt das mit dem jeweiligen Dazurechnen/Abziehen von iTileSize/2. Möglicherweise ist ja seine 1. X-Position schon zu nahe an einer linken Wand. Da er ja aber abwärtsgeht, wird immer die Tile bei... Zitat: Fx, Fy+iTileSize/2
...geprüft. Dann dreht er und nun prüft er... Zitat: Fx -iTileSize/2, Fy
...und das reicht halt auch nicht mehr... Aber was mich eben wundert, ist, dass er dann nicht wieder hochlaufen kann, denn hier gilt ja: Zitat: Fx, Fy-iTileSize/2
...und der Weg ist auf jeden Fall frei. Bau doch mal ein paar DEBUGLOG ein, damit Du siehst, weshalb er hier nicht mehr weiterkommt: BlitzMax: [AUSKLAPPEN] Method GetDirection() |
||
- Zuletzt bearbeitet von Midimaster am Do, Apr 22, 2010 15:39, insgesamt einmal bearbeitet
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm,
Also das ist echt seltsam. Ich hab die Sache mit dem Debuglog jetzt mal eingefügt und richtig abgeändert (Bei unten und Links muss es + itilesize/2 heißen). Wird auch alles angezeigt. Aber: Sobald er an eine Stelle kommt, wo er eine neue Richtung bekommen soll, bekommt er die noch zugeweisen, bewegt sich aber ab dann nicht mehr. Also, es ist, als würde die der Befehl Move nicht mehr aufgerufen werden. Denn er hängt nicht nur an der Stelle. Der Debuglog bleibt auch immer der gleiche. Also, das ganze wird einmal angezeigt aber dann kommt nie mehr etwas hinzu. Die Koordinaten des Gegner beziehen sich auf den BIldmittelpunkt. Lg, M0rgenstern |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
um sicher zu gehen, dass es nicht nurso aussieht als ob der DEBUGGER steht, fügst du eine Millisecs() an die letzte Debug-Zeile:
BlitzMax: [AUSKLAPPEN] DebugLog " Direction nachher" + iDirection + " bei Zeit=" + MilliSecs() Danke für den Hinweis zu -iTileSize/2. Da hatte ich einen Tippfehler! Welche Werte druckt er denn aus im Debugger, wenn er ganz unten angekommen ist? Vielleicht sollten wir in die Debugger-Zeilen noch mehr Information packen: BlitzMax: [AUSKLAPPEN]
...entsprechend auch für die anderen Zeilen.... würde dann sowas ergeben: Zitat: DEBUG: Oben bei (5,13)...Inhalt=1
Theoretisch müßten ja immer 3 Werte=0 sein und nur der nach unten wäre auf 1 mich würde jetzt dabei interessieren, ob er wirklich die richtigen Felder betrachtet. Ausgehend vom Spielerfeld in 4 Himmelsrichtungen. |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also.
Es werden immer die richtigen Felder betrachtet und es kommt im Debuglog nichts neues hinzu. Das sieht man alleinschon, weil er nie länger wird. Und die Zeit ändert sich auch nie. Hier der auszug: Zitat: DebugLog: Direction vorher 2 bei Zeit=1094531
DebugLog:Felder um Spieler herum: DebugLog: Ich bei: (24/16)...Inhalt=0 DebugLog: Oben bei: (24/15)...Inhalt=0 DebugLog: Unten bei: (24/17)...Inhalt=1 DebugLog: Links bei: (23/16)...Inhalt=0 DebugLog:Rechts bei: (25/16)...Inhalt=1 DebugLog: Direction nachher: 3 Und dass rechts und unten belegt sind stimmt auch, denn der Geist steht in einer Ecke, also folgedermaßen: Zitat: | G| ---- Ist jetzt vielleicht nicht so gut zu erkennen, aber ich hoffe, das Prinzip ist klar. Kann auch nen Sreenshot von machen, wenn gewünscht. Ich versteh das ganze wirklich nicht. LG, M0rgenstern |
||
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab nicht alles gelesen,
aber du könntest in den Select Block je nach Richtung eine kleine Positionsveränderung einfügen z.B bei einer Wand link ein paar Pixel nach rechts. Wie gesagt, ich könnt mir vorstellen dass das hilft. lg ComNik |
||
WIP: Vorx.Engine |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Öhm, das hilf eher nicht, denn sobald er eine Kollision erkennt ruft er die Funktion GetDirection() auf. UNd genau in dieser ist die Sache mit dem Debuglog.
Das heißt, wenn es daran liegen würde, dass er irgendwo nicht wegkommt müsste diese Funktion öfter aufgerufen werden, was aber einfach nicht der Fall ist. Lg, M0rgenstern EDIT: Okay, hab das Problem gelöst. Hatte zwei Variablennamen in der Move() Methode noch auf der alten Version. Deshalb hat er sich nicht bewegt. Tut mir leid. Vielen Dank für eure Hilfe. Klappt jetzt. Lg, M0rgenstern |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
muss dir nicht leid tun...
wie biste jetzt draufgekommen? haben die DEBUGLOGs dabei geholfen, dann kannst du sie zukünftig ja intensiver einsetzen. |
||
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, ich bin dadruch drauf gekommen, dass er nichtmal versucht hat sich nach Links zu bewegen und hab dann mal nachgeguckt, ob ich da vielleicht irgendeinen Blödsinn stehen habe.
Bin Debuglogs grade schon bei nem anderen Prolbem seeehr intensiv am Nutzen und bekomme genau wegen denen Programmabstürze^^ Lg, M0rgenstern. Vielen Dank nochmal. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group