游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3015|回复: 4

[新手]如何封装和解压游戏资源呢??

[复制链接]

9

主题

52

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2008-3-24 10:34:00 | 显示全部楼层 |阅读模式
我是个新手,没做过游戏,请问如何封装和解压游戏资源呢??

即是很多商业游戏的游戏资源都是压缩到一个自己定义的文件类型里面
,作用当然是为了保护游戏资源,

那么如何去实现以上的效果呢?? 实现了,在游戏程序里面如何读取呢??

谢谢高手解答

9

主题

52

帖子

56

积分

注册会员

Rank: 2

积分
56
 楼主| 发表于 2008-3-26 18:03:00 | 显示全部楼层

Re:[新手]如何封装和解压游戏资源呢??

都两天了,看的人这么多,怎么没人回答一下,

如很多游戏都将自己的图片资源、配置资源等等通过打包成一个文件来隐藏资源的。
请问如何实现这些资源的打包和读取呢??

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2008-3-26 21:46:00 | 显示全部楼层

Re:[新手]如何封装和解压游戏资源呢??

不是一两句说得清楚的。

打包,最简单的就是把N个文件合并成一个文件。怎么从这个pak文件中取需要的文件数据呢,那么pak至少需要个文件头,记录各个包内文件的偏移量和大小。

再复杂点,包内的文件是树状结构的,也就是说包括了目录。而且我们希望通过类似path那样,找到包内的某个文件。那么可以通过path算出hash,把hash作为包内查文件的一个重要参数。hash是数值,也就是我们可以通过事先排序好,再打包的方式,节省解包时查找文件的计算量。

站内的文档应该有这类文章,有些外国人写的书里也有,操作系统书里的文件系统章节也具有参考价值。

9

主题

52

帖子

56

积分

注册会员

Rank: 2

积分
56
 楼主| 发表于 2008-3-27 09:36:00 | 显示全部楼层

Re:[新手]如何封装和解压游戏资源呢??

赞,多谢楼上的回答

1

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2008-3-27 11:42:00 | 显示全部楼层

Re:[新手]如何封装和解压游戏资源呢??

我有个很简单的加密程序,可以进行文件合并和分解,送给你吧。由于纯属于一时兴起练练手,代码写的很不规范,我都不还意思拿出来的说。。。
------------------------------------------------

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;
void go(fstream*,fstream*,fstream*,char *,char *);
void goback(fstream *);
char key[8]={'v','z','e','x','V','Z','E','X'};
int main(int argnum,char **arg)
{
        bool mode=0;
        bool man=false;
        if (argnum==4)
        {
                mode=1;

        }
        else if (argnum==2)
        {
                mode=0;
        }
        else
        {
                man=true;
                cout<<"本打包器由vzex制作,含基本的加密功能,不包\n含压缩功能,请不要将目标文件与其他文件重名\n"
                        <<"可以自建快捷+参数的方式进行打包和解包操作,\n一参数为解包三参数为打包,分别与菜单相对应.\n"
                        <<"\n1------------打包\n2------------解包\n";
                int k;
                cin>>k;
                switch(k)
                {
                case 1:mode=1;
                        break;
                case 2:mode=0;
                        break;
                default:
                        return 0;
                }
        }

        char *file1,*file2,*file3;
        if (man)
        {
                char s1[20],s2[20],s3[20];
                if (mode==1)
                {
                        cout<<"请输入第一个要打包的文件名:\n";
                        cin>>s1;
                        file1=s1;
                        cout<<"请输入第二个要打包的文件名:\n";
                        cin>>s2;
                        file2=s2;
                        cout<<"请输入打包的目标文件名:\n";
                        cin>>s3;
                        file3=s3;
                }
                else
                {
                        cout<<"请输入要解包的文件名:\n";
                        cin>>s1;
                        file1=s1;
                }

        }
        else{
                file1=arg[1];
                if (mode==1)
                {
                        file2=arg[2];

                        file3=arg[3];
                }
        }

        if ((access(file1,0)!=0))
        {
                cout<<"文件不存在\n";
                system("pause");
                return 0;
        }
        fstream *load1=new fstream(file1,ios::in|ios::binary);
        if (mode==1)
        {
                if ((access(file2,0)!=0))
                {
                        cout<<"文件不存在\n";
                        system("pause");
                        return 0;
                }
                fstream *load2=new fstream(file2,ios::in|ios::binary);
                fstream *back=new fstream(file3,ios:ut|ios::binary);
                go(load1,load2,back,file1,file2);
        }
        else if (mode==0)
        {
                goback(load1);
        }
        else
        {
                return 0;
        }
        system("pause");
        return 0;
}

void go(fstream *f1,fstream *f2,fstream *f3,char *a,char *b)
{

        const int size=1;
        char str1[size],str2[size];
        char dest1[size];
        char dest2[size];

        int na=0,nb=0;

        if (!(f1&&f2&&f3))
        {
                return ;
        }
        f1->read(str1,size);
        f2->read(str2,size);
        int knum=0;
        while (1)
        {
                if (!f1->eof())
                {
                        for(int i=0;i<size;i++)
                        {
                                dest1=str1^key[knum];
                        }
                        f3->write(dest1,size);
                        f1->read(str1,size);
                        na++;
                        //cout<<"a:"<<na<<endl;
                        knum++;
                        knum%=8;
                }
                if (!f2->eof())
                {
                        for(int i=0;i<size;i++)
                        {
                                dest2=str2^key[knum];
                        }

                        f3->write(dest2,size);

                        f2->read(str2,size);
                        nb++;
                        //cout<<"b:"<<nb<<endl;
                        knum++;
                        knum%=8;
                }
                if (f2->eof()&&f1->eof())
                {
                        break;
                }


        }
        char sa[10],sb[10];
        //f3->seekp(0,ios::end);
        itoa(na,sa,10);
        itoa(nb,sb,10);
        cout<<na<<endl<<nb<<endl;
        f3->write(a,16);
        f3->write(b,16);
        f3->write(sa,8);
        f3->write(sb,8);
        f1->close();
        f2->close();
        f3->close();
        cout<<"合并成功完成\n作者:vzex\n";
}
void goback(fstream *f)
{
        if (!f)
        {
                return ;
        }

        int knum=0;
        f->seekg(-48,ios::end);
        const int size=1;
        char str[20];
        ZeroMemory(str,20);
        f->read(str,16);
        fstream a(str,ios::out|ios::binary);
        f->read(str,16);
        fstream b(str,ios::out|ios::binary);

        if (!b)
        {
                cout<<"asdasd"<<endl;
        }

        char num[8];
        f->read(num,8);
        int anum=atoi(num);
        cout<<anum<<endl;
        f->read(num,8);
        int bnum=atoi(num);
        cout<<bnum<<endl;

        f->seekg(0);
        f->read(str,size);

        char dest[size];
        //ZeroMemory(str,sizeof(size));
        bool wa=true;

        while (!f->eof())
        {
                for (int i=0;i<size;i++)
                {
                        dest=str^key[knum];
                }
                if (wa)
                {
                        wa=false;
                        if (anum>0)
                        {a.write(dest,size);
                        anum--;
                        knum++;
                        knum%=8;
                        }
                        else
                        {

                                continue;

                        }


                }
                else if(!wa)
                {
                        wa=true;
                        if (bnum>0)
                        {b.write(dest,size);
                        bnum--;

                        knum++;
                        knum%=8;
                        }
                        else
                        {

                                continue;

                        }


                }
                if (bnum==0&&anum==0)
                {
                        break;
                }
                f->read(str,size);
        }
        cout<<"分离成功完成\n作者:vzex\n";
        a.close();
        b.close();
        f->close();
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 15:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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