1
我正在寻找使用SDL在另一个广场周围移动一个正方形。我循环了一系列值并将值用作我矩形之一的位置。我有另一个矩形是静止的,每当我循环时,我现在都会重新渲染一个固定的矩形,但是我想消除这个矩形,因为我知道效率不高。如何在C++中使用SDL2.0在屏幕上移动矩形?
#include "render.h"
#include "SDL2/SDL.h"
#include <iostream>
#include <fstream>
using namespace std;
const string FILE_NAME = "Orbit.txt";
const int WINDOW_WIDTH = 1280;
const int WINDOW_HEIGHT = 800;
const int SUN_LENGTH = 40;
const int EARTH_LENGTH = 20;
int main() {
//Initialize SDL
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *window;
SDL_Renderer *renderer;
window = SDL_CreateWindow(
"test", //title
SDL_WINDOWPOS_CENTERED, //initial x position
SDL_WINDOWPOS_CENTERED, //initial y position
WINDOW_WIDTH, //width
WINDOW_HEIGHT, //height
0 //flags
);
if (window == NULL) {
// In the case that the window could not be made...
printf("Could not create window: %s\n", SDL_GetError());
return 1;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
ifstream file;
file.open(FILE_NAME);
//Prepare render loop
string trash;
string time;
double xPos;
double yPos;
int shorterEdge;
if (WINDOW_HEIGHT < WINDOW_WIDTH) {
shorterEdge = WINDOW_HEIGHT;
} else {
shorterEdge = WINDOW_WIDTH;
}
int numPixelsAU = (shorterEdge/2) - (EARTH_LENGTH/2) - 5;
SDL_Rect sun;
sun.x = ((WINDOW_WIDTH/2) - (SUN_LENGTH/2));
sun.y = ((WINDOW_HEIGHT/2) - (SUN_LENGTH/2));
sun.w = SUN_LENGTH;
sun.h = SUN_LENGTH;
SDL_Rect earth;
//Render loop
while (file >> trash >> time >> trash >> xPos >> trash >> yPos) {
//Clear previous render
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
//Render Sun
SDL_SetRenderDrawColor(renderer, 255, 255, 0, 255);
SDL_RenderDrawRect(renderer, &sun);
SDL_RenderFillRect(renderer, &sun);
//Render Earth
earth.x = ((sun.x + (SUN_LENGTH/2)) + (numPixelsAU*xPos) - (EARTH_LENGTH/2));
earth.y = ((sun.y + (SUN_LENGTH/2)) - (numPixelsAU*yPos) - (EARTH_LENGTH/2));
earth.w = EARTH_LENGTH;
earth.h = EARTH_LENGTH;
SDL_SetRenderDrawColor(renderer, 30, 144, 255, 255);
SDL_RenderDrawRect(renderer, &earth);
SDL_RenderFillRect(renderer, &earth);
SDL_RenderPresent(renderer);
SDL_Delay(50);
}
SDL_Delay(3000);
// Close and destroy the window
SDL_DestroyWindow(window);
// Clean up
SDL_Quit();
return 0;
}
对不起,应该已经明确。我不担心职位,这不是问题。该程序工作正常,但现在我每次在while循环中循环渲染太阳。有没有办法保持太阳呈现,但只有当我循环时才改变地球? –
现代图形硬件更喜欢绘制整个场景,而不是使用脏矩形之类的东西来保存屏幕的一部分。 – rlam12