前几天研究游戏的资源打包加密,现在开源1.0版
blitzbasic吧
全部回复
仅看楼主
level 14
起帆远航 楼主
前几天打算弄个游戏,不过图片太多了,目录感觉特别的乱,所以就理工了个游戏资源打包解包的功能函数集出来。
用blitzbasic 中的blitzplus、blitz3d调用
在程序代码前加入:Include "Lpak.bb" 这行代码就可调用以下函数。
程序默认的文件名为data.pak
附件中有源码及示例。。。准备做个工具,直接生成.pak文件。
2013年07月26日 08点07分 1
level 14
[酷]
2013年07月27日 04点07分 2
晕了,也没人赞个!
2013年07月27日 04点07分
这程序设计的相当不错,很多地方可以代替资源DLL使用了,另外看你思路是将其中的资源释放到临时文件,程序再调用,用完删除。我想问一下,blitz有没有办法,将你资源包内的图片直接加载使用呢?
2013年09月22日 02点09分
回复 shen_ys :理论上没问题,可以我现在没有太多的时间弄。。
2013年09月23日 00点09分
而且,这个小软件也不是很完善,只是贡大家参考,希望大家能弄出更多更好的东西来!
2013年09月23日 00点09分
level 14
起帆远航 楼主

Include "Lpak.bb"
AppTitle "Pak资源打包工具 V1.0 - By Liu Haitao QQ:7552169"
SeedRnd (MilliSecs())
Global EditWindow
Global libListBox1
Global btnButton0
Global btnButton4
Global chbCheckBox0
Global grpGroupBox0
Global lblLabel0
Global lblLabel1
Global tfdTextField0
Global tfdTextField1
Global btnButton3
Global lblLabel2
Global grpGroupBox1
Global chbCheckBox1
Global lblLabel3
Global tfdTextField2
Global grpGroupBox2
Global tfdTextField3
Global folder$
Global tfdTextField4
Global dataname$="Mydata.pak"
EditWindow=CreateWindow(" Pak资源打包工具 V1.0 - By Liu Haitao QQ:7552169",300,200,571,380,0,17)
folder$=Left$(CurrentDir$(),Len(CurrentDir$())-1)
tfdTextField4=CreateTextField(8,18,280,20,EditWindow)
SetGadgetText tfdTextField4,folder$
libListBox1=CreateListBox(8,48,352,238,EditWindow)
mululist()
btnButton4=CreateButton("选择目录",296,16,64,22,EditWindow,1)
btnButton0=CreateButton("生成Pak资源文件",8,304,128,32,EditWindow,1)
chbCheckBox0=CreateButton("使用密匙",392,32,96,16,EditWindow,2)
lblLabel0=CreateLabel("文件密码:",384,64,64,16,EditWindow,0)
lblLabel1=CreateLabel("目录密码:",384,88,64,16,EditWindow,0)
tfdTextField0=CreateTextField(448,56,72,20,EditWindow)
SetGadgetText tfdTextField0,"12345678"
tfdTextField1=CreateTextField(448,80,72,20,EditWindow)
SetGadgetText tfdTextField1,"87654321"
btnButton3=CreateButton("生成新随机密码",408,112,112,24,EditWindow,1)
DisableGadget tfdTextField0
DisableGadget tfdTextField1
DisableGadget btnButton3
chbCheckBox1=CreateButton("为.EXE文件附加资源",392,192,132,16,EditWindow,2)
lblLabel3=CreateLabel("执行文件名称:",392,232,118,16,EditWindow,0)
tfdTextField2=CreateTextField(392,256,136,20,EditWindow)
SetGadgetText tfdTextField2,"Myfile.exe"
DisableGadget tfdTextField2
grpGroupBox0=CreateGroup( "密匙选项",376,8,168,144,EditWindow)
grpGroupBox1=CreateGroup( "EXE 附加资源选项",376,168,168,120,EditWindow)
grpGroupBox2=CreateGroup( "Pak资源库文件初始化代码",152,296,392,48,EditWindow)
tfdTextField3=CreateTextField(8,16,376,20,grpGroupBox2)
SetGadgetText tfdTextField3,"PakInit "+Chr(34)+"Mydata.Pak"+Chr(34)+", 0, "+Chr(34)+"TMP"+Chr(34)+", 0"
;-mainloop--------------------------------------------------------------
Repeat
id=WaitEvent()
Select id
Case $401 ; interacted with gadget
DoGadgetAction( EventSource() )
Case $803 ; close gadget
Exit
End Select
Forever
;-gadget actions--------------------------------------------------------
Function DoGadgetAction( gadget )
Select gadget
Case libListBox1 ; user selected treeview node
filename$=GadgetItemText$( libListBox1,SelectedGadgetItem(libListBox1))
Case btnButton0 ; user pressed button
PakOutputDir "C:\OutPutPakDemoDeleteMe"
ChangeDir folder$
PakBulkOverWrite = False
If ButtonState(chbCheckBox0) Then
n_st1=TextFieldText$(tfdTextField0)
n_st2=TextFieldText$(tfdTextField1)
CreatePakFile dataname$,n_st1,n_st2
Else
CreatePakFile dataname$,0,0
EndIf
num_item=CountGadgetItems( libListBox1 )
For i=0 To num_item-1
filename$=GadgetItemText$( libListBox1,i)
AddtoPak filename$
Next
CloseCreatedPak()
fileout = WriteFile(Left$(dataname$,Len(dataname$)-4)+".ini")
WriteLine( fileout, dataname$ )
WriteLine( fileout, "")
WriteLine( fileout,TextFieldText$(tfdTextField3))
WriteLine( fileout,"-------文件列表-------")
For i=0 To num_item-1
filename$=GadgetItemText$( libListBox1,i)
WriteLine( fileout, filename$)
Next
CloseFile( fileout )
Case chbCheckBox0 ; user changed checkbox
If ButtonState(chbCheckBox0) Then
EnableGadget tfdTextField0
EnableGadget tfdTextField1
EnableGadget btnButton3
st1=TextFieldText$(tfdTextField0)
st2=TextFieldText$(tfdTextField1)
SetGadgetText tfdTextField3,"PakInit "+Chr(34)+dataname$+Chr(34)+", "+st1+", "+Chr(34)+"TMP"+Chr(34)+", "+st2
Else
DisableGadget tfdTextField0
DisableGadget tfdTextField1
DisableGadget btnButton3
SetGadgetText tfdTextField3,"PakInit "+Chr(34)+dataname$+Chr(34)+", 0, "+Chr(34)+"TMP"+Chr(34)+", 0"
End If
Case chbCheckBox1 ; user changed checkbox
If ButtonState(chbCheckBox1) Then
EnableGadget tfdTextField2
Else
DisableGadget tfdTextField2
End If
Case btnButton4
folder$=RequestDir$( "请您选择将打打包的目录:" )
SetGadgetText tfdTextField4,folder$
mululist()
Case btnButton3 ; user pressed button
st1=Rand(10000000,99999999)
st2=Rand(10000000,99999999)
SetGadgetText tfdTextField0,st1
SetGadgetText tfdTextField1,st2
SetGadgetText tfdTextField3,"PakInit "+Chr(34)+dataname$+Chr(34)+", "+st1+", "+Chr(34)+"TMP"+Chr(34)+", "+st2
Case tfdTextField0
If EventData() = 13 Then ; user pressed return in textfield
EndIf
Case tfdTextField1
If EventData() = 13 Then ; user pressed return in textfield
EndIf
Case tfdTextField2
If EventData() = 13 Then ; user pressed return in textfield
EndIf
Case tfdTextField3
If EventData() = 13 Then ; user pressed return in textfield
EndIf
End Select
End FunctionFunction CreateGroup( label$, xpos,ypos, width,height, group, collapsable = False, active=1 )
cnv = CreateCanvas( xpos,ypos,width,height,group )
SetBuffer CanvasBuffer( cnv )
font = LoadFont("Tahoma",13 )
SetFont font
col=api_GetSysColor(15)
gadr=col And $ff
gadg=col Shr 8 And $ff
gadb=col Shr 16 And $ff
ClsColor gadr,gadg,gadb
Cls ;Color 70, 70, 70
Rect 0,6,width,height-6, 0
Rect 1,7,width-2,height-8, 0
Color 190,190,190
Rect 0,6,width-1,height-7, 0
Color gadr,gadg,gadb
Rect 4, 0, StringWidth( label$ ) + 8, StringHeight( label$ ), 1
Color 0,0,0
Text 8, 0, label$
FlipCanvas cnv
Return cnv
End Function
Function mululist()
myDir=ReadDir(folder$)
ClearGadgetItems libListBox1
While MoreFiles( myDir )
filename$=NextFile$(myDir)
If filename$<>"." And filename$<>".." And FileType(folder$+"\"+filename$) <> 2 Then
AddGadgetItem libListBox1,filename$
EndIf
Wend
CloseDir myDir
End Function
2013年07月30日 02点07分 3
1