c++ - 如何使用 SDL2 和 SDL_RenderFillRect 渲染矩形?
问题描述
我一直在尝试将 pong 克隆作为第一个 c++“大”项目,我遇到了几个问题。首先,这是我到目前为止的代码:
游戏.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;
}
}
乒乓球.cpp:
#include "game.hpp"
int main()
{
Game game;
game.run();
return 0;
}
现在,当我尝试渲染矩形时,它们不会出现。所以我试图删除它们,只在屏幕上渲染颜色。
在 SDL_RenderClear 之前和之后,我都写道:
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
但是无论我怎么尝试,窗口仍然显示为黑色。
我可能做错了什么?
解决方案
要制作一个填充的 Rect,您必须创建一个 rect 对象:SDL_Rect MyRectName
,将其值设置为您想要的任何值:MyRectName.(w,h,x,y) = MyValue
,然后渲染,运行SDL_RenderFillRect(MyRenderer, MyRectName);
。
推荐阅读
- python - IBM-Watson Text to Speech 引发“403:Forbidden”错误
- html - HTML水平规则是否有等效的Unicode字符
/ - javascript - 从 vuejs 中的内容获取 dom
- node.js - 如何将来自容器的所有流量路由到同一个 Kubernetes pod 中的另一个容器?
- django - 在一个迁移文件(Django)中混合数据和模式迁移?
- html - 绝对位置上的“top:0px”问题
- react-native - 如何使用expo react native通过pdf / doc / image / xls等api上传文件
- python - model.fit 给出 ValueError :检查输入时出错:预期的 conv2d 得到了形状为 () 的数组
- r - 如何将函数映射到列表中每个数据框的每一行?
- r - 根据行值有条件地创建新列