Seite 1 von 1

Sprite Screen frage ?

Verfasst: 21.01.2010 18:34
von dater
Hallo,
ich will ein Multimendia Menu, wie im Mediacenter Programmieren, meine Frage ist,
wie kann ich ein Hintergrundbild anzeigen, wenn ich mit 'OpenScreen" ein Screen öffne und
Sprites als Menu-Punkte über den Bildschirm bewege ohne das das Hintergrundbild von den
Sprites zertört wird ?

Code: Alles auswählen

#SCREEN_W       = 1920  
#SCREEN_H       = 1080
#SCREEN_TITLE   = "HTCP-Menu" 

Procedure sp_Erstellen(nr,w,h,text$,farbe1,farbe2)
CreateSprite(nr, w,h, #PB_Sprite_Texture) 
StartDrawing(SpriteOutput(nr)) 
Ellipse(w/2, h/2,w/2+x,h/2+x,$ffffFF)
 Ellipse(w/2, h/2,w/2-4,h/2-4,farbe1)
  FrontColor(farbe2) 
  DrawingMode(1) 
  DrawingFont(FontID(1))
  Breite = TextWidth(text$)
  Hoehe = TextHeight(Text$) 
  DrawText((w/2)-(breite/2), (h/2)-(hoehe/2),text$) 
StopDrawing() 
EndProcedure
;***************************************************************************************************************
;***************************************************************************************************************
;***************************************************************************************************************
;***************************************************************************************************************

LoadFont(1, "Arial", 24) 


If InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester("Error", "Can't open DirectX 7 or later", 0) 
  End 
EndIf 
  
intervall.f= 3.14/50 ;pi verteilt 
 
If OpenScreen(#SCREEN_W,#SCREEN_H, 32,#SCREEN_TITLE) 

sp_erstellen(0,200,50,"S T A R T",$13EEEC,$DB8224)

sp_erstellen(1,200,50,"E N D E",$13EEEC,$DB8224)
 

;  LoadSprite(0, "..\Gfx\PureBasic.bmp", 0) 
;  CopySprite(0,1,0) 
  
  
  x=#SCREEN_W/2
  y=#SCREEN_H/2
  
  
  Repeat 
    FlipBuffers() 
    ClearScreen(RGB(0,0,0))
   DisplaySprite(2, #SCREEN_W/2, #SCREEN_H/2) ; koordinatenursprung in Bildmitte    
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Up) 
    	For i=1 To 20
    		y=(y-i)
    		FlipBuffers() 
    		ClearScreen(RGB(0,0,0))
    		DisplaySprite(0, x, y) ; koordinatenursprung in Bildmitte 
    		DisplaySprite(1, x, y+300) ; koordinatenursprung in Bildmitte   
    	Next i
    EndIf
    
    If KeyboardPushed(#PB_Key_Down) 
     	For i=1 To 20
    		y=(i+y)
    		FlipBuffers() 
    		ClearScreen(RGB(0,0,0))
    		DisplaySprite(0, x, y) ; koordinatenursprung in Bildmitte 
    		DisplaySprite(1, x, y+300) ; koordinatenursprung in Bildmitte   
    	Next i
    EndIf
    	        
    DisplaySprite(0, x, y) ; koordinatenursprung in Bildmitte 
    DisplaySprite(1, x, y+300) ; koordinatenursprung in Bildmitte 
           
    ExamineKeyboard() 
  Until KeyboardPushed(#PB_Key_Escape) 
  
Else 
  MessageRequester("Error", "Can't open a Screen", 0) 
EndIf 



Re: Sprite Screen frage ?

Verfasst: 21.01.2010 18:53
von Kaeru Gaman
du hast doch in jedem Schleifendurchlauf ein ClearScreen drin.
direkt danach oder stattdessen kannst du ein Hintergrundbild setzen.

UND du solltest keinesfalls in sich geschlossene Schleifen innerhalb der Hauptschleife haben.
also, deine For-Next-Schleifen müssen dort raus, stattdessen kannst du mit einem Counter oder ähnlichem arbeiten.

btw: auch das Sprite Nr.2 solltest du erzeugen, wenn du den code postest.

[edit]
PS:
außerdem bei den sprites, die drüber liegen sollen, DisplayTransparentSprite verwenden.

habs dir mal grad zurechtgeschraubt, die mehrfachen calls von examine, flip und clear raus, den counter rein usw...

Code: Alles auswählen

#SCREEN_W       = 1920 
#SCREEN_H       = 1080
#SCREEN_TITLE   = "HTCP-Menu"

Procedure sp_Erstellen(nr,w,h,text$,farbe1,farbe2)
CreateSprite(nr, w,h, #PB_Sprite_Texture)
StartDrawing(SpriteOutput(nr))
Ellipse(w/2, h/2,w/2+x,h/2+x,$ffffFF)
Ellipse(w/2, h/2,w/2-4,h/2-4,farbe1)
  FrontColor(farbe2)
  DrawingMode(1)
  DrawingFont(FontID(1))
  Breite = TextWidth(text$)
  Hoehe = TextHeight(Text$)
  DrawText((w/2)-(breite/2), (h/2)-(hoehe/2),text$)
StopDrawing()
EndProcedure
;***************************************************************************************************************
;***************************************************************************************************************
;***************************************************************************************************************
;***************************************************************************************************************

LoadFont(1, "Arial", 24)


If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf
 
intervall.f= 3.14/50 ;pi verteilt

If OpenScreen(#SCREEN_W,#SCREEN_H, 32,#SCREEN_TITLE)

sp_erstellen(0,200,50,"S T A R T",$13EEEC,$DB8224)

sp_erstellen(1,200,50,"E N D E",$13EEEC,$DB8224)

CreateSprite(2, #SCREEN_W/4, #SCREEN_H/4)
  StartDrawing( SpriteOutput(2) )
    Box(0,0, #SCREEN_W/4, #SCREEN_H/4, $402010 )
    For n=0 To #SCREEN_W/4 + #SCREEN_H/4 Step 12
      Line( n,0, - #SCREEN_H/4, #SCREEN_H/4, $80C020 )
    Next
  StopDrawing()
;  LoadSprite(0, "..\Gfx\PureBasic.bmp", 0)
;  CopySprite(0,1,0)
 
 
  x=#SCREEN_W/2
  y=#SCREEN_H/2
 
 
  Repeat
    ExamineKeyboard()

    If KeyboardPushed(#PB_Key_Up)
      counter = 20
      stepper = -1
    EndIf
   
    If KeyboardPushed(#PB_Key_Down)
      counter = 20
      stepper =  1
    EndIf

    If stepper
      counter -1
      y - stepper
      If counter = 0
        stepper = 0
      EndIf
    EndIf

    ClearScreen(RGB(0,0,0))
    DisplaySprite(2, #SCREEN_W/2, #SCREEN_H/2) ; koordinatenursprung in Bildmitte   
    DisplayTransparentSprite(0, x, y) ; koordinatenursprung in Bildmitte
    DisplayTransparentSprite(1, x, y+300) ; koordinatenursprung in Bildmitte
           
    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
 
Else
  MessageRequester("Error", "Can't open a Screen", 0)
EndIf

Re: Sprite Screen frage ?

Verfasst: 21.01.2010 19:18
von dater
Super - Danke,
genau das habe ich gesucht.