在上一篇文章我们知道了如何在android使用SDL2.0来渲染显示一张png图,而且在上上一篇我们知道如何使用sdl来渲染输出bmp图,那么sdl是否可以渲染输出自己喜爱的字体库的字体呢?答案是当然可以。

我们需要移植SDL_ttf字体库来支持相应的字体的渲染输出。

一、移植SDL_ttf库:

使用如下命令,从SDL Mercurial获取SDL_image的源码:

hg clone https://hg.libsdl.org/SDL_ttf/

SDL_ttf拷贝到在上一篇文章中的android-project\jni\下,将平台相关的代码去掉以及自动自动化相关的文件去掉,保留android相关的代码与文件。

二、在android中添加相关的引用:

修改android-project\jni\src\Android.mk,添加相关的引用:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := main

SDL_PATH := ../SDL
SDL_IMAGE_PATH := ../SDL2_image
SDL_TTF_PATH := ../SDL_ttf LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(SDL_IMAGE_PATH)
LOCAL_C_INCLUDES += $(LOCAL_PATH)/$(SDL_TTF_PATH) # Add your application source files here...
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
SDL_lesson.c LOCAL_SHARED_LIBRARIES := SDL2
LOCAL_SHARED_LIBRARIES += SDL2_image
LOCAL_SHARED_LIBRARIES += SDL2_ttf LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog include $(BUILD_SHARED_LIBRARY)

三、代码中引用相关的头文件:

/*
* SDL_lesson.c
* Clipping Sprite Sheets
* Created on: Aug 12, 2014
* Author: clarck
*/
#include <jni.h>
#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"
#include "SDL_logger.h"
#include "SDL_main.h"
#include "SDL_cleanup.h" //The attributes of the screen
const int SCREEN_WIDTH = ;
const int SCREEN_HEIGHT = ; struct SDL_Window *window = NULL;
struct SDL_Renderer *render = NULL; struct SDL_Texture *background = NULL;
struct SDL_Texture *image = NULL; struct SDL_Surface *surface = NULL;
struct SDL_Texture *texture = NULL;

四、加载图片的部分修改为IMG_LoadTexture:

* SDL_lesson.c
* Clipping Sprite Sheets
* Created on: Aug ,
* Author: clarck
*/
#include <jni.h>
#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"
#include "SDL_logger.h"
#include "SDL_main.h"
#include "SDL_cleanup.h" //The attributes of the screen
const int SCREEN_WIDTH = ;
const int SCREEN_HEIGHT = ; struct SDL_Window *window = NULL;
struct SDL_Renderer *render = NULL; struct SDL_Texture *background = NULL;
struct SDL_Texture *image = NULL; struct SDL_Surface *surface = NULL;
struct SDL_Texture *texture = NULL; /*
* Loads a image into a texture on the rendering device
* @param file The image file to load
* @param ren The renderer to load the texture onto
* @return the loaded texture, or NULL if something went wrong.
*/
SDL_Texture* loadTexture(const char *file, SDL_Renderer *render) {
struct SDL_Texture *texture = NULL; texture = IMG_LoadTexture(render, file); if (texture == NULL) {
LOGE("SDL_CreateTextureFromSurface failed %s", SDL_GetError());
} else {
LOGI("SDL_CreateTextureFromSurface successful.");
} return texture;
} /*
* Draw an SDL_Texture to an SDL_Renderer at position x, y, preserving
* the texture's width and height
* @param tex The source texture we want to draw
* @param ren The renderer we want to draw too
* @param x The x coordinate to draw too
* @param y The y coordinate to draw too
* @param w The width of the texture to draw
* @param h The height of the texture to draw
*/
void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, SDL_Rect dst,
SDL_Rect *clip) {
SDL_RenderCopy(ren, tex, clip, &dst);
} /*
* Draw an SDL_Texture to an SDL_Renderer at position x, y, preserving
* the texture's width and height and taking a clip of the texture if desired
* If a clip is passed, the clip's width and height will be used instead of the texture's
* @param tex The source texture we want to draw
* @param rend The renderer we want to draw too
* @param x The x coordinate to draw too
* @param y The y coordinate to draw too
* @param clip The sub-section of the texture to draw (clipping rect)
* default of nullptr draws the entire texture
*/
void renderTexture2(SDL_Texture *tex, SDL_Renderer *ren, int x, int y,
SDL_Rect *clip) {
SDL_Rect dst;
dst.x = x;
dst.y = y;
if (clip != NULL) {
dst.w = clip->w;
dst.h = clip->h;
} else {
SDL_QueryTexture(tex, NULL, NULL, &dst.w, &dst.h);
}
renderTexture(tex, ren, dst, clip);
}

五、添加字体渲染功能函数:

/*
* SDL_lesson.c
* Clipping Sprite Sheets
* Created on: Aug 12, 2014
* Author: clarck
*/
#include <jni.h>
#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"
#include "SDL_logger.h"
#include "SDL_main.h"
#include "SDL_cleanup.h" //The attributes of the screen
const int SCREEN_WIDTH = ;
const int SCREEN_HEIGHT = ; struct SDL_Window *window = NULL;
struct SDL_Renderer *render = NULL; struct SDL_Texture *background = NULL;
struct SDL_Texture *image = NULL; struct SDL_Surface *surface = NULL;
struct SDL_Texture *texture = NULL; /*
* Loads a image into a texture on the rendering device
* @param file The image file to load
* @param ren The renderer to load the texture onto
* @return the loaded texture, or NULL if something went wrong.
*/
SDL_Texture* loadTexture(const char *file, SDL_Renderer *render) {
struct SDL_Texture *texture = NULL; texture = IMG_LoadTexture(render, file); if (texture == NULL) {
LOGE("SDL_CreateTextureFromSurface failed %s", SDL_GetError());
} else {
LOGI("SDL_CreateTextureFromSurface successful.");
} return texture;
} /*
* Draw an SDL_Texture to an SDL_Renderer at position x, y, preserving
* the texture's width and height
* @param tex The source texture we want to draw
* @param ren The renderer we want to draw too
* @param x The x coordinate to draw too
* @param y The y coordinate to draw too
* @param w The width of the texture to draw
* @param h The height of the texture to draw
*/
void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, SDL_Rect dst,
SDL_Rect *clip) {
SDL_RenderCopy(ren, tex, clip, &dst);
} /*
* Draw an SDL_Texture to an SDL_Renderer at position x, y, preserving
* the texture's width and height and taking a clip of the texture if desired
* If a clip is passed, the clip's width and height will be used instead of the texture's
* @param tex The source texture we want to draw
* @param rend The renderer we want to draw too
* @param x The x coordinate to draw too
* @param y The y coordinate to draw too
* @param clip The sub-section of the texture to draw (clipping rect)
* default of nullptr draws the entire texture
*/
void renderTexture2(SDL_Texture *tex, SDL_Renderer *ren, int x, int y,
SDL_Rect *clip) {
SDL_Rect dst;
dst.x = x;
dst.y = y;
if (clip != NULL) {
dst.w = clip->w;
dst.h = clip->h;
} else {
SDL_QueryTexture(tex, NULL, NULL, &dst.w, &dst.h);
}
renderTexture(tex, ren, dst, clip);
} SDL_Texture* renderText(char *message, char *fontFile, SDL_Color color,
int fontSize, SDL_Renderer *renderer) {
//Open the font
TTF_Font *font = TTF_OpenFont(fontFile, fontSize); if (font == NULL) {
LOGE("renderText error: %s", SDL_GetError());
return NULL;
} surface = TTF_RenderText_Blended(font, message, color);
if (surface == NULL) {
TTF_CloseFont(font);
LOGE("TTF_RenderText_Blended error: %s", SDL_GetError());
return NULL;
} texture = SDL_CreateTextureFromSurface(renderer, surface);
if (texture == NULL) {
LOGE("SDL_CreateTextureFromSurface error: %s", SDL_GetError());
} //Clean up the surface and font
SDL_FreeSurface(surface);
TTF_CloseFont(font);
return texture;
}

六、编写主函数功能:

/*
* SDL_lesson.c
* Clipping Sprite Sheets
* Created on: Aug 12, 2014
* Author: clarck
*/
#include <jni.h>
#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"
#include "SDL_logger.h"
#include "SDL_main.h"
#include "SDL_cleanup.h" //The attributes of the screen
const int SCREEN_WIDTH = ;
const int SCREEN_HEIGHT = ; struct SDL_Window *window = NULL;
struct SDL_Renderer *render = NULL; struct SDL_Texture *background = NULL;
struct SDL_Texture *image = NULL; struct SDL_Surface *surface = NULL;
struct SDL_Texture *texture = NULL; /*
* Loads a image into a texture on the rendering device
* @param file The image file to load
* @param ren The renderer to load the texture onto
* @return the loaded texture, or NULL if something went wrong.
*/
SDL_Texture* loadTexture(const char *file, SDL_Renderer *render) {
struct SDL_Texture *texture = NULL; texture = IMG_LoadTexture(render, file); if (texture == NULL) {
LOGE("SDL_CreateTextureFromSurface failed %s", SDL_GetError());
} else {
LOGI("SDL_CreateTextureFromSurface successful.");
} return texture;
} /*
* Draw an SDL_Texture to an SDL_Renderer at position x, y, preserving
* the texture's width and height
* @param tex The source texture we want to draw
* @param ren The renderer we want to draw too
* @param x The x coordinate to draw too
* @param y The y coordinate to draw too
* @param w The width of the texture to draw
* @param h The height of the texture to draw
*/
void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, SDL_Rect dst,
SDL_Rect *clip) {
SDL_RenderCopy(ren, tex, clip, &dst);
} /*
* Draw an SDL_Texture to an SDL_Renderer at position x, y, preserving
* the texture's width and height and taking a clip of the texture if desired
* If a clip is passed, the clip's width and height will be used instead of the texture's
* @param tex The source texture we want to draw
* @param rend The renderer we want to draw too
* @param x The x coordinate to draw too
* @param y The y coordinate to draw too
* @param clip The sub-section of the texture to draw (clipping rect)
* default of nullptr draws the entire texture
*/
void renderTexture2(SDL_Texture *tex, SDL_Renderer *ren, int x, int y,
SDL_Rect *clip) {
SDL_Rect dst;
dst.x = x;
dst.y = y;
if (clip != NULL) {
dst.w = clip->w;
dst.h = clip->h;
} else {
SDL_QueryTexture(tex, NULL, NULL, &dst.w, &dst.h);
}
renderTexture(tex, ren, dst, clip);
} SDL_Texture* renderText(char *message, char *fontFile, SDL_Color color,
int fontSize, SDL_Renderer *renderer) {
//Open the font
TTF_Font *font = TTF_OpenFont(fontFile, fontSize); if (font == NULL) {
LOGE("renderText error: %s", SDL_GetError());
return NULL;
} surface = TTF_RenderText_Blended(font, message, color);
if (surface == NULL) {
TTF_CloseFont(font);
LOGE("TTF_RenderText_Blended error: %s", SDL_GetError());
return NULL;
} texture = SDL_CreateTextureFromSurface(renderer, surface);
if (texture == NULL) {
LOGE("SDL_CreateTextureFromSurface error: %s", SDL_GetError());
} //Clean up the surface and font
SDL_FreeSurface(surface);
TTF_CloseFont(font);
return texture;
} int main(int argc, char *argv[]) {
//char *filefolder = "/storage/sdcard0/";
char *filefolder = argv[]; char *font_temp = "sample.ttf";
char *image_temp = "image.png";
char *background_temp = "background.png";
LOGI("natvie_SDL %s", filefolder); char *background_file = (char*) malloc(
strlen(filefolder) + strlen(background_temp) + );
strcpy(background_file, filefolder);
strcat(background_file, background_temp);
LOGI("natvie_SDL background_file : %s", background_file); char *image_file = (char*) malloc(
strlen(filefolder) + strlen(image_temp) + );
strcpy(image_file, filefolder);
strcat(image_file, image_temp);
LOGI("natvie_SDL image_file : %s", image_file); char *font_file = (char*) malloc(
strlen(filefolder) + strlen(font_temp) + );
strcpy(font_file, filefolder);
strcat(font_file, font_temp);
LOGI("natvie_SDL font_file : %s", font_file); if (SDL_Init(SDL_INIT_EVERYTHING) != ) {
LOGE("SDL_Init failed %s", SDL_GetError());
return ;
} if (TTF_Init() != ) {
LOGE("TTF_Init failed %s", SDL_GetError());
SDL_Quit();
return ;
} window = SDL_CreateWindow("lesson5", , , SCREEN_WIDTH, SCREEN_HEIGHT,
SDL_WINDOW_SHOWN);
if (window == NULL) {
LOGE("SDL_CreateWindow failed %s", SDL_GetError());
TTF_Quit();
SDL_Quit();
return ;
} render = SDL_CreateRenderer(window, -,
SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (render == NULL) {
LOGE("SDL_CreateRenderer failed %s", SDL_GetError());
cleanup_window(window);
TTF_Quit();
SDL_Quit();
return ;
} SDL_Color color = { , , , }; image = renderText("TTF fonts are cool !", font_file, color, , render); if (image == NULL) {
cleanup_texture(image);
cleanup_render(render);
cleanup_window(window);
TTF_Quit();
SDL_Quit();
return ;
} //Clear the window
SDL_RenderClear(render); //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;
int x = SCREEN_WIDTH / - iW / ;
int y = SCREEN_HEIGHT / - iH / ; SDL_Event e;
int quit = ;
while (quit != ) {
//Read any events that occured, for now we'll just quit if any event occurs
while (SDL_PollEvent(&e)) {
//If user closes the window
if (e.type == SDL_QUIT) {
quit = ;
}
if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) {
quit = ;
}
} //Rendering
SDL_RenderClear(render); //Draw the image
renderTexture2(image, render, x, y, NULL);
SDL_RenderPresent(render);
}
//Destroy the various items
cleanup_texture(image);
cleanup_render(render);
cleanup_window(window);
IMG_Quit();
SDL_Quit(); return ;
}

七、修改SDLActivity,添加SDL_ttf动态库的load:

// 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");
}

运行截图:

[原]零基础学习SDL开发之在Android使用SDL2.0加载字体的更多相关文章

  1. [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图

    关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇 ...

  2. [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图

    关于如何移植SDL2.0到安卓上面来参考我的上一篇文章:[原]零基础学习SDL开发之移植SDL2.0到Android 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示. 博主的开发环境: ...

  3. [原]零基础学习SDL开发之在Android使用SDL2.0渲染PNG图片

    在上一篇文章我们知道了如何在android使用SDL2.0来渲染显示一张bmp图,但是如果是一张png或者一张jpg的图,那么还能显示成功么?答案是否定的 我们需要移植SDL_image库来支持除bm ...

  4. [原]零基础学习在Android进行SDL开发系列文章

    [原]零基础学习SDL开发之移植SDL2.0到Android [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 [原]零基础学习SDL开发之在Android使用SDL2.0显示 ...

  5. [原]零基础学习SDL开发之移植SDL2.0到Android

    在[原]SDL开发教程我们知道了如何在pc下使用SDL进行开发,在android上面是否一样可以使用呢?答案是肯定的. 下面我们进行移植SDL到Android,这里都是基于SDL最新版进行移植的,在E ...

  6. [原]零基础学习视频解码之android篇系列文章

    截止今天,<零基础学习视频解码系列文章>.<零基础学习在Android进行SDL开发系列文章>以及<零基础学习视频解码之android篇>系列文章基本算是告一段落了 ...

  7. [原]零基础学习视频解码之安装ffmpeg

    写在文章前面:ffmpeg是一个开源的编解码框架,拥有很强大的功能.但是对于如果使用其来做开发呈现着严重两极分化,大神们讨论着高深的问题,大多数像我这样的小白连门都进不去.最近无意间领会了如何入门,现 ...

  8. [原]零基础学习在Android进行SDL开发后记

    本着学习交流记录的目的编写了这个系列文章,主要用来记录如何从零开始学习SDL开发的过程,在这个过程中遇到了很多问题,差点就放弃了.首先是SDL的Android移植的时候遇到了比较坑的是SDL移植到An ...

  9. [原]零基础学习视频解码之seek

    现在,我们要添加一些功能,当你看不能倒带的电影,是不是很烦? 那么函数av_seek_frame功能看起来是多么赏心悦目. 我们将让左,右箭头来回走在影片中通过一个小的向上和向下箭头很多,其中“三多一 ...

随机推荐

  1. Unity游戏接入Steam成就

    在接入Steam成就,其实有些地方是有坑点的,而且steam官网给的是c++代码的接入教程.如果是老鸟的话,接入还并不是很难. 但是对于新手其实还是比较痛苦的,网上这方面的资料很少.这里我给总结下,u ...

  2. Ubuntu下伪分布式模式Hadoop的安装及配置

    1.Hadoop运行模式Hadoop有三种运行模式,分别如下:单机(非分布式)模式伪分布式(用不同进程模仿分布式运行中的各类节点)模式完全分布式模式注:前两种可以在单机运行,最后一种用于真实的集群环境 ...

  3. Django 入门项目案例开发(中)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. 昨天已经描述了如何搭建Django的开发环境,今天描述业务流程,具体我们要实现一个什么样的业务 ...

  4. Android OpenGL教程-第四课【转】

    第四课 旋转: 在这一课里,我将教会你如何旋转三角形和四边形.左图中的三角形沿Y轴旋转,四边形沿着X轴旋转. 我们增加两个变量来控制这两个对象的旋转.这两个变量加在程序的开始处其他变量的后面.它们是浮 ...

  5. 安装并开启ssh服务

    sudo yum install openssh*    安装 2. 设置 sudo vi /etc/ssh/sshd_config 首先先把port改掉port 52222 限制用户AllowUse ...

  6. java代码行数统计工具类

    package com.syl.demo.test; import java.io.*; /** * java代码行数统计工具类 * Created by 孙义朗 on 2017/11/17 0017 ...

  7. HTML5坦克大战(韩顺平版本)

    HTML5坦克大战(韩顺平版本) 2017-3-22 22:46:22 by SemiconductorKING 去年暑假学习了一下HTML5实现简单的坦克大战,觉得对JavaScript初学者来说, ...

  8. PowerShell 惠普打印机双面驱动自动设置已安装

    win10系统,使用实验室的HP P2055dn打印机.每次关机重连后,都会把默认的双面打印机的设置改回“未安装”,需要手动改成“已安装”.感觉是个bug,win7的时候关机后状态还会保持. 每次连上 ...

  9. ASP.NET MVC4 新手入门教程之一 ---1.介绍ASP.NET MVC4

    你会建造 您将实现一个简单的电影清单应用程序支持创建. 编辑. 搜索和清单数据库中的电影.下面是您将构建的应用程序的两个屏幕截图.它包括显示来自数据库的电影列表的网页: 应用程序还允许您添加. 编辑和 ...

  10. window.open()被浏览器拦截问题汇总

    一.问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多用户根本不知道发 ...