diff --git a/sfml/main.cpp b/sfml/main.cpp index 2cc1075..d3e1c9b 100644 --- a/sfml/main.cpp +++ b/sfml/main.cpp @@ -4,8 +4,10 @@ #define SCREEN_HEIGHT 216 #define SCREEN_WIDTH 384 #define GET_POS(x) ((abs(x)+x)/2) +#define SEG_WIDTH 90 const float CH_H = 3; const float CH_W = 1.5; +float CH_HY = 1; //0->flat sf::Color gray = sf::Color(84, 90, 112); sf::Color lightgray = sf::Color(183, 187, 201); @@ -65,11 +67,19 @@ void gen_road(struct Road* road, float zm = 1) { road->segments[14] = seg(0, 180, 70, 90, 20, gray); road->segments[15] = seg(0, 178, 75, 90, 20, gray); /*pillar*/ - road->segments[16] = seg(-20, 185, 80, 130, 70, lightgray); - road->segments[17] = seg(-20, 138, 80, 47, 70, lightgray); - road->segments[18] = seg(63, 138, 80, 47, 70, lightgray); - road->segments[19] = seg(63, 117, 80, 47, 30, red); - road->segments[20] = seg(-20, 117, 80, 47, 30, red); + float s = SEG_WIDTH - 80 / CH_H; + float w31 = 155 * (s / SEG_WIDTH); + float h31 = 70 * (s / SEG_WIDTH); + float w30 = 90 * (s / SEG_WIDTH); + float y31 = 178+7; //yes i know simple arithmetics + float h32 = 30 * (s / SEG_WIDTH); + /*pillar*/ + road->segments[16] = seg((w31 - w30) / -2, y31, 80, 155, 70, lightgray); + road->segments[17] = seg((w31 - w30) / -2, y31 - h31, 80, 33, 70, lightgray); + road->segments[18] = seg(w30, y31-h31, 80, 33, 70, lightgray); + road->segments[19] = seg(w30, y31-h31-h32, 80, 33, 30, red); + road->segments[20] = seg((w31 - w30) / -2, y31-h31-h32, 80, 33, 30, red); + /*pillar*/ /*pillar*/ road->segments[21] = seg(0, 175, 80, 90, 20, gray); road->segments[22] = seg(0, 175, 80, 90, 20, gray); @@ -82,54 +92,39 @@ void gen_road(struct Road* road, float zm = 1) { road->segments[29] = seg(0, 190, 115, 90, 20, gray); road->segments[30] = seg(0, 190, 120, 90, 20, gray); /*pillar*/ - road->segments[31] = seg(-20, 197, 120, 127, 70, lightgray); - road->segments[32] = seg(-20, 160, 120, 57, 90, lightgray); - road->segments[33] = seg(50, 160, 120, 57, 70, lightgray); - road->segments[34] = seg(50, 139, 120, 57, 60, red); - road->segments[35] = seg(-20, 139, 120, 57, 60, red); + s = SEG_WIDTH - 120 / CH_H; + w31 = 155 * (s / SEG_WIDTH); + h31 = 70 * (s / SEG_WIDTH); + w30 = 90 * (s / SEG_WIDTH); + y31 = 190 + 7; //yes i know simple arithmetics + h32 = 30 * (s / SEG_WIDTH); + road->segments[31] = seg((w31-w30) / -2, y31, 120, 155, 70, lightgray); + road->segments[32] = seg((w31 - w30) / -2, y31 - h31, 120, 33, 70, lightgray); + road->segments[33] = seg(w30, y31 - h31, 120, 33, 70, lightgray); + road->segments[34] = seg(w30, (y31 - h31) - h32, 120, 33, 30, red); + road->segments[35] = seg((w31 - w30) / -2, (y31 - h31) - h32, 120, 33, 30, red); /*pillar*/ road->segments[36] = seg(0, 190, 125, 90, 20, gray); road->segments[37] = seg(0, 190, 130, 90, 20, gray); road->segments[38] = seg(0, 190, 135, 90, 20, gray); road->segments[39] = seg(0, 190, 140, 90, 20, gray); road->segments[40] = seg(0, 190, 145, 90, 20, gray); -} + } -int get_visible_segments(struct Road* road, struct Segment** tochange, float zm = 2) { - struct Segment* visible = (struct Segment*)malloc(road->height * sizeof(struct Segment)); - int visible_length = 0; - for (int v = 0; v <= road->height; v++) { - float s = road->segments[v].width - (v) * (zm); - float yoffset = road->segments[v].y - road->segments[v].z + road->playery; - float heightoffset = road->segment_height * (s / road->width); - if (yoffset > 0 && yoffset - heightoffset < SCREEN_HEIGHT) { - visible[visible_length] = road->segments[v]; - visible_length++; - } - } - *tochange = (struct Segment*) realloc(*tochange, sizeof(struct Segment) * visible_length); - for (int v = 0; v < visible_length; v++) { - (*tochange)[v] = visible[v]; - } - return visible_length; -} void draw_road(sf::RenderWindow* window, struct Road* road, float zm = 2) { int i = 0; - float s; - + float s, sy; for (int v = road->height - 1;v >= 0;v--) { //draws each rectangle from furthest to closest - int seg_width = 90; - s = seg_width - road->segments[v].z / CH_H; - float widthoffset = road->segments[v].width - road->segments[v].z / CH_H; - float heightoffset = road->segments[v].height * (s / seg_width); + s = SEG_WIDTH - road->segments[v].z / CH_H; + float widthoffset = road->segments[v].width * (s / SEG_WIDTH); + float heightoffset = road->segments[v].height * (s / SEG_WIDTH); + float xoffset = ((road->segments[v].x + SCREEN_WIDTH / 2) - s / 2) - road->playerx * s; + float yoffset = road->segments[v].y - road->segments[v].z * CH_HY + road->playery; sf::RectangleShape rs(sf::Vector2f(widthoffset, heightoffset)); //makes a rectangle of width s and height relative to z position rs.setFillColor(road->segments[v].colour); - //rs.setOutlineThickness(1); - //rs.setOutlineColor(sf::Color(250, 150, 100)); - float xoffset = ((road->segments[v].x + 192) - s / 2) - (road->playerx * s); //display x position of rectangle (based on z and x axis) - float yoffset = road->segments[v].y - road->segments[v].z + road->playery; //display y position of rectangle (based on z and y axis) + //float xoffset = ((road->segments[v].x + SCREEN_WIDTH/2) - s) - road->playerx * s; rs.setPosition(xoffset, yoffset); window->draw(rs); //displays the rectangle if (road->segments[v].colour == gray) { @@ -145,12 +140,12 @@ void draw_road(sf::RenderWindow* window, struct Road* road, float zm = 2) { int main() { sf::RenderWindow window(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT), "KraD"); struct Road road; - road.height = 41; road.playerx = 0; road.playery = 0; road.width = 100; road.starty = 160; road.segment_height = 30; + road.height = 41; road.segments = (struct Segment*)malloc(road.height * sizeof(struct Segment)); gen_road(&road, CH_H); //2nd param = change rate of height sf::Clock clock; @@ -187,16 +182,21 @@ int main() { } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) { - road.playery -= 300 * dt; + road.playery -= 100 * dt; //300 + CH_HY -= 5/3 * dt; } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) { - road.playery += 300 * dt; + road.playery += 100 * dt; + CH_HY += 5/3 * dt; } - else if (event.key.code == sf::Keyboard::F) { - struct Segment* visible = (struct Segment*)malloc(sizeof(struct Segment)); //only for initialization - int visible_len = get_visible_segments(&road, &visible, CH_H); - printf("%d", visible_len); + else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) + { + road.playery -= 300 * dt; + } + else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) + { + road.playery += 300 * dt; } window.clear(sf::Color(0, 191, 255)); draw_road(&window, &road, CH_W); //3rd param = change rate of width