Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Verschiedene Auflösungen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
alderaan1972



Anmeldungsdatum: 04.01.2021
Beiträge: 3

BeitragVerfasst am: 20.02.2021, 00:02    Titel: Verschiedene Auflösungen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 20.02.2021, 09:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
alderaan1972



Anmeldungsdatum: 04.01.2021
Beiträge: 3

BeitragVerfasst am: 20.02.2021, 14:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz