TTF_RenderText_ Solid разбивает окно SDL - PullRequest
0 голосов
/ 11 апреля 2020

TTF_RenderText_ Solid не работает должным образом и ломает мое окно SDL. Я ожидаю увидеть звезду и какой-нибудь текст с надписью «Hello World!», Но вместо этого у меня просто пустое окно.

Без TTF_RenderText_Solid * The Normal output when I don't have the TTF_RenderText_Solid

С TTF_RenderText_Solid enter image description here

Мой код: 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.

...