SDL_image之hello

在这里我们将之前编译好的SDL_image和SDL等导入jni目录中,

整个目录涉及到vedio和audio的各种资源,待会上传

 

链接http://download.csdn.net/detail/u013571243/9186229

 

由于整个文件很大,所以推荐用eclipse来调试,从r20版本开始ndk的支持就很不错了,跟踪bug比较方便

由于我们不再eclipse中添加头文件的路径,我们只是在android,mk添加,所以eclipse会报错,不过是正常编译的,不过在打包时会进行规则检查会导致整个app无法发布到手机上,这里我们可以

 

下面我们解析代码

 

 

1.首先添加

#define LOGE(format, ...)  __android_log_print(ANDROID_LOG_ERROR,"JNITag",format, ##__VA_ARGS__)
#define LOGI(format, ...)  __android_log_print(ANDROID_LOG_INFO, "JNITag",format, ##__VA_ARGS__)

方便调试

 

2.

至于SDL的详细资料,推荐

http://adolfans.github.io/sdltutorialcn/blog/2013/01/28/lesson-3-sdl-extension-libraries/


3.这里我们只介绍

SDL_image的一个函数

SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());

SDL2是只支持BMP格式的图片的,我们这里把SDL2_image移植到案桌了,他支持

BMP,GIF,JPEG,LBM,PCX,PNG,PNM,TGA,TIFF,WEBP,XCF,XPM,XV

我们通过这个函数把图片渲染到屏幕中

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <SDL.h>
#include <SDL_image.h>
#include <android/log.h>   
#include <string>
#include <string.h>

const int SCREEN_WIDTH  = 480;
const int SCREEN_HEIGHT = 800;
const int TILE_SIZE = 40;


#define LOGE(format, ...)  __android_log_print(ANDROID_LOG_ERROR,"JNITag",format, ##__VA_ARGS__)
#define LOGI(format, ...)  __android_log_print(ANDROID_LOG_INFO, "JNITag",format, ##__VA_ARGS__)

SDL_Texture* loadTexture(const std::string &file,SDL_Renderer *ren)
{
	LOGI("file path: %s",file.c_str());
	SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());
	if (texture == NULL){
		LOGE("error: %s","LoadTexture");
	}
	return texture;
}

void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, int w, int h){
	//Setup the destination rectangle to be at the position we want
	SDL_Rect dst;
	dst.x = x;
	dst.y = y;
	dst.w = w;
	dst.h = h;
	SDL_RenderCopy(ren, tex, NULL, &dst);
}

void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y){
	int w, h;
	SDL_QueryTexture(tex, NULL, NULL, &w, &h);
	renderTexture(tex, ren, x, y, w, h);
}

int main(int argc, char *argv[])
{
	if(SDL_Init(SDL_INIT_VIDEO) != 0){
		LOGE("error: %s","init video error");
		return 1;
	}

	SDL_Window *window = SDL_CreateWindow("Lesson 3", 100, 100, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
	if (window == NULL){
		LOGE("error: %s","CreateWindow");
		SDL_Quit();
		return 1;
	}
	SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
	if (renderer == NULL){
		LOGE("error: %s","CreateRenderer");
		SDL_Quit();
		return 1;
	}

	SDL_Texture *background = loadTexture("/storage/sdcard0/background.png", renderer);
	SDL_Texture *image = loadTexture("/storage/sdcard0/image.png", renderer);
	//Make sure they both loaded ok
	if (background == NULL || image == NULL){
		SDL_Quit();
		return 1;
	}
	//A sleepy rendering loop, wait for 3 seconds and render and present the screen each time
	for (int i = 0; i < 3; ++i){
		//Clear the window
		SDL_RenderClear(renderer);

		//Determine how many tiles we'll need to fill the screen
		int xTiles = SCREEN_WIDTH / TILE_SIZE;
		int yTiles = SCREEN_HEIGHT / TILE_SIZE;

		//Draw the tiles by calculating their positions
		for (int i = 0; i < xTiles * yTiles; ++i){
			int x = i % xTiles;
			int y = i / xTiles;
			renderTexture(background, renderer, x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
		}

		//Draw our image in the center of the window
		//We need the foreground image's width to properly compute the position
		//of it's top left corner so that the image will be centered
		int iW, iH;
		SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
		int x = SCREEN_WIDTH / 2 - iW / 2;
		int y = SCREEN_HEIGHT / 2 - iH / 2;
		renderTexture(image, renderer, x, y);

		//Update the screen
		SDL_RenderPresent(renderer);
		//Take a quick break after all that hard work
		SDL_Delay(1000);
	}
	//Destroy the various items

	SDL_DestroyWindow(window);
	SDL_DestroyRenderer(renderer);
	SDL_DestroyTexture(background);
	SDL_DestroyTexture(image);
	IMG_Quit();
	SDL_Quit();
    exit(0);
}


效果

 




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值