Bilder und Fonts in exe einbauen oder in Packages

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Barbapapa

Betreff: Bilder und Fonts in exe einbauen oder in Packages

BeitragSo, Okt 08, 2006 12:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, habe jetzt doch BMax gekauft, und gefällt mir viel besser also die Demo Wink besonders auf das OOP bin ich scharf und die Multiplattform-Fähigkeit und .... Smile

was ich noch nicht rausfinden konnte, wie kann man Fonts und Bilder nicht offen rumliegen haben, also entweder in der exe eingebaut oder als separates geschütztes Archiv. Meine Vermutung würde lauten alles in einem grossem Paket packen und dann von da aus in den Speicher und dann eventuell decrypten und dann den Funktionen zuweisen? Aber wie weise ich z.B dem Befehl LoadFont eine Adresse zu und nicht nur eine URL oder einen Filenamen oder schreibe ich Unsinn oder gibt es dazu ein Tutorial. In GM habe ich das so gelöst, Teile in der exe eingebunden andere Teile oder in Archiv, dann bei Bedarf ALLES entpacken, laden und schnell wieder löschen). Anders geht es da nicht.

Am allerliebsten wäre mir alles in externen geschützten Paketen zu haben und dann bei Bedarf Teile davon in den Speicher zu zu laden und zu verwenden.

Bis denne

BladeRunner

Moderator

BeitragSo, Okt 08, 2006 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau mal nach incbin Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Barbapapa

BeitragSo, Okt 08, 2006 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
Schau mal nach incbin Wink


yo, soviel zum Thema in exe einbinden, cool gelöst, und fürs extern halten habe ich MPacker von filax gefunden, obwohl es wohl noch Schwierigkeiten mit dem Mac geben soll. Hach wenn bloss die Doku besser wäre, ach ach ach <seufz> Wink

Edit: Banks dürften helfen oder???

FOODy

BeitragSo, Okt 08, 2006 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich hab dafür ein kleinen Packer geschrieben. (Eigentlich nichts besonderes, aber ich brauch nicht mehr Very Happy)

Vllt hilft dir das etwas weiter. (für test.png irgendein PNG-bild)

Code: [AUSKLAPPEN]
SuperStrict

Type TPacker
   Field _stream:TStream
   Field _files:TList = New TList
   
   Method Delete()
      If _stream Then _stream.Close()
   EndMethod
   
   Method BeginWrite(file:String)
      If _stream Then _stream.Close()
      _stream = WriteStream(file)
   EndMethod

   Method BeginRead(file:String)
      If _stream Then _stream.Close()
      If _files Then _files.clear()
      _stream = ReadStream(file)
   EndMethod
   
   Method WriteFile:Int(file:Object,fileid:String = "")
      If Not _stream Return False
      If fileid="" fileid = file.toString()
      Local stream:TStream = ReadStream(file)
      If Not stream Return False
      Local bank:TBank = CreateBank(stream.size())
      Local dest:TBank = CreateBank(stream.size()*1.001+12)
      ReadBank(bank,stream,0,bank.size())
      stream.Close()
      Local Size:Int = dest.size()
      compress(dest.buf(),Size,bank.buf(),bank.size())
      fileid = _encode(fileid)
      _stream.WriteShort(fileid.length)
      _stream.WriteString(fileid)
      _stream.WriteInt(Size)
      _stream.WriteInt(bank.size())
      WriteBank(dest,_stream,0,Size)
      Return True
   EndMethod
   
   Method WriteDir:Int(dir:String,subdirs:Byte = True,rep:String = "")
      Local dr:Int = ReadDir(dir)
      Local count:Int = 0
      Repeat
         Local file:String = NextFile(dr)
         If file = "" Exit
         If Not file.Replace(".","") Continue
         file = Replace(dir+"/"+file,"//","/")
         If(FileType(file)=FILETYPE_DIR)
            If rep
               count:+WriteDir(file,subdirs,rep)
            Else
               count:+WriteDir(file,subdirs,dir)
            EndIf
         ElseIf(FileType(file)=FILETYPE_FILE)
            If Self.WriteFile(file,Replace(file,rep,"")) count:+1
         EndIf
      Forever
      Return count
   EndMethod
   
   Method ReadFile:TBankStream(file:String)
      If Not _stream Return Null
      _stream.seek(0)
      Local _file:TPackerFile = CachedFile(file)
      If _file
         _file._bankstream.seek(0)
         Return _file._bankstream
      EndIf
      Repeat
         Local filename:String = _decode(_stream.readstring(_stream.readshort()))
         If(filename=file)
            Local Size:Int = _stream.ReadInt()
            Local dest_size:Int = _stream.ReadInt()
            Local bank:TBank = CreateBank(Size)
            Local dest:TBank = CreateBank(dest_size)
            _file = New TPackerFile
            _files.addlast _file
            _file._pos = _stream.Pos()
            _file._file = filename
            _file._stream = _stream
            _file._size = Size
            _file._dest_size = dest_size
            ReadBank(bank,_stream,0,Size)
            uncompress(dest.buf(),dest_size,bank.buf(),Size)
            _file._bankstream = CreateBankStream(dest)
            Return _file._bankstream
         EndIf
         _stream.seek(_stream.pos()+_stream.ReadInt()+4)
      Until Eof(_stream)
      Return Null
   EndMethod
   
   Method Read:Int()
      Local _file:TPackerFile
      Local count:Int
      _stream.seek(0)
      Repeat
         Local filename:String = _decode(_stream.readstring(_stream.readshort()))
         _file = CachedFile(filename)
         If(_file)
            _stream.seek(_stream.pos()+_stream.ReadInt()+4)
            count:+1
         Else
            Local Size:Int = _stream.ReadInt()
            Local dest_size:Int = _stream.ReadInt()
            _file = New TPackerFile
            _files.addlast _file
            _file._pos = _stream.Pos()
            _file._file = filename
            _file._size = Size
            _file._dest_size = dest_size
            _file._stream = _stream
            _stream.seek(_stream.Pos()+Size)
            count:+1
         EndIf
      Until _stream.eof()
      Return count
   EndMethod
   
   Method GetStream:TBankStream(file:String)
      Local _file:TPackerFile = CachedFile(file)
      If Not _file Return Null
      Local stream:TBankStream = _file.GetStream()
      stream.seek(0)
      Return stream
   EndMethod
   
   Method CachedFile:TPackerFile(file:String)
      For Local f:TPackerFile=EachIn _files
         If f._file=file Return f
      Next
      Return Null
   EndMethod
   
   Method Close()
      If _stream Then _stream.Close()
   EndMethod
   
   Method _encode:String(str:String)
      Local tmp_str:String = ""
      For Local i:Int=0 Until str.length
         tmp_str:+Chr(str[i]+i)
      Next
      Return tmp_str
   EndMethod

   Method _decode:String(str:String)
      Local tmp_str:String = ""
      For Local i:Int=0 Until str.length
         tmp_str:+Chr(str[i]-i)
      Next
      Return tmp_str
   EndMethod
   
   Function PackDir(dir:String,dest:String,subdirs:Byte = True)
      Local p:TPacker = New TPacker
      p.BeginWrite(dest)
      p.WriteDir(dir)
      p.Close()
   EndFunction
EndType

Type TPackerFile
   Field _file:String
   Field _pos:Int
   Field _size:Int
   Field _dest_size:Int
   Field _bankstream:TBankStream
   Field _stream:TStream
   
   Method GetStream:TBankStream()
      If _bankstream Return _bankstream
      _stream.seek(_pos)
      Local bank:TBank = CreateBank(_size)
      Local dest:TBank = CreateBank(_dest_size)
      ReadBank(bank,_stream,0,_size)
      uncompress(dest.buf(),_dest_size,bank.buf(),_size)
      _bankstream = CreateBankStream(dest)
      _bankstream.seek(0)
      Return _bankstream
   EndMethod
EndType


' ----------------------------------------------------------

Graphics 800,600,0

Local pk:TPacker = New TPacker ' Packer Instanz erstellen
pk.BeginWrite("test.pk")       ' Das Schreiben beginnen
pk.WriteFile("test.png")       ' Datei hinzufügen
pk.Close()                  ' Schließen

pk.BeginRead("test.pk")        ' Lesemodus
Local image:TImage = LoadImage(pk.ReadFile("test.png"))  ' Datei in den RAM als BankStream auslesen
pk.Close()                     ' Schließen

Repeat
   Cls
      DrawImage image,0,0
   Flip
Until AppTerminate() Or KeyDown(KEY_ESCAPE)


EDIT:
Zitat:

Edit: Banks dürften helfen oder???

Ja, genau die verwende ich in meinem packer auch.



Gruß,
FOODy
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB
 

klepto2

BeitragSo, Okt 08, 2006 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau dir mal meinen Packer an: https://www.blitzforum.de/showcase/?project=73

Der Code wird auch bald veröffentlicht, so das man es auch auf dem Mac testen kann. die Gui ist noch sehr notdürftig, da ich im Moment wenig Zeit hatte. Aber mein Packer zipped die Dateien gleichzeitig, verschlüsselt sie und das Pack kann Passwort geschützt werden. Dazu besitzt das Modul eine eigene Baumstruktur (Directory) also von der anwendung ähnlich wie incbin.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu
 

Barbapapa

BeitragSo, Okt 08, 2006 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@Mr. FOODS: hey super ich liebe code Besipiele, sieht ja doch komplexer aus, ziehe ich mir rein.

@klepto2: cool, ja das mit dem Mac, testen müssten es dann die Macianer, weiss gar nicht ob Filax seinen Packer weiterentwickelt, bin immer wieder erstaunt wieviel man doch beachten muss, wenn es portabel sein soll.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group