Bild wird nicht angezeigt

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Bild wird nicht angezeigt

Beitrag von X360 Andy »

Moin zusammen

Ich wollte mich übers Wochende an einem kleinem Spiel machen.
Aber schon nach 10Minuten das erste Problem , das ich auch nach längern spielen am Code nicht gebacken bekomme.
Und zwar wird bei mir kein Bild angzeigt, ich hab es schon mit absoluten Pfaden versucht , genauso mit "DataSection und Catchsprite aber es bleibt Schwarz.

Ich wäre für jeden Tipp dankbar (warscheinlich ist es wieder winzig kleiner Fehler den ich mal wieder nicht sehe ... :? )

Ich hab übringens das Subsystem von DirectX9 aktiviert , da es so viel "einfacher" ist zum "testen" ,aber auch daran liegt es nicht ?

Code: Alles auswählen

;Für die Bilder.....
UseJPEGImageDecoder()
UsePNGImageDecoder()
; Ende

Titel$ = "Gamename"
Enumeration
#Hintergrund
EndEnumeration



;Screengröße
ScreenX = 500
ScreenY = 400
;Ende


;Ende
Procedure Ende(Text$) ;-Ende()
  Shared Titel$
  MessageRequester (Titel$, Text$)
  End
EndProcedure
;Ende Ende

;Window
Procedure Window()  ;.Window()
  Protected EventID
  Shared Quit
  EventID = WindowEvent()
  Repeat
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
    EventID = WindowEvent()
  Until EventID = 0
EndProcedure
;Window Ende


If Not (InitSprite() And InitKeyboard() And InitMouse())
  Ende("Fehler ,Spiel wird Beendet")
  End; Sinnlos 
EndIf

If OpenWindow(0, 0, 0, ScreenX, ScreenY, Titel$, #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0),0,0,ScreenX, ScreenY,0,0,0)
   SetFrameRate(50)
  Else
    Ende("Screen Fehler")
  EndIf
Else
  Ende("Window Fehler")
EndIf

       LoadSprite(#Hintergrund,"images\titleback2.jpg",1)            
        
      Repeat
      
  Window()
  DisplaySprite(#Hintergrund,0,0)
  ClearScreen(0)
  ExamineKeyboard()
  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    X = 10
    Y = 10 
    DrawText(x, y, "Bei"+Titel$+"versuchst du...." )
      StopDrawing()
  Delay(1)
  FlipBuffers()
  
  
    Repeat
     EventID = WindowEvent()
     Select EventID
      Case #PB_Event_CloseWindow
              quit = 1
     EndSelect
     Until EventID  = 0

     
   Until quit = 1 
        End

 

;DataSection
;    Pic: IncludeBinary "images\titleback2.JPG"
;EndDataSection
        

Das wäre mein Code
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

Code: Alles auswählen

DisplaySprite(#Hintergrund,0,0)
ClearScreen(0) 
Kann nicht funktionieren. Du packst ein Bild auf den Bildschirm, leerst den Bildschirm dann und zeigst ihn an.
Vertausch einfach die beiden Befehle, dann sollte es laufen.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Und da ist das Bild!
Ich sagte doch warscheinlich ist es ein winziger Fehler :lol:

Danke dafür :D
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Ich hab jetzt bestimmt 4 stunden lang versucht eine linked list "richtig" einzubauen aber ich scheitere ...
Ich möchte wenn der Spieler die Leertaste drückt das eine "bullet/kugel" erscheint und diese nachvorne geschossen wird

Hier mal mein Code;

Code: Alles auswählen

;Wir installieren die Bilder
UseJPEGImageDecoder()
UsePNGImageDecoder()
; Ende

Titel$ = "Gamename"



Enumeration
#Hintergrund
#Spieler
#Bullet
#Temp
EndEnumeration 



;Screengröße
ScreenX = 800
ScreenY = 600
;Ende


Structure Bullet
  x.l
  y.l
  Speed.l
  bild.l
EndStructure

;Name abfrage

If FileSize(GetTemporaryDirectory()+"Highscore-Name.txt") = -1
 Name$ = InputRequester("Name","Bitte gib deinen Namen ein, für den Highscore eintrag...","")
  If Name$ = "" Or Name$ = " " 
  MessageRequester("Fehler","Du musst einen Namen eingeben damit der Highscore Online eingetragen werden kann" ) 
  DeleteFile(GetTemporaryDirectory()+"Highscore-Name.txt")
  End

  EndIf 
  
CreateFile(#Temp,GetTemporaryDirectory()+"Highscore-Name.txt")
WriteString(#Temp,Name$)
CloseFile(#temp)

Else

ReadFile(#Temp,GetTemporaryDirectory()+"Highscore-Name.txt")
Name$ = ReadString(#Temp)
CloseFile(#Temp)
EndIf


;Ende
Procedure Ende(Text$) ;-Ende()
  Shared Titel$
  MessageRequester (Titel$, Text$)
  End
EndProcedure
;Ende Ende

;Window
Procedure Window()  ;.Window()
  Protected EventID
  Shared Quit
  EventID = WindowEvent()
  Repeat
    If EventID = #PB_Event_CloseWindow
      Quit = 1
    EndIf
    EventID = WindowEvent()
  Until EventID = 0
EndProcedure
;Window Ende


If Not (InitSprite() And InitKeyboard() And InitMouse())
  Ende("Fehler ,Spiel wird Beendet")
  End; Sinnlos 
EndIf

If OpenWindow(0, 0, 0, ScreenX, ScreenY, Titel$, #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0),0,0,ScreenX, ScreenY,0,0,0)
   SetFrameRate(30)
  Else
    Ende("Screen Fehler")
  EndIf
Else
  Ende("Window Fehler")
EndIf

LoadSprite(1,"images\nullplayer.Png")        
TransparentSpriteColor(1,RGB(0,0,0)) 
LoadSprite(#bullet,"images\bullet.bmp")     

LoadSprite(#Hintergrund,"images\background.bmp")    
 NewList bullet.bullet()

 Repeat
  Window()
  ClearScreen(0)
  DisplaySprite(#Hintergrund,0,0)
  ExamineKeyboard()
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Transparent)
  X = 30
  Y = 310
    DrawText(x, y, "Du bist der Held der die Welt vor den Aliens retten muss")
  Y + 200
  x + 50
    DrawText(x, y, "Mit den Pfeiltasten bewegst du dein Schiff")
  Y + 20
    DrawText(x, y, "und mit der Leertaste schießt du")
  X + 350
  Y + 50
    DrawText(x, y, "Beliebige Taste drücken um deine Mission zu starten")
  StopDrawing()
  Delay(1)
  FlipBuffers()
 Until KeyboardPushed(#PB_Key_All) Or Quit
 

 Repeat      
  Window()
  ClearScreen(0)
  DisplaySprite(#Hintergrund,0,0)
  ExamineKeyboard()
  StartDrawing(ScreenOutput())
  Box(0,ScreenY-20,800,20,0)
    DrawingMode(#PB_2DDrawing_Transparent)
    X = 100
    Y = ScreenY-18 
    DrawText(x, y, "Name: "+Name$+"  Puntke: "+Str(Punkte)+"   Noch "+Str(Zeitlvl)+" Sekunden bis zum "+Str(nextlvl)+" Level", RGB(255,255,255) )
  StopDrawing()
  DisplayTransparentSprite(1,SpielerX,SpielerY)
  Delay(1)
  FlipBuffers()
  
;- Steuerung 
  ;Rechts = Spieler nach rechts
  If KeyboardPushed(#PB_Key_Right)
   If spielerX > 200
     SpielerX+0
     Else
     SpielerX+3
   EndIf
  EndIf
  
  ;Links = Spieler nach links
  If KeyboardPushed(#PB_Key_Left)
   If SpielerX < 0
    SpielerX -0
    Else 
    SpielerX -1
   EndIf
  EndIf

  ;Oben = Spieler geht hoch
  If KeyboardPushed(#PB_Key_Up)
   If SpielerY <-20 
    SpielerY -0
    Else
   SpielerY-3 
   EndIf
  EndIf
  
  ;Unten = Spieler geht runter
  If KeyboardPushed(#PB_Key_Down)
   If SpielerY >510 
    SpielerY +0
    Else
    SpielerY+3 
   EndIf
  EndIf
  
  
  ;Leertaste = Spieler schießt
  If KeyboardPushed(#PB_Key_Space)
  AddElement(bullet())
  Debug bullet()\x = SpielerX+100
  Debug  bullet()\y = SpielerY+50
  Debug  bullet()\bild= #bullet
  Debug  bullet()\speed = 5 
    Debug ""
    Debug "---------"
    Debug ""
  EndIf
ForEach Bullet()
DisplayTransparentSprite(#bullet,bullet()\x,bullet()\y)
If bullet()\y > ScreenY
DeleteElement(Bullet())
EndIf


Next

;-Ende
;EndeCode
    Repeat
     EventID = WindowEvent()
     Select EventID
      Case #PB_Event_CloseWindow
              quit = 1
     EndSelect
     Until EventID  = 0 
   Until quit = 1 
        End
 ;Ende
        


Bin wirklich ratlos was daran noch falsch ist...
Die "bullet/kugel" wird nichteinmal angezeigt?


Würde mich für jede Hilfe rießig freuen :?
mfg

EDIT sehe grad das noch "Speed" fehlt ....
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

Dein Fehler ist das du den Bildschirminhalt zu früh anzeigst.

ClearScreen(Farbe):Löscht den Bildschirminhalt (damit nicht alte Sachen stehen bleiben).
DisplaySprite()/DisplayTransparentSprite: Diese beiden Befehle sind zum anzeigen der Bilder. Die Bilder werden aber nicht direkt angezeigt, sondern erst mit flipbuffers()
flipbuffers():Mit diesem Befehl zeigst du den soeben aufgebauten Bildschirm an.

Du musst also das Flipbuffers() an das ende der Schleife setzen.

Code: Alles auswählen

...
  StopDrawing()
  DisplayTransparentSprite(1,SpielerX,SpielerY)
  Delay(1)
  FlipBuffers();Du rufst hier den Befehl zu früh auf.
...

Code: Alles auswählen

...
Next
;Hier setzt du flipbuffers() am besten hin.
;-Ende
;EndeCode
    Repeat
     EventID = WindowEvent()
     Select EventID
      Case #PB_Event_CloseWindow
              quit = 1
     EndSelect
     Until EventID  = 0
   Until quit = 1
        End
 ;Ende 
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Geil endlich

Heute haben es die Spirite befehle nicht so mit mir :lol:

Danke dir ...
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Moin
Da hier im Forum grad nicht viel geschrieben wird, mach ich das doch grad ,nicht das euch noch langweilig wird 8)

Bin jetzt bei der SpriteCollision() angekommen und am anfang lief das Spiel noch ca. 20 Sekunde bis es crashte , jetzt starte ich es und es crasht sofort :oops:

Meine Fehlermeldung ist "The linked list doesen´t have a current element"



Hier die beiden Structure(n)

Code: Alles auswählen

Structure Bullet
  x.l
  y.l
  Speed.l
  bild.l
EndStructure


Structure Gegner
  x.l
  y.l
  Speed.l
  bild.l
  bullet.l
  armor.l
  art.l
EndStructure
Hier sind die beiden abfragen drin

Code: Alles auswählen

  If levelUP > 2500 
   level + 1 
   lvl - 500
   levelUP = lvl
   gen + 20
  EndIf
 
 If enemySetDelay > -1 
    enemySetDelay -1
 EndIf 
  
 If  enemySetDelay  < 0 
  AddElement(Gegner())
  Gegner()\x = 900
  Gegner()\y = Random(520)+40
  Gegner()\speed = 2-Random(1)-0.5
  Gegner()\art = #Gegner
  Gegner()\armor = armor
  enemySetDelay =240 - gen 
 EndIf


  If enemySetDelay  < 5
  ;EndScreen()
  EndIf
 
  If SpriteCollision(Gegner()\art , bullet()\x,bullet()\Y ,Gegner()\bild,Gegner()\x,Gegner()\y)
   Gegner()\armor - 25
  EndIf

 ForEach Gegner()
  Gegner()\X -   Gegner()\speed 
  DisplayTransparentSprite(Gegner()\art,Gegner()\x,Gegner()\y)
  
  
 If SpriteCollision(1, SpielerX,SpielerY ,Gegner()\art,Gegner()\x,Gegner()\y)
  Leben - 50
  DeleteElement(Gegner())
 EndIf


If Gegner()\armor = 0
 punkte + 100
 levelUP + 100
 DeleteElement(Gegner())
EndIf

If gegner()\X < -100
DeleteElement(Gegner())
EndIf
   

If Leben = 0


Debug "Tod Spieler" 
EndIf

  Next 
Etwas weiter unten hab ich noch

Code: Alles auswählen

If KeyboardPushed(#PB_Key_Space) And shootDelay < 0 
   AddElement(bullet())
   bullet()\x = SpielerX+82
   bullet()\y = SpielerY+45
   bullet()\bild= #bullet
   bullet()\speed = 1.5 
   shootDelay = bulletimer 
  EndIf


 If shootDelay > -1 
  shootDelay -1
 EndIf 
    
ForEach Bullet()
 bullet()\X + bullet()\speed 
 DisplayTransparentSprite(#bullet,bullet()\x,bullet()\y)
  If bullet()\X > 820
  DeleteElement(Bullet())
  EndIf

Next
 
Was mich besonders wundert ist wieso der Code am Anfang ging (zumindest für ein paar sekunden ) aber jetzt crasht er gleich nachdem start...

danke schon mal wenn mir jemand kurz helfen könnte
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Ich denke der Fehler liegt in diesem Teil des Codes:

Code: Alles auswählen

 If SpriteCollision(1, SpielerX,SpielerY ,Gegner()\art,Gegner()\x,Gegner()\y)
  Leben - 50
  DeleteElement(Gegner())
 EndIf


If Gegner()\armor = 0
 punkte + 100
 levelUP + 100
 DeleteElement(Gegner())
EndIf

If gegner()\X < -100
  DeleteElement(Gegner())
EndIf 
Was ist wenn es nur einen Gegner gibt und der bereits bei der ersten Abfrage gelöscht wird? Dann löst Gegner()\armor schon nen Fehler aus weil es keinen Gegner mehr auf der Liste gibt. Du solltest einen Counter mitlaufen lassen den du incrementiertst wenn du einen Gegner erstellst und decrementierst wenn du einen löschst. Mit diesen Counter kannst du dann immer prüfen ob noch ein Gegner da ist.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Sowas hab ich auch schon gedacht aber ich hab jetzt en bisschen rumgespielt und hab mal den code wegeglassen

Code: Alles auswählen

   If SpriteCollision(Gegner()\art , bullet()\x,bullet()\Y ,Gegner()\bild,Gegner()\x,Gegner()\y)
   Gegner()\armor - 25

   EndIf

Und es läuft ohne Probleme hab 2min. laufen lassen
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Problem gelöst


Danke für den Tipp mit dem Counter , es scheint zu laufen !

Code: Alles auswählen

zealer= CountList(Gegner())
If zealer > 1
  
 If SpriteCollision(1, SpielerX,SpielerY ,Gegner()\art,Gegner()\x,Gegner()\y)
  Leben - 50
  DeleteElement(Gegner())
 EndIf
EndIf

Bulletcounter = CountList(Bullet())
If Bulletcounter > 1
 If SpritePixelCollision(Gegner()\art,Gegner()\x,Gegner()\y,bullet()\bild,bullet()\x,bullet()\y)
 Gegner()\armor - 50
 Debug Gegner()\armor
 EndIf
 EndIf
 
EDIT Crasht immer noch
Antworten