如何使此列表有效

时间:2017-08-13 02:06:45

标签: c++ vector iostream

我正试图通过使用六边形来制作一个简单的游戏。但是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

1 个答案:

答案 0 :(得分:0)

显然,N代表零,因为在代码的开头,无论何时调用它都会获得行数而不是刷新!