第四章: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真機測試: