habe das Forum u. (Archiv) nach vielen Sprite-Copymemory()-Beispielen durchwühlt, konnte aber mein Problem nicht ausmachen. Folgendes: Ich möchte die Screen dynamisch vergrössern bzw. verkleinern. Das Problem dabei ist, das mein Sprite mit CloseScreen gekillt wird. Ich könnte das sprite ja mit SaveSprite() ablegen, aber das kann zu lange dauern.
Habe ein kleines Probebeispiel angehängt.
Ich kann den Fehler nicht ausmachen. Vielleicht bin ich ja auch auf der völlig falschen Spur.
Hat jemand einen Vorschlag bzw. einen Link.!?
Danke schon mal!!!!
Code: Alles auswählen
Global lAppStart.b, lSwitchScreen.b
Global WinX.l, winY.l
Global *MemoryAdr.l
WinX = 500
winY = 500
lAppStart = #True
InitSprite()
Procedure LoadSpriteFromMemory()
Protected nSpriteWidth.l, nSpriteHeight.l
nSpriteWidth = SpriteWidth(0)
nSpriteHeight = SpriteHeight(0)
StartDrawing(SpriteOutput(0))
*SpriteAdr = DrawingBuffer()
SpriteLen = DrawingBufferPitch()
SpriteByt = DrawingBufferPixelFormat()
StopDrawing()
;CopyMemory(*MemoryAdr,*SpriteAdr,SpriteByt) ; geht nicht !!!!
;............................. ; geht auch nicht !!!! ..............................
SWidth = nSpriteWidth -1
SHeight = nSpriteHeight -1
For y = 0 To SHeight
For x = 0 To SWidth
*source = *MemoryAdr + y * SpriteLen + x * SpriteByt
nByte.b = PeekB(*source)
PokeB(*SpriteAdr,nByte)
Next x
Next y
EndProcedure
Procedure SaveSpriteIntoMemory()
Protected nSpriteWidth.l, nSpriteHeight.l
nSpriteWidth = SpriteWidth(0)
nSpriteHeight = SpriteHeight(0)
StartDrawing(SpriteOutput(0))
SpriteAdr = DrawingBuffer()
SpriteLen = DrawingBufferPitch()
SpriteByt = DrawingBufferPixelFormat()
StopDrawing()
*MemoryAdr = AllocateMemory(nSpriteWidth * nSpriteHeight * SpriteByt)
SWidth = nSpriteWidth -1
SHeight = nSpriteHeight -1
For y = 0 To SHeight
For x = 0 To SWidth
*source = SpriteAdr + y * SpriteLen + x * SpriteByt
nByte.b = PeekB(*source)
PokeB(*MemoryAdr,nByte)
Next x
Next y
EndProcedure
Procedure MaleWasAufsSprite()
StartDrawing(SpriteOutput(0))
Box(10,10,SpriteWidth(0)-20,SpriteHeight(0)-20 ,RGB(200,200,245))
nColor = RGB(200,100,200)
Circle(100,100,50,nColor)
nColor = RGB(100,200,100)
Box(200,200,100,100,nColor)
StopDrawing()
EndProcedure
Procedure OpenMyScreen(ScrX.l, ScrY.l)
OpenWindowedScreen(WindowID(), 20, 20, ScrX, ScrY, 0, 0, 0)
CreateSprite(0,ScrX-20, ScrY-20)
ClearScreen(200,200,200)
If lAppStart
lAppStart = #False
MaleWasAufsSprite()
SaveSpriteIntoMemory()
Else
LoadSpriteFromMemory()
EndIf
EndProcedure
OpenWindow(0, 0, 0, WinX, winY, #PB_Window_WindowCentered | #PB_Window_SystemMenu, "Spritetest")
OpenMyScreen(460,460)
xMax = 300
x=0 : n=1 : faktor=2
Quit = 0
Repeat
Event = WindowEvent()
If Event = #PB_Event_CloseWindow
Quit = 1
EndIf
ExamineKeyboard()
If KeyboardReleased(#PB_Key_F12)
CloseScreen()
lSwitchScreen = lSwitchScreen ! 1
If lSwitchScreen
OpenMyScreen(260,260)
Else
OpenMyScreen(460,460)
EndIf
EndIf
; Sprite; irgendwas anzeigen
x+n*faktor : If x<-xMax Or x>xMax : n=n*(-1) : EndIf
DisplaySprite(0,x+10,x*n+10)
FlipBuffers()
Until Quit = 1
End