2015-11-16 7 views
0

, поэтому я новичок в переполнении стека и программировании в целом, поэтому простите меня, если я сделаю или скажу что-нибудь откровенно глупое из невежества.Имея некоторые проблемы с представлениями в SFML

Итак, я пытался научиться использовать SFML недавно, и до сих пор все идет хорошо, но в последнее время я пытался запрограммировать движущуюся камеру. Позвольте мне показать вам мой код:

#include <SFML/Graphics.hpp> 
#include <SFML/Audio.hpp> 

#include <iostream> 
#include <cstdlib> 

using namespace std; 
using namespace sf; 

bool frame60 = true; 

void print(string inputText) { 
    bool consoleOn = true; 
    if(consoleOn == true) { cout << inputText; } 
} 

void start() { 
    sf::View view1; 
    view1.reset(sf::FloatRect(300, 200, 300, 200)); 
    view1.setCenter(0, 0); 

    RenderWindow window(VideoMode(1600, 900), "Test Game"); 
    window.setView(view1); 
    window.setKeyRepeatEnabled(false); 
    switch(frame60) { 
    case true: 
     window.setFramerateLimit(60); 
     break; 
    case false: 
     window.setFramerateLimit(30); 
     break; 
    default: 
     window.setFramerateLimit(60); 
     break; 
    } 

    Texture testure; 
    testure.loadFromFile("vsm.png"); 
    Sprite testsprite; 
    testsprite.setTexture(testure); 

    testsprite.setOrigin(0, 0); 

    float playerx = 0; 
    float playery = 0; 


    while(window.isOpen()) { 
     Event event; 
     while(window.pollEvent(event)) { 
      switch(event.type) { 
       //Making the window closable 
      case Event::Closed: 
       window.clear(); 
       window.close(); 
       break; 
      } 
     } 

     if(Keyboard::isKeyPressed(Keyboard::A)) { 
      playerx += 0.5; 
     } 
     if(Keyboard::isKeyPressed(Keyboard::D)) { 
      playerx -= 0.5; 
     } 

     testsprite.setOrigin(playerx, playery); 

     view1.setCenter(playerx, playery); 
     window.draw(testsprite); 
     window.display(); 
     window.clear(); 

     cout << playerx << endl; 
    } 
} 

int main() { 
    start(); 
    return 0; 
} 

(не против меня, используя Самодельный начинают функцию, что просто мне экспериментировать, чтобы получить лучшее представление о том, как использовать C++ в целом, как, вероятно, и в случае с. много ненужных частей этой программы, так как эта программа - всего лишь учебное упражнение.)

Итак, в основном, как вы можете видеть, у меня есть синий прямоугольник, который перемещается. Тем не менее, я хочу, чтобы камера следила за ним, поэтому в игровом цикле я показываю свое представление, чтобы установить его центр, где находится прямоугольник. Довольно простой. Проблема в том, что экран не перемещается. Я нажимаю левую и правую клавиши, которые я устанавливаю, и я все еще вижу, что окно перемещается по черному фону, когда, если вид следил за ним, он, казалось бы, не двигался вообще, и единственным доказательством того, что он движется, должно быть в моем окне консоли.

Что я делаю неправильно?

ответ

1

Если вы хотите внести изменения в вид окна, вы должны позвонить по телефону sf::RenderWindow::setView. Вы просто модифицируете view1, а не копию, которую хранят и используют sf::RenderWindow.

Reference

Я хотел бы сделать это обновление вида в дополнительном объеме, не загрязняет внешнюю сферу:

{ 
    sf::View view = window.getView(); // get the current view, view1 is not needed here 
    // modify the view 
    window.setView(view); 
} 
+0

Спасибо, вы очень помогли мне. – AxleRe

+0

Добро пожаловать. (не забудьте принять ответ) – LogicStuff

+0

@AxleRe Вы также должны прочитать [Tour] (http://stackoverflow.com/tour), если вы этого не сделали. Это поможет вам избежать плохих вопросов. Вам не нужно беспокоиться об этом, это вопрос выше среднего. – LogicStuff

Смежные вопросы