游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1334|回复: 0

紧急求助----关于文件打包后如何调用的问题......

[复制链接]

8

主题

68

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2005-7-20 14:38:00 | 显示全部楼层 |阅读模式
前些天,我在一个外国的网站看到了一篇教你打包文件的教程,于是就用金山词霸(E文有点不行)看了一下,根据提示建立了一个测试工程,代码如下:
Option Explicit

Public Type FileHeader
    intNumFiles As Integer
    lngFileSize As Long
End Type

Public Type InfoHeader
    strFileName As String * 9
    lngFileStart As Long
    lngFileSize As Long
End Type

Private Sub Command1_Click()
    Dim intFileNum1 As Integer, intFileNum2 As Integer, intFileNum3 As Integer '//文件号
    Dim intBinFileNum As Integer '//文件号
    Dim bytData1() As Byte, bytData2() As Byte, bytData3() As Byte
    Dim lngFileStart As Long
    Dim BinaryFileHeader As FileHeader
    Dim BinaryInfoHeader() As InfoHeader
   
    On Local Error GoTo ErrOut
   
    '//以二进制方式打开三个不同类型文件
    intFileNum1 = FreeFile
    Open App.Path & "\Data\Image\test.bmp" For Binary Access Read Lock Write As intFileNum1
    intFileNum2 = FreeFile
    Open App.Path & "\Data\Image\test.txt" For Binary Access Read Lock Write As intFileNum2
    intFileNum3 = FreeFile
    Open App.Path & "\Data\Image\test.wav" For Binary Access Read Lock Write As intFileNum3
   
    '//重定义bytData1,bytData2,bytData3
    ReDim bytData1(LOF(intFileNum1) - 1)
    ReDim bytData2(LOF(intFileNum2) - 1)
    ReDim bytData3(LOF(intFileNum3) - 1)
   
    '//读取打开的文件到bytData1,bytData2,bytData3数组里
    Get intFileNum1, 1, bytData1
    Get intFileNum2, 1, bytData2
    Get intFileNum3, 1, bytData3
   
    '//关闭并删除文件
    Close intFileNum1
    Close intFileNum2
    Close intFileNum3
    Kill App.Path & "\Data\Image\test.bmp"
    Kill App.Path & "\Data\Image\test.txt"
    Kill App.Path & "\Data\Image\test.wav"
   
    '//给BinaryFileHeader的成员赋值
    '共有3个文件要合并
    BinaryFileHeader.intNumFiles = 3
    '合并后的文件大小为:3个文件的大小+文件头的大小+信息头的大小
    BinaryFileHeader.lngFileSize = (UBound(bytData1) + 1) + (UBound(bytData2) + 1) + (UBound(bytData3) + 1) + (6) + (BinaryFileHeader.intNumFiles * 17)
   
    '//重定义BinaryInfoHeader
    ReDim BinaryInfoHeader(1 To 3)
   
    '//为BinaryInfoHeader结构赋值
    BinaryInfoHeader(1).strFileName = "test.bmp"
    BinaryInfoHeader(2).strFileName = "test.txt"
    BinaryInfoHeader(3).strFileName = "test.wav"
   
    BinaryInfoHeader(1).lngFileSize = UBound(bytData1) + 1
    BinaryInfoHeader(2).lngFileSize = UBound(bytData2) + 1
    BinaryInfoHeader(3).lngFileSize = UBound(bytData3) + 1
   
    lngFileStart = 6 + 17 * BinaryFileHeader.intNumFiles + 1
   
    BinaryInfoHeader(1).lngFileStart = lngFileStart
    lngFileStart = lngFileStart + BinaryInfoHeader(1).lngFileSize
    BinaryInfoHeader(2).lngFileStart = lngFileStart
    lngFileStart = lngFileStart + BinaryInfoHeader(2).lngFileSize
    BinaryInfoHeader(3).lngFileStart = lngFileStart
   
    '//取得一个未被使用的文件号
    intBinFileNum = FreeFile
   
    '//建立一个文件名为bin.dat的文件
    Open App.Path & "\bin.dat" For Binary Access Write Lock Read Write As intBinFileNum
   
    '//写入文件头数据,信息头数据,三个要合并文件的数据
    Put intBinFileNum, 1, BinaryFileHeader
    Put intBinFileNum, , BinaryInfoHeader
    Put intBinFileNum, , bytData1
    Put intBinFileNum, , bytData2
    Put intBinFileNum, , bytData3
   
    '//关闭文件
    Close intBinFileNum
    Exit Sub
   
ErrOut:

    MsgBox "不能建立二进制文件!", vbOKOnly, "Error"
End Sub

它的思路是:首先以二进制方式打开要合并的文件("test.bmp","test.txt","test.wav),以字节为单位将文件的内容读到bytData1(),bytData2(),bytData3()数组中。然后填写FileHeader结构,它有两个成员: intNumFiles 保存的是要合并文件的个数;lngFileSize保存的合并后文件的大小。接着再填写InfoHeader结构,它的作用是保存每一个要合并的文件的信息,所以定义了一个3元素的数组,它有三个成员:strFileName保存的是合并文件的文件名;lngFileSize保存的是合并文件的大小;lngFileStart保存的是它在合并文件中的起始位置。最后,将FileHeader,
InfoHeader中的数据与要合并的三个文件一起写入文件bin.dat中。

按理说我应该高兴才对----终于可以在自己制作的游戏里用合并后的文件了,这样玩家就不可以在未玩游戏之前看图片,听音乐...了,但是~问题又出来了,我该怎么用合并后的文件调入图片及声音那?虽然我知道将上述代码倒过来,再加上一些修改就可以将bin.dat文件还原成原来的3个文件了,但是----不会要我在运行游戏中把它还原,再用吧,这样合并文件也没有什么用哦,还自找麻烦。我的问题是如何读取合并后的bin.dat文件做你想做的事!例如想在一个图片框中从bin.dat文件中加载一个test.bmp文件,该怎做?想从bin.dat文件中加载一个test.wav文件并播放,又该怎做...不会是用API函数吧。又或许将wav文件,txt文件和位图文件合成一个二进制文件太乱,应将所有的wav文件合成一个文件,所有的位图文件也合成一个文件这样调用起来是否简单些,可最大的问题是不会用啊,急煞我也。
[em4] [em4]
各位高手们,大侠们,行行好救救我把----头想破了也无结果(知识太贫乏了,毕竟是新手)
谁来救救我吧!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 11:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表