Zu viele Sprites? [Gelößt]

Anfängerfragen zum Programmieren mit PureBasic.
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Re: Zu viele Sprites?

Beitrag von ullmann »

Hallo Raphi,

ich habe mir dein Zip-Paket mal runtergeladen und ausprobiert.

Deinen beschriebenen Fehler kann ich nicht nachvollziehen. Obwohl deine roten Sprites im Quelltext verwendet werden, d.h. sie sind nicht
auskommentiert, gibt es bei mir kein weißes Fenster. Ich habe viele Male das Programm gestartet und jedesmal hat es den Hintergrund
komplett gezeichnet und dann einen Weg eingezeichnet. (Ich habe XP / SP3).

Ein Mangel besteht: Liegen Start und Ziel nicht auf derselben Zeile (StartY <> ZielY), dann werden sie vom Weg überzeichnet und sind
nicht mehr zu sehen.

In der Procedure StartZiel():

Code: Alles auswählen

If Not StartX=0 Or StartX=15
Da StartX wegen dem Random(15) Befehl eine ganze Zahl von 0 bis 15 ist, ist diese Bedingung wahr für jedes StartX größer Null
(Not hat eine höhere Priorität als Or, nachzulesen in der Hilfe unter "Variablen, Typen und Operatoren"). Ich weiß nicht, ob du das so
wolltest.
Wenn ja, dann wäre es so einfacher:

Code: Alles auswählen

If StartX > 0
Weiterhin:

Code: Alles auswählen

Procedure BackGround() ; Schleife zum Zeichnen des Hintergrundes
  
For x = 0 To 16
        
  For y =0 To 12
      
    DisplaySprite(1,64*x,64*y)
Das Fenster hat Platz für 16 x 12 Felder. Da die Zählung mit Null beginnt, reicht es aus, wenn x bis 15 und y bis 11 gezählt wird.

Hier ein Vorschlag, wie ich den Weg zeichnen würde. Die Prozeduren Wegfindung1, Wegfindung2 und Wegfindung3 wären zu löschen.
Die Prozedur Wegfindung zeichnet den Weg bei beliebigem Start/Ziel.

Code: Alles auswählen

Procedure WegFindung() ; Findet den direkten Weg vom Start zum Ziel
 
   StartDrawing(ScreenOutput())

     deltaX = ZielX - StartX : SchrittX = Sign(deltaX)
     deltaY = ZielY - StartY : SchrittY = Sign(deltaY)
     
     WegX = StartX
     WegY = StartY
     
     If Abs(deltaX) >= 2 ; zeichne horizontalen Weg
       
       WegX + SchrittX
       
       While WegX <> ZielX
         
         DisplaySprite(2, WegX * 64, WegY * 64)
         
         WegX + SchrittX
         
       Wend 
       
       WegX - SchrittX ; Korrektur, falls Kurve erforderlich
       
     EndIf
     
     If Abs(deltaX) >= 1 And Abs(deltaY) >= 1 ; zeichne Kurve
       
       WegX + SchrittX
       
       If deltaX > 0
         If deltaY > 0 : Kurve = 4 : Else : Kurve = 5 : EndIf
       Else
         If deltaY > 0 : Kurve = 6 : Else : Kurve = 7 : EndIf
       EndIf
       
       DisplaySprite(Kurve, WegX * 64, WegY * 64)
              
     EndIf
     
     If Abs(deltaY) >= 2 ; zeichne vertikalen Weg
       
       WegY + SchrittY
       
       While WegY <> ZielY
         
         DisplaySprite(3, WegX * 64, WegY * 64)
         
         WegY + SchrittY
         
       Wend
       
     EndIf
  
  StopDrawing()
      
  FlipBuffers()
  
EndProcedure
Solltest du später mal Hindernisse umgehen wollen, so wirst du an einem gängigen Wegfindungsalgorithmus,
z.B. dem A*-Algorithmus, nicht vorbeikommen.

Das waren aber nur Optimierungsvorschläge. Dein eigentliches Problem tritt leider (zum Glück) bei mir nicht auf.

Edit:

Deine neuere Version StartZiel() startet ja nur, wenn StartX = ZielX und StartY = ZielY ist:

Code: Alles auswählen

Procedure StartZiel() ; Findet einen Zufälligen Start und Zielpunkt
  
While StartX=ZielX And StartY=ZielY  
Dies hier startet in jedem Fall und ist erst fertig, wenn Start <> Ziel ist:

Code: Alles auswählen

Repeat
  
  ; hier Start und Ziel berechnen
  
Until StartX <> ZielX Or StartY <> ZielY
Gruß
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Zu viele Sprites?

Beitrag von Raphi »

Erstmal vielen dank für deine mühe. Is ja eine ganze menge was du gefunden hast 8)
ullmann hat geschrieben: Ein Mangel besteht: Liegen Start und Ziel nicht auf derselben Zeile (StartY <> ZielY), dann werden sie vom Weg überzeichnet und sind
nicht mehr zu sehen.
Das ist absicht, das sollte so sein. Eigentlich will ich start und zielpunkt auch einfach nur als Weg anzeigen lassen, die Graphiken waren nur zur orientierung da.
ullmann hat geschrieben: In der Procedure StartZiel():
Da StartX wegen dem Random(15) Befehl eine ganze Zahl von 0 bis 15 ist, ist diese Bedingung wahr für jedes StartX größer Null
Ich weiß nicht, ob du das so
wolltest.
Ja, das ist schon richtig so. Wenn StartX 1-14 ist muss ja StartY 0 oder 11 sein.
Wenn nicht kann StartY jede beliebige Zahl sein.

Start und Zielpunkt sollen ja auf den Außenlinien liegen.

Wenn ich If StartX<0 benutze funktioniert das mit Else dann nichtmehr bzw. der StartX punkt liegt immer auf der rechten seitenlinie und nur dann hat StartY einen beliebigen wert. Aber StartY soll ja, wenn StartX am Linken UND am Rechten bildschirmrand eine beliebige Y Koordinate haben :D
ullmann hat geschrieben: Das Fenster hat Platz für 16 x 12 Felder. Da die Zählung mit Null beginnt, reicht es aus, wenn x bis 15 und y bis 11 gezählt wird.
JO, das war mir etwas entfallen. Hatte ja lang nicht mehr Programmiert und deswegen die 0 nicht als variable gerechnet :mrgreen:
ullmann hat geschrieben: Hier ein Vorschlag, wie ich den Weg zeichnen würde. Die Prozeduren Wegfindung1, Wegfindung2 und Wegfindung3 wären zu löschen.
Die Prozedur Wegfindung zeichnet den Weg bei beliebigem Start/Ziel.
Vielen, vielen dank dafür.

Hab ja noch nicht so viel erfahrung mit Programmierung und so eine Wegfindung hat mir immer Probleme bereitet.
Ich hatte überhaupt keine idee wie ich das anfangen sollte, aber jetzt habe ich wenigstens mal ein Beispiel.
ullmann hat geschrieben: Solltest du später mal Hindernisse umgehen wollen, so wirst du an einem gängigen Wegfindungsalgorithmus,
z.B. dem A*-Algorithmus, nicht vorbeikommen.
Nun ja, ich bäruchte nur teilweise einen wegfindungsalgorithmus eher etwas was nicht den direkten weg sondern einen beliebig langen weg zeichnet. Aber das kommt ja erst später.
ullmann hat geschrieben: Deine neuere Version StartZiel() startet ja nur, wenn StartX = ZielX und StartY = ZielY ist
Das Stimmt, aber da StartX usw ja keinen wert haben sind sie automatisch am anfang 0 und somit startet die Fuktion auch :)

Aber bei deiner Funktion, liegen start und Ziel X nie auf derselben lienie. Sie sollen sich ja nur nicht überschneiden.
Bei meiner Funktion klappt das jedenfalls.
ullmann hat geschrieben: Deinen beschriebenen Fehler kann ich nicht nachvollziehen. Obwohl deine roten Sprites im Quelltext verwendet werden, d.h. sie sind nicht
auskommentiert, gibt es bei mir kein weißes Fenster. Ich habe viele Male das Programm gestartet und jedesmal hat es den Hintergrund
komplett gezeichnet und dann einen Weg eingezeichnet. (Ich habe XP / SP3).
Nun ja bei mir ist der Fehler immer aufgetreten, aber dank deiner neuen Wefindung klappt das jetzt auch wunderbar. :allright:

Ein Fettes Dankeschön, du hast mich sehr bereichert. :bounce:

Edit:

Zwar habe ich nicht rausgefunden was der Fehler war, aber wenigstens kann ich jetzt weitermachen :lol:
ullmann
Beiträge: 205
Registriert: 28.10.2005 07:21

Re: Zu viele Sprites?

Beitrag von ullmann »

Schauen wir doch mal ins Detail:
Ja, das ist schon richtig so. Wenn StartX 1-14 ist muss ja StartY 0 oder 11 sein.
Wenn nicht kann StartY jede beliebige Zahl sein.

Code: Alles auswählen

  StartX=Random(15) 
  
If Not StartX=0 Or StartX=15
Angenommen StartX ist gleich 15. Not StartX=0 ist wahr. StartX=15 ist wahr. Wahr Or wahr ist wahr. Die Bedingung ist erfüllt.
StartY kann jetzt nur noch 0 oder 11 werden, obwohl StartX auf dem rechten Rand liegt.

Zur Problemlösung könntest du Klammern setzen:

Code: Alles auswählen

If Not ( StartX=0 Or StartX=15)
oder auch so:

Code: Alles auswählen

If StartX >= 1 And StartX <= 14
Wenn ich If StartX<0 benutze funktioniert das mit Else dann nichtmehr
Ich sagte ja StartX>0, nicht <0. Aber das entsprach der fehlerhaften IF-Abfrage und ist jetzt ohne Belang.
Start und Zielpunkt sollen ja auf den Außenlinien liegen.
Dann sollte hier auf ZielX getestet werden, nicht auf StartX, und ebenfalls mit Klammern oder "And" wie oben:

Code: Alles auswählen

ZielGeneration:

  ZielX=Random(15) 
  
If Not StartX=0 Or StartX=15
Das Stimmt, aber da StartX usw ja keinen wert haben sind sie automatisch am anfang 0 und somit startet die Fuktion auch
Wenn du die Prozedur nur einmalig benutzt, hast du Recht. Aber es sieht dennoch nach unsauberer Programmierung aus. Und wenn du
später mal die Prozedur mehrmals nutzt, hast du schnell einen Bug im Programm, den du dann erst mal finden müsstest.
Aber bei deiner Funktion, liegen start und Ziel X nie auf derselben lienie. Sie sollen sich ja nur nicht überschneiden.

Code: Alles auswählen

Until StartX <> ZielX Or StartY <> ZielY
Wenn StartY ungleich ZielY ist, dann kann StartX gleich ZielX sein, es ist ja nur "Or"-verknüpft, die Ende-Bedingung wäre trotzdem erfüllt.
Die Endebedingung ist nur dann nicht erfüllt, wenn beide Or-Zweige Falsch ergeben, d.h. wenn StartX = ZielX ist und StartY = ZielY.
Dann wäre das Start- und Zielfeld identisch und das sollte es ja sicher nicht sein.
Zwar habe ich nicht rausgefunden was der Fehler war, aber wenigstens kann ich jetzt weitermachen
Ich habe auch keine Vorstellung wo der Fehler gesteckt haben könnte.

Übrigens hast du schöne Grafiken und als Anfänger schon eine ganze Menge auf die Reihe gebracht. Mach weiter so. :)

Gruß
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Zu viele Sprites?

Beitrag von Raphi »

ullmann hat geschrieben: Zur Problemlösung könntest du Klammern setzen:

Code: Alles auswählen

If Not ( StartX=0 Or StartX=15)
oder auch so:

Code: Alles auswählen

If StartX >= 1 And StartX <= 14
HEHE, genau das wollte ich Danke :allright:

Code: Alles auswählen

Until StartX <> ZielX Or StartY <> ZielY
:oops: Ich And anstatt Or benutzt Peinlich, Peinlich ^^
Übrigens hast du schöne Grafiken
Ja die hab ich einfach mit gimp so hingeckleckert, da gibts son schönen stempel mit dem hab ich das alles gemacht, nichts außerordentliches :lol:
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Zu viele Sprites?

Beitrag von Raphi »

Lol.

Ich wollte jetzt 4 weitere graphiken zeichnen also hab ich sie mit in die Drawing Prozedur gesteckt.

Was kommt? Withscreen. Dann Deaktiviere ich Start/Stop-Drawing/Flipp Buffers in der WegFindung Prozedur und packe die 4 Graphiken da rein und sihe da es geht?????

Die Graphiken werden Trotzdem gezeichnet obwohl sie außerhalb eines Start-Stop-Flipp Buffer Befehls liegen? Lol und jetzt geht es :D

Ka ob das was mit meine Pc zu tun hat oder ob es doch eher ein Pure Basic Bug ist. :? Naja hauptsache es geht wieder :mrgreen:
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Zu viele Sprites?

Beitrag von Danilo »

Raphi hat geschrieben:Die Graphiken werden Trotzdem gezeichnet obwohl sie außerhalb eines Start-Stop-Flipp Buffer Befehls liegen? Lol und jetzt geht es :D

Ka ob das was mit meine Pc zu tun hat oder ob es doch eher ein Pure Basic Bug ist. :? Naja hauptsache es geht wieder :mrgreen:
Hast Du irgendwo gelesen das DisplaySprite() ein Start/StopDrawing braucht? :)
Zwischen StartDrawing() & StopDrawing() gehören nur die Befehle der
2DDrawing Befehlsbibliothek, siehe PB-Hilfe.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Raphi
Beiträge: 175
Registriert: 06.08.2009 16:32
Computerausstattung: Intel Core 2 Duo Processor (2 x 3 Ghz), ATI Radeon HD 4870 (512 MB), 4 GB DDR-2 Ram, Microsoft Windows 7 Ultimate, MBox 2 Mini Soundkarte

Re: Zu viele Sprites?

Beitrag von Raphi »

Danilo hat geschrieben:
Raphi hat geschrieben: Hast Du irgendwo gelesen das DisplaySprite() ein Start/StopDrawing braucht? :)
Zwischen StartDrawing() & StopDrawing() gehören nur die Befehle der
2DDrawing Befehlsbibliothek
:oops: Anfängerfehler o.O, aber hat keiner von den anderen Leuten die Mir bei dem Problem geholfen haben, hams gemerkt :D

Dann war das Anscheinend der Ganze Fehler.

Thks, dann weiß ich jetzt bescheid :allright:
Antworten