第四章:SDL集成
SDL是我接触游戏开发,所选用的第一个开发库,与本次学习的cocos2d-x关系不大。由于win8平台中direct2d,direct3d有更好的集成,当时就放弃了。这里插写一个章节,将SDL集成到android项目中来。
1.软件下载:
http://www.libsdl.org/download-2.0.php#source
SDL2-2.0.1.zip
http://skypark.cn/cocos2d/SDL2-2.0.1.zip
2.解压SDL2-2.0.1.zip
到C:\data\software\SDL2-2.0.1\SDL2-2.0.1
3.复制其中的android项目到新的目录
C:\data\software\SDL2-2.0.1\SDL2-2.0.1\android-project --> C:\data\android-project-sdl
4.新建一个android项目,选择路径为 C:\data\android-project-sdl
5.跟前一章一样步骤,添加builders
6.
将sdl自带的测试程序拷贝过来
C:\data\software\SDL2-2.0.1\SDL2-2.0.1\src\test\SDL_test_common.c
拷贝到 C:\data\android-project-sdl\jni\src\SDL_test_common.c
C:\data\software\SDL2-2.0.1\SDL2-2.0.1\test\testsprite2.c
拷贝到 C:\data\android-project-sdl\jni\src\testsprite2.c
C:\data\software\SDL2-2.0.1\SDL2-2.0.1\test\icon.bmp
拷贝到 C:\data\android-project-sdl\res\drawable-xhdpi\icon.bmp
7.
先从cygwin进入项目,添加SDL编译目录到项目中
cd /cygdrive/c/data/android-project-sdl/jni
cp /cygdrive/c/data/software/SDL2-2.0.1/SDL2-2.0.1 SDL -rf
chmod a+wr SDL/ -R
8.
修改C:\data\android-project-sdl\jni\src\Android.mk为:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
# Add your application source files here...
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
SDL_test_common.c \
testsprite2.c
LOCAL_SHARED_LIBRARIES := SDL2
LOCAL_LDLIBS := -lGLESv1_CM -llog
include $(BUILD_SHARED_LIBRARY)
9.
build project.如下表示成功:
10.到这里算告一个段落了。但是运行程序的话,图片加载是有问题的。路径不对。网上很多资料都是,把图片单独放到一个公共目录,然后写死路径。这样对于发布一个完整的游戏包是多么别扭的事情呢。所以,经过不断的尝试,终于解决了此问题。中间的种种弯路,。。。,继续正确的步骤。
11.先将图片目录移动到资源目录
C:\data\android-project-sdl\assets\icon.bmp
12.编辑
C:\data\android-project-sdl\src\org\libsdl\app\SDLActivity.java
添加一个jni方法,用来传递AssetManager给底层
// Audio
protected static Thread mAudioThread;
protected static AudioTrack mAudioTrack;
// 你需要添加的函数--begin
public native void mySetAsset(AssetManager ass);
// Load the .so
static {
System.loadLibrary("SDL2");
System.loadLibrary("SDL2_image");
// System.loadLibrary("SDL2_mixer");
// System.loadLibrary("SDL2_net");
// System.loadLibrary("SDL2_ttf");
System.loadLibrary("main");
}
// 你需要添加的函数--end
// Setup
@Override
protected void onCreate(Bundle savedInstanceState) {
// Log.v("SDL", "onCreate()");
super.onCreate(savedInstanceState);
// 你需要添加的函数--begin
AssetManager assetManager = getAssets();
mySetAsset(assetManager);
// 你需要添加的函数--end
// So we can call stuff from static callbacks
mSingleton = this;
// Set up the surface
mSurface = new SDLSurface(getApplication());
mLayout = new AbsoluteLayout(this);
mLayout.addView(mSurface);
setContentView(mLayout);
}
13.编辑
C:\data\android-project-sdl\jni\src\Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := main
SDL_PATH := ../SDL
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
# Add your application source files here...
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
SDL_test_common.c \
testsprite2.c
LOCAL_SHARED_LIBRARIES := SDL2 SDL2_image
LOCAL_LDLIBS := -lGLESv1_CM -llog -landroid
include $(BUILD_SHARED_LIBRARY)
14.修改
C:\data\android-project-sdl\jni\src\testsprite2.c
一:
static int sprite_w, sprite_h;
static SDL_BlendMode blendMode = SDL_BLENDMODE_BLEND;
//你需要添加的函数--begin
static AAssetManager * pAAssetManager;
//你需要添加的函数--end
/* Number of iterations to move sprites - used for visual tests. */
/* -1: infinite random moves (default); >=0: enables N deterministic moves */
static int iterations = -1;
二:
/* Update the screen! */
SDL_RenderPresent(renderer);
}
//你需要添加的函数--begin
void Java_org_libsdl_app_SDLActivity_mySetAsset(JNIEnv* env, jclass tis,
jobject assetManager) {
pAAssetManager = AAssetManager_fromJava(env, assetManager);
}
//你需要添加的函数--end
int main(int argc, char *argv[]) {
int i, done;
SDL_Event event;
Uint32 then, now, frames;
Uint64 seed;
三:
static void quit(int rc) {
SDL_free(sprites);
SDL_free(positions);
SDL_free(velocities);
SDLTest_CommonQuit(state);
exit(rc);
}
//你需要添加的函数--begin
int LoadSprite(const char *file) {
int i;
SDL_Surface *temp;
JNIEnv* env = (JNIEnv*) SDL_AndroidGetJNIEnv();
jboolean iscopy;
jstring filename = (*env)->NewStringUTF(env, "icon.bmp");
const char *mfile = (*env)->GetStringUTFChars(env, filename, &iscopy);
AAsset* asset = AAssetManager_open(pAAssetManager, mfile,
AASSET_MODE_UNKNOWN);
if (asset != 0) {
off_t bufferSize = AAsset_getLength(asset);
SDL_Log("[%s][%d]file size:%d\n", __FILE__, __LINE__, bufferSize);
char *buffer = (char *) malloc(bufferSize + 1);
buffer[bufferSize] = 0;
int numBytesRead = AAsset_read(asset, buffer, bufferSize);
SDL_Log("[%s][%d]read numBytesRead:%d\n", __FILE__, __LINE__,
numBytesRead);
if (numBytesRead == bufferSize) {
SDL_RWops *src;
src = SDL_RWFromMem(buffer, bufferSize);
/* 将BMP文件加载到一个surface*/
temp = IMG_Load_RW(src, 1);
}
free(buffer);
AAsset_close(asset);
}
(*env)->ReleaseStringUTFChars(env, filename, mfile);
/* Load the sprite image */
if (temp == NULL) {
temp = SDL_LoadBMP(file);
}
if (temp == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s", file,
SDL_GetError());
return (-1);
}
//你需要添加的函数--end
sprite_w = temp->w;
sprite_h = temp->h;
SDL_Log("[%s][%d]sprite_w:%d sprite_h:%d\n", __FILE__, __LINE__, sprite_w,
sprite_h);
15.下载SDL2_image-2.0.0.zip
http://www.libsdl.org/projects/SDL_image/
http://skypark.cn/cocos2d/SDL2_image-2.0.0.zip
16.仿照SDL。在jni目录下创建一个SDL_image目录
cd /cygdrive/c/data/android-project-sdl/jni
cp /cygdrive/c/data/software/SDL2_image-2.0.0/SDL2_image-2.0.0 SDL_image -rf
chmod a+wr SDL_image/ -R
17.修改
C:\data\android-project-sdl\jni\SDL_image\Android.mk
SUPPORT_WEBP := false
18.大功告成,小米3真机测试: