2017-08-13 17 views
-6

我想通過使用六邊形做一個簡單的遊戲。然而,由於某種原因,std :: vector不起作用。它應該創建一個列表,但它只是NULL?它的起源應該做的是添加trapazoids來創建一個軌道。從那時起,它的大部分相機移動。我目前使用一個名爲的附加組件SFML,它主要用於創建像openGL這樣的圖像。我如何使這個列表工作

/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
#include <SFML\Graphics.hpp>   
#include <iostream> 
/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
using namespace sf; 

int width = 1024; 
int height = 768; 
char title[] = "Racing"; 

int roadW = 2000; 
int segL = 200;    //segment length 
float camD = 0.84;   //camera debth 

int update(RenderWindow &w); 
void drawQuad(RenderWindow &w, Color c, int x1, int y1, int w1, int x2, int y2, int w2); 

/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
struct Line 
{ 
    float x, y, z;   //segment length 
    float X, Y, W;   //screen cordinates 
    float scale; 

    Line() { x = y = z = 0; } 

    //from world to screen coordinates 
    void project(int camx, int camy, int camz) 
    { 
     scale = camD/(z - camz); 
     X = (1 + scale*(x - camx))*width/2; 
     Y = (1 - scale*(y - camx))*height/2; 
     W = scale * roadW * width/2; 

    } 
}; 


std::vector<Line> lines; //main track 
int N = lines.size(); 

/////////////////////////////////////////////////////////////////////////////////////////////////////////// 
int main() 
{ 
    std::cout << "Starting up... \n"; 
    std::cout << "Creating RenderWindow...(VideoMode(" << width << "," << height << "), " << title << "\n"; 
    RenderWindow window(VideoMode(width, height), title); 
    window.setFramerateLimit(60); 

    std::cout << "Creating std::vector<Lines> lines... \n"; 

    for (int i = 0; i < 1600; i++) 
    { 
     Line line; 
     line.z = i*segL; 
     lines.push_back(line); 
    } 

    std::cout << "Total Length[" << N << "]\n"; 

    std::cout << "\nRunning...\n"; 
    while (window.isOpen()) 
    { 
     if (update(window) != 0) return 0; 
    } 

    return 0; 
} 

int update(RenderWindow &w) 
{ 
    ///│LOGIC//// 
    ///└EVENTS/// 
    Event e; 
    while (w.pollEvent(e)) 
    { 
     if (e.type == Event::Closed) return 1; 
    } 

    ///│RENDER/// 
    ///├CLEAR//// 
    ///├ROAD///// 
    ///└CLEAR//// 
    w.clear(); 

    for (int n = 0; n < 300; n++) 
    { 
     Line &l = lines[n%N]; 
     l.project(0, 1500, 0); 

     Color grass = (n/3) % 2 ? Color(16, 200, 16) : Color(0, 154, 0); 
     Color rumble = (n/3) % 2 ? Color(255, 255, 2555) : Color(0, 0, 0); 
     Color road = (n/3) % 2 ? Color(107, 107, 107) : Color(105, 105, 105); 

     Line p = lines[(n - 1) % N]; 

     drawQuad(w, grass, 0, p.Y, width, 0, l.Y, width); 
     drawQuad(w, rumble, p.X, p.Y, p.W*1.2, l.X, l.Y, l.W*1.2); 
     drawQuad(w, road, p.X, p.Y, p.W, l.X, l.Y, l.W); 
    } 

    w.display(); 

    return 0; 
} 

void drawQuad(RenderWindow &w, Color c, int x1, int y1, int w1, int x2, int y2, int w2) 
{ 
    ConvexShape shape(4); 
    shape.setFillColor(c); 
    shape.setPoint(0, Vector2f(x1 - w1, y1)); 
    shape.setPoint(1, Vector2f(x2 - w2, y2)); 
    shape.setPoint(2, Vector2f(x2 + w2, y2)); 
    shape.setPoint(3, Vector2f(x1 + w1, y1)); 

    w.draw(shape); 
} 

感謝 -Logan

+2

你的'lines'不能是NULL,因爲它不是一個指針。如果你指的是這個'std :: cout <<「總長度[」<< N <<「] \ n」;'然後看看你初始化'N'的位置。 –

+0

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO –

回答

0

顯然,N代表零,因爲在代碼的開始,它得到的行數不只要你把它刷新!