Verfasst: 12.08.2008 11:48
Aber irgendwie hab ich einen Fehler drinnne. Bei einem Zoom von 5 steigt er mit einem Memory-Fehler aus... vielleicht kann ja mal jemand den Code überfliegen, steckt wohl irgendwo ein Denkfehler drin.
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Code: Alles auswählen
Sprite1Y = SpriteWidth(Sprite1N)
Code: Alles auswählen
Sprite1Y = SpriteHeight(Sprite1N)
Code: Alles auswählen
#SCR_WIDTH = 1024
#SCR_HEIGHT = 768
#SCR_DEPTH = 32
#SCR_BPPS = 4
InitSprite() : InitKeyboard()
#Fullscreen = 0
If #Fullscreen
OpenScreen(#SCR_WIDTH,#SCR_HEIGHT,#SCR_DEPTH,"CleanPixel")
Else
OpenWindow(0,0,0,#SCR_WIDTH,#SCR_HEIGHT,"CleanPixel",#PB_Window_SystemMenu | 1)
OpenWindowedScreen(WindowID(0),0,0,#SCR_WIDTH,#SCR_HEIGHT,0,0,0)
EndIf
Procedure LoadSpriteZoom(Sprite,Filename.s,Factor)
If Factor <= 1
LoadSprite(Sprite,Filename)
ProcedureReturn #True
EndIf
Protected hsprOriginal, Width, Height
Protected Buffer1, Buffer2, Length1, Length2
Protected X1, X2, Y1, Y2, RGBX
hsprOriginal = LoadSprite(#PB_Any,Filename)
Width = SpriteWidth(hsprOriginal)
Height = SpriteHeight(hsprOriginal)
CreateSprite(Sprite,Width * Factor,Height * Factor)
StartDrawing(SpriteOutput(hsprOriginal))
Buffer1 = DrawingBuffer()
Length1 = DrawingBufferPitch()
StopDrawing()
StartDrawing(SpriteOutput(Sprite))
Buffer2 = DrawingBuffer()
Length2 = DrawingBufferPitch()
StopDrawing()
For Y1 = 0 To Width - 1
For X1 = 0 To Height - 1
RGBX = PeekL(Buffer1 + (Y1 * Length1) + (X1 * #SCR_BPPS))
For Y2 = 0 To Factor - 1
For X2 = 0 To Factor - 1
PokeL(Buffer2 + (Y1 * Factor + Y2) * Length2 + (X1 * Factor + X2) * #SCR_BPPS,RGBX)
Next
Next
Next
Next
FreeSprite(hsprOriginal)
EndProcedure
For i=0 To 9
LoadSpriteZoom(i,#PB_Compiler_Home + "Examples\Sources\Data\Drive.bmp",i + 1)
Next
Repeat
If #Fullscreen = 0 : EventID = WindowEvent() : EndIf
ExamineKeyboard()
ClearScreen($FF5500)
For i=0 To 9
DisplaySprite(i,10 + OffsetX + i * 12,100)
OffsetX + SpriteWidth(i)
Next
OffsetX = 0
FlipBuffers(1)
Until KeyboardPushed(#PB_Key_Escape) Or EventID = #PB_Event_CloseWindow
Komisch. Ab 5 meldet der Compiler bei mir einen Invalid Memory Access...Fluid Byte hat geschrieben:Ich habs für mich noch mal ein bisschen angepasst, vielleicht geht es ja jetzt bei dir mit einem Faktor >= 5.
Der Compiler? Dann melde es Fred und schick ihm deine Optionen mit. Der Compiler sollte nämlich nicht abstürzen.Lebostein hat geschrieben:Komisch. Ab 5 meldet der Compiler bei mir einen Invalid Memory Access...
2,5 MB - Es wird 2,5 mal gezeichnet - Gottseidank ist es keine 250 MB, dann würde es ja 250 mal gezeichnet werden.Falo hat geschrieben:Zeha es lohnt nicht da weiter zu frimmeln, ich glaube einfach es ist die zu schwache Grafikkarte (2,5 MB)![]()
das alleine hilft ja noch nichts... um ältere games wirklich laufen zu lassen,ZeHa hat geschrieben:Und ich finde auch nicht, daß "altes Zeug mit rumgeschleppt" wird, denn für eine Grafikkarte oder für einen Monitor wäre die Unterstützung von 320x240 sicherlich keine große "Last"
Code: Alles auswählen
Procedure LoadSpriteZoom(Sprite,Filename.s,Factor)
Protected hbmSprite, Width, Height
hbmSprite = LoadImage(#PB_Any,Filename)
Width = ImageWidth(hbmSprite) * Factor
Height = ImageHeight(hbmSprite) * Factor
ResizeImage(hbmSprite,Width,Height,#PB_Image_Raw)
CreateSprite(Sprite,Width,Height)
StartDrawing(SpriteOutput(Sprite))
DrawImage(ImageID(hbmSprite),0,0)
StopDrawing()
FreeImage(hbmSprite)
EndProcedure
Ist natürlich cleverFluid Byte hat geschrieben:So geht es auch ohne Sprite3D und ist auf meinem (Arbeits-)Rechner nicht bemerkbar langsamer.