從零開始-邊學邊做-塔防遊戲-七彩三國(四)--SDL集成

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









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章