|
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, 01: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: 4597 Wohnort: ~/
|
Verfasst am: 20.02.2021, 10: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, 22:40, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
alderaan1972
Anmeldungsdatum: 04.01.2021 Beiträge: 3
|
Verfasst am: 20.02.2021, 15: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.
|
|