Seite 5 von 8

Verfasst: 12.08.2008 11:48
von Lebostein
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.

Verfasst: 12.08.2008 12:53
von Fluid Byte
Bei mir geht jeder Faktor ohne Probleme. Du solltest aber die Zeile

Code: Alles auswählen

Sprite1Y = SpriteWidth(Sprite1N) 
in

Code: Alles auswählen

Sprite1Y = SpriteHeight(Sprite1N)
umschreiben damit man das auch für nicht ^2-Bilder nutzen kann.

Verfasst: 12.08.2008 13:20
von Fluid Byte
Ich habs für mich noch mal ein bisschen angepasst, vielleicht geht es ja jetzt bei dir mit einem Faktor >= 5.

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
@Zeha:

Wenn du denkst das dein Thread okupiert wird sag Kareu bescheid, der schneidet das raus. :wink:

Verfasst: 12.08.2008 13:40
von ZeHa
Ich persönlich hab nix dagegen, aber vielleicht sollte das irgendwann in einen "Clean Pixel Development Thread" umgeschoben werden oder so :mrgreen: oder zur Wuro Game-Lib... oder... keine Ahnung.

Verfasst: 12.08.2008 14:02
von Lebostein
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.
Komisch. Ab 5 meldet der Compiler bei mir einen Invalid Memory Access...

Eine Einschränkung bleibt weiterhin: Der Code geht nur für 32 Bit Farbtiefe, d.h. wenn 4 Byte pro Bildschirmpunkt gespeichert werden. Ansonsten müsste man einige Änderungen einbauen (prüfen des DrawingBufferPixelFormat, das Lesen und Schreiben per PeekL und PokeL müsste man anders gestalten usw.)

PS: Irgendwo steckt trotzdem noch der Wurm drin. Die Datei "Examples\Sources - Advanced\Waponez II\Data\Bullet_1.bmp" zum Beispiel lässt sich bei mir nur 2-mal vergrößern (dann der Fehler) und die Farben stimmen irgendwie auch nicht...

Verfasst: 12.08.2008 14:15
von DarkDragon
Lebostein hat geschrieben:Komisch. Ab 5 meldet der Compiler bei mir einen Invalid Memory Access...
Der Compiler? Dann melde es Fred und schick ihm deine Optionen mit. Der Compiler sollte nämlich nicht abstürzen.

Wenn es nur ein Denkfehler deinerseits war und es der Debugger ist der dir den Invalid Memory Access anzeigt, dann schick uns doch bitte noch die Zeilennummer und den funktionsfähigen Code (inkl. Bilder) in der er das tut.

[EDIT]
Falo hat geschrieben:Zeha es lohnt nicht da weiter zu frimmeln, ich glaube einfach es ist die zu schwache Grafikkarte (2,5 MB) :mrgreen:
2,5 MB - Es wird 2,5 mal gezeichnet - Gottseidank ist es keine 250 MB, dann würde es ja 250 mal gezeichnet werden. :mrgreen:

Verfasst: 12.08.2008 14:21
von Fluid Byte
Welche Version verwendest du den? PB 4.20 Final?

Verfasst: 12.08.2008 15:00
von Kaeru Gaman
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" ;)
das alleine hilft ja noch nichts... um ältere games wirklich laufen zu lassen,
braucht die Maschine auch noch andere voraussetzungen.
viele laufen ja nur in der DOS-Box.

wenn man also wirklich öfters alte Games zocken will, sollte man halt nen Pentium100 oder Pentium2 mit DOS oder Win95 drauf in der Ecke stehen haben...

Verfasst: 12.08.2008 15:04
von Fluid Byte
So geht es auch ohne Sprite3D und ist auf meinem (Arbeits-)Rechner nicht bemerkbar langsamer.

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

Verfasst: 12.08.2008 15:15
von Lebostein
Fluid Byte hat geschrieben:So geht es auch ohne Sprite3D und ist auf meinem (Arbeits-)Rechner nicht bemerkbar langsamer.
Ist natürlich clever :allright: Warum kompliziert, wenns auch einfach geht...