Zu viele Sprites? [Gelößt]

Anfängerfragen zum Programmieren mit PureBasic.
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

Zu viele Sprites? [Gelößt]

Beitrag 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?
Zuletzt geändert von Raphi am 04.08.2011 22:28, insgesamt 1-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Zu viele Sprites?

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Zu viele Sprites?

Beitrag 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...
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 »

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.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Zu viele Sprites?

Beitrag 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.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
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 »

OK gut hier das ganze nochmal in einer Zip :D

Projektdateien
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Zu viele Sprites?

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Zu viele Sprites?

Beitrag 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.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Re: Zu viele Sprites?

Beitrag 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:
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: Zu viele Sprites?

Beitrag 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
Bild
Antworten