Seite 1 von 3

Zu viele Sprites? [Gelößt]

Verfasst: 26.07.2011 19:38
von Raphi
HI Leute ich hab ein kleines problem mit den sprites.

Code: Alles auswählen

For deltaX = 1 To StartX-ZielX-1

        DisplaySprite(2,StartX*64-(deltaX*64),StartY*64)
        
      Next

    Delay(100)
    
    If deltaY = 0 ; Start und Zielpunkt liegen auf einer Wagerechten
      
      Delay(100)
      
    ElseIf deltaY > 0 ; Der Startpunkt liegt tiefer als der Zielpunkt
      
        
  
        For deltaY = 1 To StartY-ZielY
       
        DisplaySprite(3,ZielX*64,StartY*64-(deltaY*64))
        
      Next
      
DisplaySprite(7,ZielX*64,StartY*64)


DisplaySprite(4,StartX*64,StartY*64)

Code: Alles auswählen

Delay(100)
      
    ElseIf deltaY < 0 ; Der Startpunkt liegt höhel als der Zielpunkt
      
      
      
      deltaY*-1
   
        For deltaY = 1 To (StartY-ZielY)*-1

        DisplaySprite(3,ZielX*64,StartY*64+(deltaY*64))
         
      Next
      
DisplaySprite(6,ZielX*64,StartY*64)
DisplaySprite(5,StartX*64,StartY*64)

Code: Alles auswählen

 Delay(100)
        
      EndIf
Wenn ich das durchlaufen lasse und nur jeweils 1 der rot markierten befehle drin habe funktioniert das ganze, wenn ich aber jezt beide durchlaufen lasse bekomme ich weinen weißen screen und garnichts funktioniert mehr.

Kann jm helfen?

Re: Zu viele Sprites?

Verfasst: 26.07.2011 20:02
von HeX0R
Das kann ja nicht gehen.
Dein Sprite 4 ist mit 1024x1024 Pixel doch viel zu groß für den 800x600 Pixel Screen.

Ausserdem ist die hintere Grauschulter beim Sprite 5 drei Pixel nach links verschoben.

Re: Zu viele Sprites?

Verfasst: 26.07.2011 20:09
von NicTheQuick
@HeX0R:
Wir sind hier in "Anfänger".

@Raphi:
Du bist doch jetzt auch schon länger in diesem Forum. Mit deinen Informationen kann man einfach nichts anfangen. Bitte ergänze deinen ersten Post um Informationen, die uns helfen könnten, oder noch besser: Erstelle ein lauffähigen Beispiel, mit dem man nachvollziehen kann, was schief geht. Mit diesem merkwürdig formatierten Code kann hier niemand etwas anfangen. Gehören die alle zusammen oder wie? Um eine Code-Zeile zu markieren kannst du auch einen Kommentar dahinter schreiben.

Änderst du nichts an deiner Fragestellung, kann man den Thread genau so gut in den Müll verschieben, da sonst höchstens Trolle kommen.

In dem Sinne...

Re: Zu viele Sprites?

Verfasst: 26.07.2011 20:18
von Raphi
HeX0R hat geschrieben:Das kann ja nicht gehen.
Dein Sprite 4 ist mit 1024x1024 Pixel doch viel zu groß für den 800x600 Pixel Screen.
? Wiso meinst du is Sprite 4 1024x1024 pixel groß?

außerdem habe ich einen 1024x786 pixel Screen!

@NicTheQuick

Ich dachte eigentlich das is einfach son Pure basic problem, und ich wollt nicht erst wieder die ganzen graphiken usw hochladen.

Code: Alles auswählen

;************************************************* Konstanten *********************************************************

Global StartX ; X Koordinate des Startpunktes
Global StartY ; Y Koordinate des Startpunktes
Global ZielX  ; X Koordinate des  Zielpunktes
Global ZielY  ; Y Koordinate des  Zielpunktes
Global deltaX ; Differenz zwischen StartX und ZielX punkt
Global deltaY ; Differenz zwischen StartY und ZielY punkt


;************************************************* Procedures *********************************************************

Procedure Wegfindung3() ; Teilschleife von WegFindung() ; tritt ein wenn der Startpunkt links vom Zielpunkt liegt
  
    deltaX*-1
  
    For deltaX = 1 To (StartX-ZielX)*-1-1
 
     DisplaySprite(2,StartX*64+(deltaX*64),StartY*64)
    
    Next
   
    Delay(100)
    
    If deltaY = 0 ; Start und Zielpunkt liegen auf einer Wagerechten
      
      Delay(100)
      
    ElseIf deltaY > 0 ; Der Startpunkt liegt tiefer als der Zielpunkt
   
      For deltaY = 1 To StartY-ZielY
       
      DisplaySprite(3,ZielX*64,StartY*64-(deltaY*64))
        
      Next
      
      DisplaySprite(6,StartX*64,StartY*64)
      
      DisplaySprite(5,ZielX*64,StartY*64)
  
      Delay(100)
      
    ElseIf deltaY < 0 ; Der Startpunkt liegt höhel als der Zielpunkt
      
      deltaY*-1
   
      For deltaY = 1 To (StartY-ZielY)*-1

      DisplaySprite(3,ZielX*64,StartY*64+(deltaY*64))
         
      Next
      
      DisplaySprite(7,StartX*64,StartY*64)
      
      DisplaySprite(4,ZielX*64,StartY*64)
    
      Delay(100)
        
      EndIf
      
EndProcedure

Procedure Wegfindung2() ; Teilschleife von WegFindung() ; tritt ein wenn der Startpunkt rechts vom Zielpunkt liegt
  
    For deltaX = 1 To StartX-ZielX-1

        DisplaySprite(2,StartX*64-(deltaX*64),StartY*64)
        
      Next

    Delay(100)
    
    If deltaY = 0 ; Start und Zielpunkt liegen auf einer Wagerechten
      
      Delay(100)
      
    ElseIf deltaY > 0 ; Der Startpunkt liegt tiefer als der Zielpunkt
      
        
  
        For deltaY = 1 To StartY-ZielY
       
        DisplaySprite(3,ZielX*64,StartY*64-(deltaY*64))
        
      Next
      
      DisplaySprite(7,ZielX*64,StartY*64)
      
      
      DisplaySprite(4,StartX*64,StartY*64)
      
      Delay(100)
      
    ElseIf deltaY < 0 ; Der Startpunkt liegt höhel als der Zielpunkt
      
      
      
      deltaY*-1
   
        For deltaY = 1 To (StartY-ZielY)*-1

        DisplaySprite(3,ZielX*64,StartY*64+(deltaY*64))
         
      Next
      
      DisplaySprite(6,ZielX*64,StartY*64)
      DisplaySprite(5,StartX*64,StartY*64)
    
        Delay(100)
        
      EndIf
      
EndProcedure

Procedure Wegfindung1() ; Teilschleife von WegFindung() ; tritt ein wenn Start und Zielpunkt auf einer Senkrechten liegen
     
    If deltaY = 0 
      
      MessageRequester("Error","Start & Ziel haben selbe Position")
      
      Delay(100)
      
    ElseIf deltaY > 0 ; Der Startpunkt liegt tiefer als der Zielpunkt
  
        For deltaY = 0 To StartY-ZielY
       
        DisplaySprite(3,StartX*64,StartY*64-(deltaY*64))
        
      Next
  
        Delay(100)
        
    ElseIf deltaY < 0 ; Der Startpunkt liegt höhel als der Zielpunkt
        
      deltaY*-1
   
        For deltaY = 0 To (StartY-ZielY)*-1

        DisplaySprite(3,StartX*64,StartY*64+(deltaY*64))
         
        Next
    
        Delay(100)
        
      EndIf
      
EndProcedure

Procedure WegFindung() ; Findet den Direkten Weg von Start zum Ziel
 
   StartDrawing(ScreenOutput())

   deltaX = StartX-ZielX
    
   deltaY = StartY-ZielY
  
   If deltaX = 0 ; Start und Zielpunkt liegen auf einer Senkrechten
     
     Wegfindung1()

   ElseIf deltaX > 0 ; Der Startpunkt liegt rechts vom Zielpunkt
     
     Wegfindung2()

  ElseIf deltaX < 0 ; Der Startpunkt Liegt links vom Zielpunkt
    
    Wegfindung3()

  Else
    
    MessageRequester("Error","deltaX hat keinen Wert")
    
    Delay(100)
 
  EndIf
  
  StopDrawing()
      
  FlipBuffers()
  
EndProcedure

Procedure StartZiel() ; Findet einen Zufälligen Start und Zielpunkt
  
  StartX=Random(15) 
  
If Not StartX=0 Or StartX=15
  
  StartY=Random(1)
  
  If StartY=1
    
    StartY=11
    
  EndIf
  
Else
  
  StartY=Random(11)
  
EndIf 

Delay(100)

ZielGeneration:

  ZielX=Random(15) 
  
If Not StartX=0 Or StartX=15
  
  ZielY=Random(1)
  
  If ZielY=1
    
    ZielY=11
    
  EndIf
  
Else
  
  StartY=Random(11)
  
EndIf  

If StartX=ZielX And StartY=ZielY
  
  Goto ZielGeneration:
  
EndIf

Delay(100)
  
EndProcedure

Procedure Quadrate() ; Definiert die einzelne Quadrate in einem Array
  
  Dim Quadrat(15,11) 
  
  For y=0 To 11
  
    For x=1 To 16
    
      Quadrat(x-1,y) = x+(y*16)
    
    Next
    
  Next
  
  Delay(100)
  
EndProcedure
  
Procedure Path() ; Darstellen des Start & Zielpunktes
  
  DisplaySprite(8,64*StartX,64*StartY)
  DisplaySprite(9,64*ZielX,64*ZielY)
  
  Delay(100)
   
EndProcedure    

Procedure BackGround() ; Schleife zum Zeichnen des Hintergrundes
  
For x = 0 To 16
        
  For y =0 To 12
      
    DisplaySprite(1,64*x,64*y)
          
  Next
      
Next  

Delay(100)
  
EndProcedure

Procedure Drawing() ; Zeichnet den Hintergrund & Start & Zielpunkt
    
StartDrawing(ScreenOutput())
  
BackGround()

Path()
      
StopDrawing()
      
FlipBuffers()

Delay(100)
      
EndProcedure  

Procedure LoadingSprites() ; Lädt die Bilder
  
  LoadSprite(1,"Grass.png")
  LoadSprite(2,"Weg_H.png")
  LoadSprite(3,"Weg_V.png")
  LoadSprite(4,"Weg_Kurve_LD.png")
  LoadSprite(5,"Weg_Kurve_LU.png")
  LoadSprite(6,"Weg_Kurve_RD.png")
  LoadSprite(7,"Weg_Kurve_RU.png")
  LoadSprite(8,"Start.png")
  LoadSprite(9,"Ziel.png")
  
  Delay(100)

  EndProcedure
  
;************************************************* Hauptschleife ******************************************************
  
If InitSprite()

  If OpenWindow(0,100,100,1024,786,"Tower Defence")

    If OpenWindowedScreen(WindowID(0),0,0,1024,768,1,0,0)
      
      UsePNGImageDecoder()
      
      LoadingSprites()
      
      StartZiel()
      
      Drawing()
      
      WegFindung()
      
      Quadrate()
      
      Repeat
        
        EventID = WaitWindowEvent() 
        
      Until EventID = #PB_Event_CloseWindow
         
    Else 
      
      Debug "Can't Open Windowed Screen"  
      
    EndIf
    
  Else 
    
    Debug "Can't Open Window"  
    
  EndIf
  
Else 
  
  Debug "Can't Init Sprite"
  
EndIf




Das ist der ganze Code, müsst euch einfach eigene Graphicken reinladen

Ich müsst halt gucken das Problem tritt nicht immer auf, weil ja 2 zufällige punkte generiert werden.
Manchmal laufen ja die schleifen garnicht bis zum Kritischen punkt durch.

Re: Zu viele Sprites?

Verfasst: 26.07.2011 21:29
von DrShrek
Raphi hat geschrieben:Das ist der ganze Code, müsst euch einfach eigene Graphicken reinladen.
Ich glaube nicht das sich sehr viele (für Dein Problem) Grafiken generieren werden.
Da wirst Du sicher ein Zip nachlegen müssen.

Re: Zu viele Sprites?

Verfasst: 26.07.2011 22:01
von Raphi
OK gut hier das ganze nochmal in einer Zip :D

Projektdateien

Re: Zu viele Sprites?

Verfasst: 26.07.2011 22:21
von ts-soft
Nur so als ergänzenden Hinweis: Du könntest auch die mit PB gelieferten Bilder nutzen und den Pfad dann so:
#PB_Compiler_Home + "Examples\Sources\Data\CdPlayer.ico" angeben.
Da kann dann jeder Testen ohne Download o. ä.
Selbstgenerierte Bilder mit CreateImage wäre auch noch eine Möglichkeit.

Gruß
Thomas

Re: Zu viele Sprites?

Verfasst: 26.07.2011 22:28
von DrShrek
@Raphi,
Glückwunsch, ich habe noch nie so viele Delay(nnn) wie in Deinen Program gesehen.
Schmeiß die erstmal raus.

Dann der Programmaufbau, auch hier erstmal nachbessern.
//Edit:
Vorschlag:
Mache eine Funktion, die die ganzen Grafiken auf den Screen zeichnet.
In dieser Funktion und zwar wirklich nur hier gibts es die Grafikbefehle.

Re: Zu viele Sprites?

Verfasst: 27.07.2011 09:24
von Vermilion
Bei mir funktioniert der Quelltext, so wie er geliefert wurde, auch nach Entfernen der Delays. Was mich wundert ist, dass du alles nur ein mal zeichnest, zu Beginn des Programms, und danach nur noch dieses eine Bild dauerhaft anzeigst. Noch ein paar Hinweise:

Delay: Wie DrShrek schon meinte: nimm die Delays raus. Damit bremst du deine Anwendung und deren Performance absichtlich aus.

Goto: In deinem Quelltext benutzt du Goto. Das ist ein Befehl, den nicht nur jeder kennt (auch außerhalb von PureBasic), sondern den auch kaum jemand benutzt. Du solltest dir das nicht angewöhnen, denn schon bei einem etwas komplexeren Projekt (nicht-linear abgearbeiteter Code) kann dies Kopfzerbrechen auslösen.

Tower "defence": Es wird "Tower defense" geschrieben, "defense" heißt "Verteidigung". "defence" wäre in etwa sowas wie "ent-zäunung" (ob es das Wort überhaupt gibt?). :wink:

Re: Zu viele Sprites?

Verfasst: 27.07.2011 12:30
von Lord
Vermilion hat geschrieben: ...
Tower "defence": Es wird "Tower defense" geschrieben, "defense" heißt "Verteidigung". "defence" wäre in etwa sowas wie "ent-zäunung" (ob es das Wort überhaupt gibt?). :wink:
Dann solltest Du dieses vielleicht auch diversen Verteidigungsministerien
bekanntgeben. Die schreiben sich mit 'c'. :wink:
Nachlesen kann man auch hier:
http://en.wikipedia.org/wiki/American_a ... -ce.2C_-se