TTF_RenderText_ Solid не работает должным образом и ломает мое окно SDL. Я ожидаю увидеть звезду и какой-нибудь текст с надписью «Hello World!», Но вместо этого у меня просто пустое окно.
Без TTF_RenderText_Solid * ![The Normal output when I don't have the TTF_RenderText_Solid](https://i.stack.imgur.com/e2C60.png)
С TTF_RenderText_Solid ![enter image description here](https://i.stack.imgur.com/iOycg.png)
Мой код: Game.h
#ifndef GAME_H_
#define GAME_H_
#include <iostream>
#include "SDL.h"
#include "SDL_ttf.h"
#include "../../object.h"
using namespace std;
class Game {
public:
Game();
~Game();
void loop();
void update();
void render();
void input();
void draw(GameObject o);
private:
SDL_Renderer *renderer;
SDL_Window *window;
bool running;
int count;
int frameCount, timerFPS, lastFrame;
GameObject star;
};
#endif /* GAME_H_ */
Game. cpp
#include "Game.h"
Game::Game() {
SDL_Init(0);
SDL_CreateWindowAndRenderer(360, 240, 0, &window, &renderer);
SDL_SetWindowTitle(window, "First Game!");
SDL_bool resizeable = SDL_TRUE;
SDL_SetWindowResizable(window, resizeable);
IMG_Init(0);
TTF_Init();
running = true;
count = 0;
star.setDest(0, 0, 75, 71); // Can stretch things out
star.setSource(0, 0, 75, 71); // Can do some weird stuff
star.setImage("../assets/star.jpg", renderer);
loop();
}
Game::~Game() {
TTF_Quit();
IMG_Quit();
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
void Game::loop() {
while (running) {
lastFrame = SDL_GetTicks();
static int lastTime;
if (lastFrame >= (lastTime+1000)) {
lastTime = lastFrame;
frameCount = 0;
count++;
}
render();
input();
update();
if (count > 3) running = false;
}
}
void Game::render() {
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_Rect rect;
rect.x = rect.y = 0;
rect.w = 360;
rect.h = 240;
SDL_RenderFillRect(renderer, &rect);
draw(star);
SDL_Color color;
color.r = 0, color.g = 255, color.b = 0, color.a = 255;
TTF_Font* font = TTF_OpenFont("regular-sans.ttf", 24);
TTF_RenderText_Solid(font, "Hello World!", color);
frameCount++;
int timerFPS = SDL_GetTicks() - lastFrame;
if (timerFPS < (1000/60)) SDL_Delay(1000/60-timerFPS);
SDL_RenderPresent(renderer);
}
void Game::input() {};
void Game::update() {};
void Game::draw(GameObject o) {
SDL_Rect dest = o.getDest();
SDL_Rect src = o.getSource();
SDL_RenderCopyEx(renderer, o.getTexture(), &src, &dest, 0, NULL, SDL_FLIP_NONE);
}
Если вы интересно, что такое GameObject: object.h
#ifndef OBJECT_H_
#define OBJECT_H_
#include <iostream>
#include "SDL.h"
#include "SDL_image.h"
class GameObject {
private:
SDL_Rect dest;
SDL_Rect src;
SDL_Texture* texture;
public:
GameObject() {}
SDL_Rect getDest() { return dest; }
SDL_Rect getSource() { return src; }
SDL_Texture* getTexture() { return texture; }
void setDest(int x, int y, int w, int h);
void setSource(int x, int y, int w, int h);
void setImage(std::string filename, SDL_Renderer* renderer);
};
#endif /* OBJECT_H_ */
object. cpp
#include "object.h"
void GameObject::setDest(int x, int y, int w, int h) {
dest.x = x;
dest.y = y;
dest.w = w;
dest.h = h;
}
void GameObject::setSource(int x, int y, int w, int h) {
src.x = x;
src.y = y;
src.w = w;
src.h = h;
}
void GameObject::setImage(std::string filename, SDL_Renderer* renderer) {
SDL_Surface* surf = IMG_Load(filename.c_str());
texture = SDL_CreateTextureFromSurface(renderer, surf);
}
Наконец, main. cpp
#include "include/Game/Game.h"
int main(int argc, char* argv[]) {
Game game;
return 0;
}
Я использую SDL 2.0.12, SDL_TTF 2.0.15 и SDL_image 2.0.5. Кроме того, мой компилятор mingw, а моя IDE - Eclipse.