//两份基本相同的代码,只不过一个用了vector,用了vector的代码输出不了中文,另一个/////简单的反而可以,这两个都可以直接运行的,
@twtfcu3 @DXKite @TTHHR @小牛_牛sky //都用的TTF_RenderUTF8_Blended这个函数
//1
#include <iostream>
#include <SDL2/SDL_ttf.h>
#include <vector>
#include <windows.h>
#include <SDL2/SDL_image.h>
using namespace std;
SDL_Texture* RenderText(std::string message, std::string fontFile,SDL_Color color, int fontSize);
void print_letter(vector<string> s9);
SDL_Renderer *ren=NULL;
SDL_Window*win=NULL;
SDL_Color color;
SDL_Texture *text=NULL,*tex=NULL;
int W=0,H=0;
vector<string>word={"你","hello","world","field"," ","of","good",
"time","chance","your","smooth","is","very","nice"};
int main(int argc,char**argv)
{
SDL_Init(SDL_INIT_VIDEO);
TTF_Init();
win=SDL_CreateWindow("test",0,0,800,850,SDL_WINDOW_SHOWN);
ren=SDL_CreateRenderer(win,-1,
SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC);
color={0,0,0};
SDL_RenderClear(ren);
SDL_GetWindowSize(win,&W,&H);
tex=IMG_LoadTexture(ren,"2.jpg");
SDL_RenderCopy(ren,tex,NULL,NULL);
SDL_RenderPresent(ren);
print_letter(word);
SDL_Delay(3000);
return 0;
}
void print_letter(vector<string> word)//输出文字
{
SDL_Rect post;
post.x=W/2-300;post.y=80;post.w=40;post.h=40;
int c=-1;const int ts=45;
for(auto it=word.begin();it!=word.end();++it){
++c;
text=RenderText(*it,"b.ttf",color,512);
if(post.x>(W/2+255))//换行
{
post.x=W/2-300;
post.y=post.y+25;
if(post.y>((H/25-1)*25+25))//跳页
{
vector<string> let_rest;
for(it=word.begin()+c;it!=word.end();++it)
let_rest.push_back(*it);
print_letter(let_rest);
}
}
SDL_RenderCopy(ren,text,NULL,&post);
cout<<*it<<endl;
SDL_RenderPresent(ren);
post.x=post.x+ts;
SDL_Delay(550);
}
Sleep(5000);
}
SDL_Texture* RenderText(std::string message, std::string fontFile,
SDL_Color color, int fontSize)
{
//Open the font
TTF_Font *font = nullptr;
font = TTF_OpenFont(fontFile.c_str(), fontSize);
//Render the message to an SDL_Surface, as that's what TTF_RenderText_X returns
SDL_Surface *surf = TTF_RenderUTF8_Blended(font, message.c_str(), color);
SDL_Texture *texture = SDL_CreateTextureFromSurface(ren, surf);
//Clean up unneeded stuff
SDL_FreeSurface(surf);
TTF_CloseFont(font);
return texture;
}
//2.
#include <SDL2/SDL.h>
#include <iostream>
#include <SDL2/SDL_ttf.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_image.h>
using namespace std;
SDL_Texture* RenderText(std::string message, std::string fontFile,
SDL_Color color, int fontSize);
SDL_Renderer *ren=NULL;
int main(int argc, char **argv)
{
SDL_Window *win =SDL_CreateWindow("test", 800, 80, 600, 600, SDL_WINDOW_SHOWN);
ren = SDL_CreateRenderer(win, -1,SDL_RENDERER_ACCELERATED |SDL_RENDERER_PRESENTVSYNC);
TTF_Init();
SDL_Rect pos;
pos.x=300,pos.y=300,pos.w=20,pos.h=20;
SDL_Color color = { 255, 255, 255 };
SDL_Texture *texture = RenderText("你","a.ttf",color,256);
SDL_RenderClear(ren);
SDL_RenderCopy(ren,texture,NULL,&pos);
SDL_RenderPresent(ren);
SDL_Delay(20000);
SDL_DestroyWindow(win);
SDL_DestroyRenderer(ren);
SDL_Quit();
return 0;
}
SDL_Texture* RenderText(std::string message, std::string fontFile,
SDL_Color color, int fontSize)
{
//Open the font
TTF_Font *font = nullptr;
font = TTF_OpenFont(fontFile.c_str(), fontSize);
//Render the message to an SDL_Surface, as that's what TTF_RenderText_X returns
SDL_Surface *surf = TTF_RenderUTF8_Blended(font, message.c_str(), color);
SDL_Texture *texture = SDL_CreateTextureFromSurface(ren, surf);
//Clean up unneeded stuff
SDL_FreeSurface(surf);
TTF_CloseFont(font);
return texture;
}