从零开始-边学边做-塔防游戏-七彩三国(四)--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真机测试:









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值