2017-08-12 2 views
1

Ich war ein einfaches Spiel Schlange zu machen, aber wenn ich versuchte, einen Teil meiner Schlange es ging zu 0,0 bewegt. Ich behalte alle Teile meiner Schlange in einem Vektor. Aber , wenn ich so etwas tunSFML - Vektor [0] .getPosition() 0 zurück

vector[0].getPosition() 
//(In my code: snakeParts[0].getPosition()) 

Es gibt nur 0,0. Ich bekomme auch keinen Fehler beim Kompilieren. Hier ist mein Code:

#include <SFML/Graphics.hpp> 
#include <iostream> 
#include <string> 
#include <unistd.h> 
#include <vector> 

using namespace std; 

sf::RenderWindow App(sf::VideoMode(854, 480), "Snake"); 
sf::RectangleShape snake; 
sf::RectangleShape snake2; 

vector<sf::RectangleShape> snakeParts; 

string movingDirection = "Right"; 

int updatePos() { 

    snakeParts[1].setPosition(snakeParts[0].getPosition()); //Where my problem lies 

    if (movingDirection == "Left") { 
     snake.move(-32,0); 
    } 
    else if (movingDirection == "Right") { 
     snake.move(32,0); 
    } 
    else if (movingDirection == "Up") { 
     snake.move(0,-32); 
    } 
    else if (movingDirection == "Down") { 
     snake.move(0,32); 
    } 
    //for (int i=0; i<snakeParts.size(); i++) { 
     //int target = snakeParts.size()-i; 
} 

int main() 
{ 
    snake.setSize(sf::Vector2f(32, 32)); 
    snake.setFillColor(sf::Color::Green); 
    snake2.setSize(sf::Vector2f(32, 32)); 
    snake2.setFillColor(sf::Color::Red); 
    snakeParts.push_back(snake); 
    snakeParts.push_back(snake2); 

    while (App.isOpen()) 
    { 
     sf::Event event; 
     while (App.pollEvent(event)) 
     { 
      if (event.type == sf::Event::Closed) 
       App.close(); 
      if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { 

       movingDirection = "Left"; 
      } 
      else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { 

       movingDirection = "Right"; 
      } 
      else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { 
       movingDirection = "Down"; 
      } 
      else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { 
       movingDirection = "Up"; 
      } 

     } 
     usleep(100000); 
     //cout << movingDirection << endl; 
     updatePos(); 
     App.clear(); 
     App.draw(snake); 
     App.draw(snake2); 
     App.display(); 
    } 

    return 0; 
} 

Ich denke, es ist etwas mit Zeigern zu tun ist? Aber ich würde nicht wissen, wie ich das beheben würde ...

Antwort

1

Dump diese globalen snakeN Variablen! Werden Sie alles bis zu snake100 deklarieren, wenn Sie 100 Zellen haben wollen? Ihr Vektor speichert Kopien (diese bleiben unberührt auf (0, 0)), auf denen Sie die gesamte Logik ausführen sollten.


Stellen Sie alle anderen globalen Variablen auf eine Funktion oder ein Mitglied einer Klasse lokalen und Funktionsparameter verwenden, wo nötig.

movingDirection sollte ein enum sein.

updatePos mit seiner aktuellen Signatur sollte return etwas.

+1

Danke es funktioniert auch danke für die extra beraten! –