2015-11-13 113 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