从零开始-边学边做-塔防游戏-七彩三国(七)--SDL--全红屏幕2

第七章:全红屏幕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;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值