| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| alderaan1972 
 
 
 Anmeldungsdatum: 04.01.2021
 Beiträge: 3
 
 
 | 
			
				|  Verfasst am: 20.02.2021, 00:02    Titel: Verschiedene Auflösungen |   |  
				| 
 |  
				| Hallo liebes Forum, ist es auf einfach Weise möglich, ein Spiel mit Grafik (im Fenstermodus) von Windows skalieren zu lassen oder muss ich alle Grafiken für verschieden Auflösungen anpassen? Die Grafiken werden mit ganz normalen Freebasic befehlen gesteuert, also nicht OpenGL oder so. |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 20.02.2021, 09:37    Titel: |   |  
				| 
 |  
				| Zum Skalieren kenne ich eine schnelle, aber nicht allzu qualitativ hochwertige Lösung über MULTIPUT. Qualitativere Lösungen bekommst du mit entsprechenden Grafik-Bibliotheken wie FreeImage, das ist dann aber auch deutlich langsamer. Hierzu eine kleine Funktionssammlung von mir: 
  	  | Code: |  	  | #include once "Freeimage.bi" declare sub mmxcopy cdecl alias "fb_hMemCpyMMX"(byval dest as any ptr, byval src as any ptr, byval size as integer)
 
 function FBImage2FIBitmap(byval image as any ptr) as FIBITMAP ptr
 dim as FIBITMAP ptr dib
 dim as uinteger ptr buffer = image
 dim as uinteger bpp, breit, hoch, pitch
 bpp = buffer[1]
 if bpp <> 4 then return NULL ' only 32 bit format
 breit = buffer[2]
 hoch = buffer[3]
 pitch = buffer[4]
 image += 32
 dib = FreeImage_Allocate(breit, hoch, bpp*8)
 dim as ubyte ptr FIpixel = FreeImage_GetBits(dib)
 for i as integer = 1 to hoch
 mmxcopy FIpixel, image, breit*bpp
 FIpixel += breit*bpp
 image += pitch
 Next
 FreeImage_FlipVertical(dib)
 return dib
 end function
 
 function FIBitmap2FBImage(byval dib as FIBITMAP ptr) as any ptr
 dim as uinteger bpp, breit, hoch, pitch
 FreeImage_FlipVertical(dib)
 dib = FreeImage_ConvertTo32Bits(dib)
 breit = FreeImage_GetWidth(dib)
 hoch = FreeImage_GetHeight(dib)
 dim as any ptr image = ImageCreate(breit, hoch), ximage = image
 dim as uinteger ptr buffer = image
 dim as ubyte ptr FIpixel = FreeImage_GetBits(dib)
 
 bpp = buffer[1]
 if bpp <> 4 then return NULL
 pitch = buffer[4]
 ximage += 32
 for i as integer = 1 to hoch
 mmxcopy ximage, FIpixel, breit * bpp
 FIpixel+= (breit * bpp)
 ximage += pitch
 next
 return image
 end function
 
 function FIload(path as string, FIformat as integer = FIF_PNG) as FB.Image ptr
 dim as FIBITMAP ptr FIimg = FreeImage_Load(FIformat, path)
 dim as any ptr fbImg  = FIBitmap2FBImage(FIimg)
 FreeImage_Unload FIimg
 return fbImg
 end function
 
 sub scale(byref newImg as FB.Image ptr, w as integer, h as integer, src as FB.Image ptr)
 if src = 0 then exit sub
 if newImg then imagedestroy newImg
 dim as FIBITMAP ptr FIold = FBImage2FIBitmap(src)
 dim as FIBITMAP ptr FInew = FreeImage_Rescale(FIold, w, h, FILTER_BOX)
 newImg = FIBitmap2FBImage(FInew)
 FreeImage_Unload FIold
 FreeImage_Unload FInew
 end sub
 
 | 
 Mit scale() skalierst du ein FreeBASIC-Image in ein anderes.
 Wenn du viele kleine Bilder zu skalieren hast (etwa ein Tileset), empfiehlt es sich, diese als komplettes Set in einem großen Gesamt-Image gespeichert zu halten und mit einem einzigen Aufruf zusammen zu skalieren. Das Übersetzen zwischen den Speicherformaten ist bei vielen Einzelaufrufen nicht billig.
 
 edit: ach ja, um FreeImage nutzen zu können, musst du dann auch die passende FreeImage.dll beilegen.
 _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 
 Zuletzt bearbeitet von nemored am 20.02.2021, 21:40, insgesamt einmal bearbeitet
 |  |  
		| Nach oben |  |  
		|  |  
		| alderaan1972 
 
 
 Anmeldungsdatum: 04.01.2021
 Beiträge: 3
 
 
 | 
			
				|  Verfasst am: 20.02.2021, 14:46    Titel: |   |  
				| 
 |  
				| Vielen Dank Nemored, das hilft mir sehr viel weiter. Das erspart mir einiges an Arbeit und ist für meine Zwecke völlig ausreichend. Echt toll dieses Forum! |  |  
		| Nach oben |  |  
		|  |  
		|  |  
  
	| 
 
 | Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten.
 Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
 Du kannst deine Beiträge in diesem Forum nicht löschen.
 Du kannst an Umfragen in diesem Forum nicht mitmachen.
 
 |  |