卡面文件位置在这里:
内部存储\Android\data\com.cygams.Shadowverse\files\a\
这是游戏资源文件夹,里面有种形如card_xxxxxxxxx.unity3d的文件,这种储存了卡面数据的文件就是我们要改动的文件。你们的老婆就在这里面。
那串x号代表了卡片编号。查询卡图对应编号的方法:在浏览器中打开http://shadowverse-portal.com/cards 。打开后,先点击右上角的language,将英语转换成繁体中文,然后找到你想改的卡面,点进去之后看网址。
以次元超越为例:
101334020就是超越的编号。记好这个编号,下面会用到。
然后是一些事前准备工作。
备份:将资源包,也就是Android/data/com.cygames.Shadowvers/files/a中的文件进行备份,放在一边。就算玩坏了也有个备份可以再玩一次。
所需软件:Adobe Photoshop CS6(简称PS)、Unity Assets Bundle Extractor(简称UABE)和UnityEX。
2
/14
第二部分:实际 *** 作
第一步
上面我们查到了超越的编号,下面搜索出它所对应的card_xxxxxxxxx.unity3d文件,复制粘贴到新建文件夹。
最后一位对应的进化前后的卡面,0是进化前,1是进化后
第二步
打开PS,随便打开一张图片,新建图片也可以,将它改为512x512像素格式。这个是重点,其他格式都不行。
另存为png格式,命名为xxxxxxxxxx(在前9个x里填入超越的编号,在最后一个x里,想要更改进化前的图片就填0,想要更改进化后的图片就填1)。
3
/14
第三步
然后打开UnityEX。点击左上角的Open archive Unity。
4
/14
然后选择刚刚复制粘贴出来的unity3d文件,点击打开。
5
/14
点击Export all files。这时在刚刚新建的文件夹里会释放出一个名为Unity_Assets_Files的文件夹(卡面数据就在这个文件夹)。
6
/14
先来打开文件。点击File,点击open,选中刚刚复制粘贴出来的unity3d文件。
7
/14
8
/14
9
/14
10
/14
选中一个文件,然后在右上角name一格下查看文件名,找到assets/_wizardresources/resources/card/spell/textures/xxxxxxxxxx.png这样的文件名,如果没找到该文件名就再选中、再找(看最后一位数字,0代表进化前的卡面,1则代表进化后的卡面)。
选中该文件,点击Plugins,在d出的界面点击Exit,点击OK,会d出下面的界面:
11
/14
12
/14
13
/14
点上面界面里的File,点save。
现在离成功很近了,点击软件初始界面里的File,点击save,保存的文件名填card_xxxxxxxxxx.unity3d(x可以随便填,但不能填和源文件一样的名称)
第五步
再次打开UnityEX。将上一步保存的unity3d文件按照第三步 *** 作,释放的文件也在文件夹Unity_Assets_Files里。
在以下路径的文件夹里有扩展名为.tex.pvr的文件,这就是卡图数据存放的地方。
14
/14
将后释放出的pvr文件覆盖之前释放出的pvr文件。
调出之前没关闭的UnityEX界面,点击lmpor all files。
最后在Unity_Assets_Files所在文件夹得到的与源文件名相同的unity3d文件就是我们的补丁文件。
将补丁文件覆盖到游戏资源文件夹,就可以在游戏中愉快的玩耍了
什么是PVR呢?英文全称是Personal video recorder。用一句概括起来讲,PVR 实际上是不需要录象带的VCR(录象机)。 普通的VCR只是将电视机节目录制到VHS 录象带上,而PVR用一块内置硬盘驱动器代替了录象带。在将电视节目录制到PVR的内置硬盘中,您就可以播放录制的节目,可以快进,想看多少便就看多少遍,等最后看够了,就从硬盘上删除。 所有的PVR在机壳后部的面板上都有耳机插孔。通过这个插孔还可以用来更新PVR的节目收视指南(指南概括显示了在一周内将要播放的节目,同有线电视或电视卫星服务向您提供的节目收视指南很相似。)通过节目收视指南,您可以浏览在接下来的一周内将要播放的所有节目(就象您每天吃了晚饭,坐在沙发上随手翻看电视报,盘算着有什么有趣的节目看一样),您还可以通过编排节目收视指南,只录制具有某些关键词的节目。举个例子,假设您输入“动物世界”,PVR就可以把下周播出的动物世界的每一集都录制下来(甚至包括在不同频道播出的)。PVR还有更强大的功能,PVR的检索功能远不仅仅限于节目名称检索。PVR可以检索演员、导演、流派等,只要是在电视节目的说明中出现了,PVR就可以检索。例如,如果您是Sylvester Stallone的影迷,您在编排节目时,输入他的名字,那么PVR 就会把下周内播出的所有的有Sylvester Stallone出现的节目录制下来。pvr格式的数据在IOS上直接交给显卡渲染的,而cocos2dx 中的texture是直接交给显卡渲染的,所以理论上将pvr格式的数据可以不进行任何数据的转换就可以生成一张texture,事实上确实是这样的。一, 保存为pvr格式
要保存pvr文件,我们首先分析cocos2dx引擎中是怎样解析pvr文件的。可以看到cocos2dx库中的CCTexturePVR类提供了两个方法来解析pvr格式图片分别是unpackPVRv2Data、unpackPVRv3Data,两个方法分别解析的是PVR的v2和v3版本。本文只分析v2版本:
bool CCTexturePVR::unpackPVRv2Data(unsigned char* data, unsigned int len)//data数据是直接从文件里读出来没有做任何处理的
{
bool success = false
ccPVRv2TexHeader *header = NULL
unsigned int flags, pvrTag
unsigned int dataLength = 0, dataOffset = 0, dataSize = 0
unsigned int blockSize = 0, widthBlocks = 0, heightBlocks = 0
unsigned int width = 0, height = 0, bpp = 4
unsigned char *bytes = NULL
unsigned int formatFlags
// 用header指向data数据的头部(PVR v2格式的头部固定是52个字节,也就是data的前52个字节的数据,data剩下的数据就是生成texture的数据了)
header = (ccPVRv2TexHeader *)data
// 这是头部的一个标识值为 "PVR!" 占4字节
pvrTag = CC_SWAP_INT32_LITTLE_TO_HOST(header->pvrTag)
if (gPVRTexIdentifier[0] != (char)(((pvrTag >> 0) &0xff)) ||
gPVRTexIdentifier[1] != (char)(((pvrTag >> 8) &0xff)) ||
gPVRTexIdentifier[2] != (char)(((pvrTag >>16) &0xff)) ||
gPVRTexIdentifier[3] != (char)(((pvrTag >>24) &0xff)))
{
return false
}
CCConfiguration *configuration = CCConfiguration::sharedConfiguration()
flags = CC_SWAP_INT32_LITTLE_TO_HOST(header->flags)
formatFlags = flags &PVR_TEXTURE_FLAG_TYPE_MASK
bool flipped = (flags &kPVR2TextureFlagVerticalFlip) ? true : false
if (flipped)
{
CCLOG("cocos2d: WARNING: Image is flipped. Regenerate it using PVRTexTool")
}
if (! configuration->supportsNPOT() &&
(header->width != ccNextPOT(header->width) || header->height != ccNextPOT(header->height)))
{
CCLOG("cocos2d: ERROR: Loading an NPOT texture (%dx%d) but is not supported on this device", header->width, header->height)
return false
}
unsigned int pvr2TableElements = PVR2_MAX_TABLE_ELEMENTS
if (! CCConfiguration::sharedConfiguration()->supportsPVRTC())
{
pvr2TableElements = 9
}
for (unsigned int i = 0i <pvr2TableElementsi++)
{
//Does image format in table fits to the one parsed from header?
if (v2_pixel_formathash[i].pixelFormat == formatFlags)
{
m_pPixelFormatInfo = v2_pixel_formathash[i].pixelFormatInfo
//Reset num of mipmaps
m_uNumberOfMipmaps = 0
//Get size of mipmap
m_uWidth = width = CC_SWAP_INT32_LITTLE_TO_HOST(header->width)
m_uHeight = height = CC_SWAP_INT32_LITTLE_TO_HOST(header->height)
//Do we use alpha ?
if (CC_SWAP_INT32_LITTLE_TO_HOST(header->bitmaskAlpha))
{
m_bHasAlpha = true
}
else
{
m_bHasAlpha = false
}
//Get ptr to where data starts..
dataLength = CC_SWAP_INT32_LITTLE_TO_HOST(header->dataLength)
//跳过头部,bytes直接指向了图片数据部分
bytes = ((unsigned char *)data) + sizeof(ccPVRv2TexHeader)
m_eFormat = m_pPixelFormatInfo->ccPixelFormat
bpp = m_pPixelFormatInfo->bpp
// Calculate the data size for each texture level and respect the minimum number of blocks
while (dataOffset <dataLength)
{
switch (formatFlags) {
case kPVR2TexturePixelFormat_PVRTC_2BPP_RGBA:
blockSize = 8 * 4// Pixel by pixel block size for 2bpp
widthBlocks = width / 8
heightBlocks = height / 4
break
case kPVR2TexturePixelFormat_PVRTC_4BPP_RGBA:
blockSize = 4 * 4// Pixel by pixel block size for 4bpp
widthBlocks = width / 4
heightBlocks = height / 4
break
case kPVR2TexturePixelFormat_BGRA_8888:
if (CCConfiguration::sharedConfiguration()->supportsBGRA8888() == false)
{
CCLOG("cocos2d: TexturePVR. BGRA8888 not supported on this device")
return false
}
default:
blockSize = 1
widthBlocks = width
heightBlocks = height
break
}
// Clamp to minimum number of blocks
if (widthBlocks <2)
{
widthBlocks = 2
}
if (heightBlocks <2)
{
heightBlocks = 2
}
dataSize = widthBlocks * heightBlocks * ((blockSize * bpp) / 8)
unsigned int packetLength = (dataLength - dataOffset)
packetLength = packetLength >dataSize ? dataSize : packetLength
// bytes指向的是data,而data是直接从文件里面读出来的数据,m_asMipmaps则是用来生成texture的数据,
// 所以这里可以得出结论,pvr的图片数据到texture不需要经过任何转换,
// 也就是说pvr格式的数据可以不进行任何数据的转换就可以生成一张texture
m_asMipmaps[m_uNumberOfMipmaps].address = bytes + dataOffset
m_asMipmaps[m_uNumberOfMipmaps].len = packetLength
m_uNumberOfMipmaps++
//Check that we didn"t overflow
CCAssert(m_uNumberOfMipmaps <CC_PVRMIPMAP_MAX,
"TexturePVR: Maximum number of mipmaps reached. Increase the CC_PVRMIPMAP_MAX value")
dataOffset += packetLength
//Update width and height to the next lower power of two
width = MAX(width >>1, 1)
height = MAX(height >>1, 1)
}
//Mark pass as success
success = true
break
}
通过上面的分析,我们知道了要把texture保存成pvr格式的文件只需为这样texture添加一个头部即可。关于pvr头部在CCTexturePVR.cpp中我们可以看到 _PVRTexHeader 这个结构体,这个结构体就是PVR的头部格式,现在要做的工作就是分析出_PVRTexHeader的成员的含义。这个可以参考imageination关于pvr的文档,需要提醒的是要注意版本差别。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)