第七章:全红屏幕2
今天阅读了部分SDL2的代码。原来,有了一点收获:
SDL2贴图
贴图方面,SDL1中,关于图片绘制,一切都是SDL_Surface.而SDL2中,使用的新对象:SDL_Window,SDL_Renderer,SDL_Texture
SDL_Surface:可以理解成贴画。而最底层的屏幕或者窗口,可以理解成最底层的贴画。一张张精灵图片也就是一个个小小的贴画。都可以贴在SDL_Surface上。
使用的函数是:
SDL_BlitSurface(SDL_Surface * src, const SDL_Rect * srcrect,SDL_Surface * dst, SDL_Rect * dstrect);
src:需要绘制的贴画(贴画A)
srcrect:贴画A中需要被绘制的区域。(null则全部绘制)
dst:贴画的目标(贴画B)
dstrect:贴画A贴在贴画B中的位置。(null表示从(0,0)贴起)
其他绘制函数:
SDL_FillRect:绘制矩形
SDL_Window:可以理解为屏幕或者窗口,但是不能在上面贴画。
SDL_Renderer:可以理解为贴画板,你可以在上面贴画。SDL_Renderer可以嵌入到SDL_Window中。
SDL_Texture:可以理解为贴画,可以贴在SDL_Renderer上面。
在SDL2中,SDL_Surface贴在SDL_Surface上,变成了SDL_Surface转换为SDL_Texture再贴在SDL_Renderer上。
SDL_RenderCopy(SDL_Renderer * renderer,SDL_Texture * texture,const SDL_Rect * srcrect,const SDL_Rect * dstrect)
取代了上面的SDL_BlitSurface
其他绘制函数:
SDL_RenderDrawPoint:绘制点
SDL_RenderDrawLine:绘制线
SDL_RenderDrawRect:绘制矩形
所有,做一个全红屏幕,也不需要之前那么复杂了。重新实现了一个简单的代码:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <dirent.h>
#include <jni.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
#include "SDL_config.h"
#include "SDL_test.h"
#include "SDL.h"
#include "SDL_image.h"
#include "../skypark_game/SkyparkLog.hpp"
#include "../skypark_game/SkyparkJni.hpp"
//SDL2,系统变量 --begin
extern int Android_ScreenWidth;
extern int Android_ScreenHeight;
extern Uint32 Android_ScreenFormat;
//SDL2,系统变量 --end
//定义我的全局变量 --begin
static SDL_Window * g_screen_window = NULL;
static SDL_Renderer* g_screen_renderer = NULL;
static skypark::SkyparkLog g_SkyparkLog;
static skypark::SkyParkJni g_SkyParkJni;
//定义我的全局变量 --end
//初始化
int skypark_sdl_init(char **argv) {
int iRet = SDL_Init(SDL_INIT_EVERYTHING);
if (iRet < 0) {
return -1;
}
g_screen_window = SDL_CreateWindow("skypark", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, Android_ScreenWidth, Android_ScreenHeight,
SDL_WINDOW_SHOWN);
if (g_screen_window == NULL) {
return -2;
}
g_screen_renderer = SDL_CreateRenderer(g_screen_window, -1,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (g_screen_renderer == NULL) {
return -3;
}
return 0;
}
void ShowScreen() {
sleep(1);
static Uint64 i = 0;
i++;
if (i % 10 == 0) {
g_SkyparkLog.log("[%s][%d]run...", __FILE__, __LINE__);
}
if (g_screen_renderer == NULL) {
return;
}
//设置颜色
SDL_SetRenderDrawColor(g_screen_renderer, 0xFF, 0x00, 0x00, 0xFF);
//以上面的颜色擦除
SDL_RenderClear(g_screen_renderer);
//将缓存刷新到实际屏幕
SDL_RenderPresent(g_screen_renderer);
}
#ifdef __cplusplus
extern "C" {
#endif
//jni接口 --begin
void Java_cn_skypark_sanguo_SanguoSDL_mySetAsset(JNIEnv* env, jclass tis,
jobject assetManager) {
AAssetManager * pAAssetManager = AAssetManager_fromJava(env, assetManager);
g_SkyParkJni.setAAssetManager(env, pAAssetManager);
}
//jni接口 --end
#ifdef __cplusplus
}
#endif
int main(int argc, char *argv[]) {
g_SkyparkLog.log("[%s][%d]begin w:%d h:%d f:%d", __FILE__, __LINE__,
Android_ScreenWidth, Android_ScreenHeight, Android_ScreenFormat);
int iRet = skypark_sdl_init(argv);
g_SkyparkLog.log("[%s][%d]skypark_sdl_init = %d", __FILE__, __LINE__, iRet);
SDL_Surface * pSDL_Surface = g_SkyParkJni.getPic("pic/bg.png");
if (pSDL_Surface == NULL) {
g_SkyparkLog.log("[%s][%d]pSDL_Surface = null", __FILE__, __LINE__);
exit(0);
}
g_SkyparkLog.log("[%s][%d]pic_w:%d pic_h:%d\n", __FILE__, __LINE__,
pSDL_Surface->w, pSDL_Surface->h);
while (true) {
//sleep(60);
//g_SkyparkLog.log("[%s][%d]run...", __FILE__, __LINE__);
ShowScreen();
}
g_SkyparkLog.log("[%s][%d]end", __FILE__, __LINE__);
return 0;
}