2015-11-13 30 views
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; 
} 

回答

0

我想你的问题是你应该如何计算才能绕太阳轨道地球的位置?

您将必须计算每个帧的posX和posY。假设每个渲染需要50毫秒(基于你使用的SDL_Delay),如果你想要一个完整的轨道需要3秒钟,你将不得不让地球每帧pi/30弧度。所以你的角度将从0开始,然后每帧增加pi/30。

POSX = COS(角)*半径

波西=罪(角)*半径

+0

对不起,应该已经明确。我不担心职位,这不是问题。该程序工作正常,但现在我每次在while循环中循环渲染太阳。有没有办法保持太阳呈现,但只有当我循环时才改变地球? –

+1

现代图形硬件更喜欢绘制整个场景,而不是使用脏矩形之类的东西来保存屏幕的一部分。 – rlam12