cocos2dx android 加载OBB的方法网上搜索了没有特别简单的方法,我在看了英文的论坛的解决方法后,自己尝试未果,经过自己修改终于搞定了。分享出来给大家。
step1://获取obb Path PS:如果嫌麻烦可以这步可以不要,直接填值
在启动的Activity里添加如下方法
public String getObbFileName() {
PackageInfo info = null;
try {
info = getPackageManager().getPackageInfo(getPackageName(), 0);
String fileName = "main." + info.versionCode + "." + getPackageName() + ".obb";
Log.e("===fileName===", fileName);
return fileName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return "";
}
public String getVirtualObbFileFullpath(){
String _path = getObbDir().getPath() + "/" + getObbFileName();
Log.e("===_path===", _path);
return _path;
}
onCreate里面添加如下代码:(其中为FATE_OBB_PATH为 public static String)
FATE_OBB_PATH =getVirtualObbFileFullpath() ;//这句需要放在super.onCreate上面
step2:在cocos2dxhelper.java中做如下修改
Cocos2dxHelper.sAssetManager = activity.getAssets();
Cocos2dxHelper.nativeSetContext((Context)activity, Cocos2dxHelper.sAssetManager);
在这2句中间插入如下代码
Method addAssetPath;
try {
addAssetPath = Cocos2dxHelper.sAssetManager.getClass().getMethod("addAssetPath", String.class);
addAssetPath.invoke(Cocos2dxHelper.sAssetManager, obbPath);
} catch (Exception e) {
e.printStackTrace();
}
最后结果为
Cocos2dxHelper.sAssetManager = activity.getAssets();
Method addAssetPath;
try {
addAssetPath = Cocos2dxHelper.sAssetManager.getClass().getMethod("addAssetPath", String.class);
addAssetPath.invoke(Cocos2dxHelper.sAssetManager, obbPath); //obbPath为第一步获取的,如果你知道这里的正确值也可以直接填写不用第一步
} catch (Exception e) {
e.printStackTrace();
}
Cocos2dxHelper.nativeSetContext((Context)activity, Cocos2dxHelper.sAssetManager);
PS:以上修改图片没有问题,声音可能会有问题,如果声音有问题就先放到assets里面,不要放到OBB里。
---------------------声音问题补充--------------------------------
方法1:在制作OBB文件的时候(也就是zip压缩的时候)不要压缩声音和音乐文件(用命令行,但是我不知道window是上怎么弄)。
方法2:修改代码
新建一个类(FZZippedAssetsFix ,类名随意)代码如下
package org.cocos2dx.lib;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.os.ParcelFileDescriptor;
public class FZZippedAssetsFix {
public static File fileFromAsset(Context context, String assetName) throws IOException {
File outFile = new File(context.getCacheDir(), assetName );
outFile.getParentFile().mkdirs();
copy(context.getAssets().open(assetName), outFile);
return outFile;
}
public static void copy(InputStream inputStream, File output) throws IOException {
FileOutputStream outputStream = null;
try {
outputStream = new FileOutputStream(output);
boolean read = false;
byte] bytes = new byte;
int read1;
while((read1 = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read1);
}
} finally {
try {
if(inputStream != null) {
inputStream.close();
}
} finally {
if(outputStream != null) {
outputStream.close();
}
}
}
}
public static AssetFileDescriptor AFDfromAssets(Context ct,String path) throws IOException{
File file= fileFromAsset(ct, path);
AssetFileDescriptor sf= new AssetFileDescriptor(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY), 0, -1);
return sf;
}
}
找到Cocos2dxSound.java中的这句代码
soundID = this.mSoundPool.load(this.mContext.getAssets().openFd("assets/"+path), 0);
替换为
soundID = this.mSoundPool.load(FZZippedAssetsFix.AFDfromAssets(mContext, path), 0);
找到Cocos2dxMusic.java中的这句代码
final AssetFileDescriptor assetFileDescritor = this.mContext.getAssets().openFd(path);
替换为
final AssetFileDescriptor assetFileDescritor = FZZippedAssetsFix.AFDfromAssets(mContext, path);
上述代码就OK了。