Frage zu Danilos Sprite_change_Color.pb

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

Frage zu Danilos Sprite_change_Color.pb

Beitrag von blbltheworm »

Hallo zusammen,
der eine, oder andere wird vielleicht wissen, dass ich gerade an der Übersetzung des Codearchives nach PB4 arbeite.
Jetzt hab ich mit dem oben genannten Beispiel ein Problem:
Warum is DrawingBufferPitch() bei einem 8 Bit Bitmap größer als SpriteWidth() des selben??
Hier das erweiterte Beispiel:

Code: Alles auswählen

; German forum:
; Author: Danilo
; Date: 28. May 2003

; Manipulate 8-Bit (!) Sprites directly in memory
; here the color will be changed pixel by pixel

;Changes for PB4-Version (by blbltheworm):
;I put the original source by Danielo in a Procedure and wrote a little example

Procedure ChangeColor(Sprite.l, oldColor.w,newColor.w)
  StartDrawing(SpriteOutput(Sprite)) 
  *MemoryAddress.BYTE = DrawingBuffer() 
  Debug DrawingBufferPitch()
  Debug SpriteWidth(0)
  memSize.l=DrawingBufferPitch()*SpriteHeight(Sprite)-1 ;<-So tuts
  ;memSize.l=SpriteWidth(0)*SpriteHeight(Sprite)-1 ;<-Das tut nicht (wird nicht das ganze bild bearbeitet
  For i = 0 To memSize
    If *MemoryAddress\b = oldColor
      *MemoryAddress\b = newColor
    EndIf 
    *MemoryAddress + 1 
  Next i 
  LineXY(0,474,SpriteWidth(0),474,61) ;<- hier hört die Farbumwandlung mit SpriteWidth(0) auf
  StopDrawing() 
EndProcedure

InitSprite()
InitScreen()
InitPalette()
InitKeyboard()

OpenScreen(800,600,8,"Sprite change Color")
LoadSprite(0,"..\Gfx\Game.bmp",0)    ;8-Bit!!
LoadPalette(0,"..\Gfx\Game.bmp")

DisplayPalette(0)

Repeat
  StartDrawing(ScreenOutput())
    Box(0,0,800,600,61) ;61=black
    DrawText(0,0,"Press [SPACE] to change Color")
  StopDrawing()
    
  DisplaySprite(0,(800-SpriteWidth(0))/2, (600-SpriteHeight(0))/2)  
  FlipBuffers()
  
  Delay(1)
  
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape) : End : EndIf
Until KeyboardPushed(#PB_Key_Space)

ChangeColor(0,63,0)

Repeat
  StartDrawing(ScreenOutput())
    Box(0,0,800,600,61)
    DrawText(0,0,"Color changed")
  StopDrawing()
  
  DisplaySprite(0,(800-SpriteWidth(0))/2, (600-SpriteHeight(0))/2)
  FlipBuffers()
  
  Delay(1)
  
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Naja, es ist halt wie in einer Bitmap. Es wird immer auf 4 aufgefüllt. Für eine 1 Pixel breite Bitmap werden pro Zeile dann trotzdem 4 Byte reserviert:

SpriteWidth | DrawingBufferPitch
1 | 4
2 | 4
3 | 4
4 | 4
5 | 8
6 | 8
7 | 8
8 | 8
9 | 12

usw. Nur bei den ganzzahlig durch 4 Teilbaren Bildbreiten stimmen SpriteWidth und DrawingBufferPitch überein.
Benutzeravatar
blbltheworm
Beiträge: 217
Registriert: 22.09.2004 19:36
Wohnort: Auf der schönen Schwäbischen Alb

Beitrag von blbltheworm »

Hi Leobestein,
danke für deine Antwort, das erklärt so manches.
Dann kann ich das Bsp. entsprechend anpassen.
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

da du den befehl InitScreen() verwendest: kannst du mir sagen was dieser darstellt(e)?
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten