Sprite: Farbe ersetzen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Sprite: Farbe ersetzen

Beitrag von gnasen »

Da ich im Forum nichts passendes finden konnte, habe ich es selbst gemacht.

Funktion sollte selbsterklärend sein. Für weniger als 32Bit nicht vergessen die Bildtiefe anzupassen.

Es handelt sich um ein leicht modifiziertes Beispiel aus der Hilfe.

Code: Alles auswählen

Structure Pixel
  Pixel.l
EndStructure

Procedure SpriteReplaceColor(sprite.l,color1.l, color2.l) ;replace color1 by color2
  
  Protected Buffer.l
  Protected Pitch.l
  Protected PixelFormat.l
  
  Protected x.l
  Protected y.l
  
  Protected Width.l
  Protected Height.l
  
  Protected *Line.Pixel
  
  If StartDrawing(SpriteOutput(sprite))
    
    Buffer      = DrawingBuffer()
    Pitch       = DrawingBufferPitch()
    PixelFormat = DrawingBufferPixelFormat()
    
    If PixelFormat = #PB_PixelFormat_32Bits_BGR
      color1 = (color1 & $0000FF) << 16 | (color1 & $00FF00) | (color1 & $FF0000) >> 16
      color2 = (color2 & $0000FF) << 16 | (color2 & $00FF00) | (color2 & $FF0000) >> 16
    EndIf
    
    Width  = SpriteWidth(sprite)
    Height = SpriteHeight(sprite)
    
    For y = 0 To Height-1
      
      *Line.Pixel = Buffer+Pitch*y
      
      For x = 0 To Width-1
        
        If *Line\Pixel = color1
          *Line\Pixel = color2
        EndIf
        
        *Line+4
        
      Next
    Next
    
    StopDrawing()
  EndIf
  
EndProcedure


;-------------------- Test ---------------------------

InitSprite()
InitKeyboard()

OpenScreen(800,600,32,"klj")

Define a.l
Define b.l
Define Sprite_a = CreateSprite(#PB_Any,40,40)

StartDrawing(SpriteOutput(Sprite_a))

For a=0 To 3
  For b=0 To 3
    If (a+b)%2 = 1
      Box(10*a,10*b,10,10,RGB(0,255,0))
    Else
      Box(10*a,10*b,10,10,RGB(255,0,255))
    EndIf
  Next
Next

StopDrawing()

Define Sprite_b = CopySprite(Sprite_a,#PB_Any)
Define Sprite_c = CopySprite(Sprite_a,#PB_Any)

SpriteReplaceColor(Sprite_b,RGB(0,255,0),  RGB(255,0,0))
SpriteReplaceColor(Sprite_c,RGB(255,0,255),RGB(255,0,0))

Repeat
  
  ExamineKeyboard()
  ClearScreen(RGB(0,0,0))
  DisplaySprite(Sprite_a,75, 50)
  DisplaySprite(Sprite_b,50, 100)
  DisplaySprite(Sprite_c,100,100)
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape)
Vielleicht kann jemand was damit anfangen ;)
pb 4.51
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Noch eine Frage an die fortgeschritterenen auf dem Gebiet:

Geht die selbe Aufgabe noch schneller?
Ich stelle zurzeit zB ca. 200 Sprites à 15*15

Ohne die Funktion die konstanten 60 Frames, mit ca 40. Das muss doch schneller gehen!?
pb 4.51
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Re: Sprite: Farbe ersetzen

Beitrag von FGK »

Hi,

ist zwar schon etwas älter aber ich denke das könnte was sein das deutlich schneller arbeitet
als deine Routine.

http://www.purebasic.fr/german/viewtopi ... e&start=10


Gruß FGK
Antworten