【问题标题】:How can I render a rectangle using SDL2 and SDL_RenderFillRect?如何使用 SDL2 和 SDL_RenderFillRect 渲染矩形?
【发布时间】:2021-09-13 18:04:29
【问题描述】:

我一直在尝试将 pong 克隆作为第一个 c++“大”项目,但遇到了几个问题。 首先,这是我目前的代码:

game.hpp:

#pragma once
#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>
#include <iostream>

class Game
{
public:
    Game();
    ~Game();

    // GAME VARIABLES
    const int WIDTH=720, HEIGHT=720, FONT_SIZE=32;
    int running, lastTime;
    int frameCount, timerFPS, lastFrame, fps;

    // GAME TOOLS
    SDL_Window *window;
    SDL_Renderer *renderer;
    TTF_Font *font;
    SDL_Color color;

    // GAME OBJECTS:
    SDL_Rect rPaddle, lPaddle, Ball, scoreBoard;

    // GAME FUNCTIONS:
    void initRects(); // AFTER YOU HAVE A WORKING VERSION, TRY TO MOVE TO CONSTRUCTOR
    void render();
    void run();
};

游戏.cpp:

#include "game.hpp"

Game::Game()
{
    running = 1;

    if(SDL_Init(SDL_INIT_EVERYTHING)<0)
        std::cerr << "SDL FAILED: SDL_INIT_EVERYTHING: " << SDL_GetError() << std::endl;
    if(SDL_CreateWindowAndRenderer(WIDTH, HEIGHT, 0, &window, &renderer)<0)
        std::cerr << "SDL FAILED: SDL_CreateWindowAndRenderer: " << SDL_GetError() << std::endl;
    TTF_Init();
    font = TTF_OpenFont("PreschoolBits.ttf", FONT_SIZE);
    color.r=color.g=color.b=255;
}

Game::~Game()
{
    TTF_CloseFont(font);
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();
}   

void Game::initRects()
{
    lPaddle.x=32; lPaddle.h=HEIGHT/5;
    lPaddle.y=(HEIGHT/2)-(lPaddle.h/2);
    lPaddle.w=12;
    rPaddle=lPaddle;
    rPaddle.x=WIDTH-rPaddle.w-32;
    Ball.w=Ball.h=16;
}

void Game::render()
{
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);
    frameCount++;
    timerFPS=SDL_GetTicks()-lastFrame;
    if(timerFPS<(1000/60))
        SDL_Delay(timerFPS<((1000/60)-timerFPS));

    SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0);
    SDL_RenderFillRect(renderer, &lPaddle);
    SDL_RenderFillRect(renderer, &rPaddle);
    SDL_RenderFillRect(renderer, &Ball);

    SDL_RenderPresent(renderer);
}


void Game::run()
{
    initRects();
    while(running)
    {
        lastFrame=SDL_GetTicks();
        if(lastFrame>=(lastTime+1000))
        {
            lastTime=lastFrame;
            fps=frameCount;
            frameCount=0;
        }

        render();
        SDL_Delay(2000);
        running=0;
    }
}

pong.cpp:

#include "game.hpp"

int main()
{
    Game game;

    game.run();
    return 0;
}

现在,当我尝试渲染矩形时,它们不会出现。所以我尝试删除它们,只在屏幕上渲染颜色。

在我写的 SDL_RenderClear 之前和之后:

SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);

但无论我怎么尝试,窗口仍然显示为黑色。

我做错了什么?

【问题讨论】:

  • "SDL_SetRenderDrawColor(..., ..., ..., ..., 0)"?您希望零 alpha 矩形是什么颜色?
  • 我也试过放 255 alpha 但仍然是黑色
  • 您需要适当的事件轮询,并且当环境要求您重绘或无条件重绘直到 2 秒超时时,您必须做出反应。

标签: c++ sdl-2


【解决方案1】:

要制作填充的 Rect,您必须创建一个 rect 对象:SDL_Rect MyRectName,将其值设置为您想要的任何值:MyRectName.(w,h,x,y) = MyValue,然后渲染,运行SDL_RenderFillRect(MyRenderer, MyRectName);

【讨论】:

  • 看来 OP 已经这样做了。 "这些默认为 0" 可能不是,因为SDL_Rect 是一个 C 结构,没有构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2012-05-25
  • 1970-01-01
  • 2021-12-20
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多