2017-02-21 5 views
0

Я пытаюсь создать простую игру SFML, в которой вы управляете автомобилем, и вам нужно уклоняться от предметов, которые падают с верхней части экрана. Когда я запускаю свою программу, он становится невосприимчивым, но когда я его закрываю, на экране нет сообщений об ошибках.SFML C++ Dodge Game Unresponsive

main.cpp:

#include <iostream> 
#include <SFML/Graphics.hpp> 
#include "Paddle.h" 
#include "Obstacle.h" 
using namespace sf; 
using namespace std; 

int main() 
{ 
RenderWindow gameDisplay(VideoMode(1336, 900), "Dodge"); 

bool GameOn = true; 

Texture player; 
if (!player.loadFromFile("SFML_game_car.png")) 
{ 

} 

Sprite playercar; 
playercar.setTexture(player); 
playercar.setPosition(200,700); 
playercar.setRotation(270); 

Texture obstacle1; 
if (!obstacle1.loadFromFile("obstacle.jpg")) 
{ 
    //error 
} 

Sprite firstwall; 
firstwall.setTexture(obstacle1); 


Obstacle1 obstacle1object; 
obstacle1object.obstacle1_spawn(firstwall, GameOn, gameDisplay); 



while (gameDisplay.isOpen()) 
{ 
    Event evnt; 
    while (gameDisplay.pollEvent(evnt)) 
    { 
     switch (evnt.type) 
     { 
     case Event::Closed: 
      gameDisplay.close(); 
     case Event::KeyPressed: 
      if (Keyboard::isKeyPressed(Keyboard::Q)) 
       gameDisplay.close(); 

     } 
    } 


    while (GameOn == true) 
    { 
     if (Keyboard::isKeyPressed(Keyboard::Right)) 
     { 
      Paddle paddlerightobject; 
      paddlerightobject.paddle_move_right(playercar); 
     } 

     if (Keyboard::isKeyPressed(Keyboard::Left)) 
     { 
      Paddle paddleleftobject; 
      paddleleftobject.paddle_move_left(playercar); 
     } 



     gameDisplay.clear(); 
     gameDisplay.draw(playercar); 
     gameDisplay.draw(firstwall); 
     gameDisplay.display(); 

    } 


} 

return 0; 
} 

Paddle.h

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

#pragma once 

class Paddle 
    { 
    public: 
    void paddle_move_right(Sprite &playercar) 
{ 
    if (playercar.getPosition().x < 1150) 
     playercar.move(0.3f, 0.0f); 
} 

void paddle_move_left(Sprite &playercar) 
{ 
    if (playercar.getPosition().x > 100) 
     playercar.move(-0.3f, 0.0f); 
    } 
}; 

Obstacle.h

#include <iostream> 
#include <SFML/Graphics.hpp> 
#include <cstdlib> 
#include <stdlib.h> 
#include <ctime> 
using namespace sf; 
using namespace std; 
int RandPosx; 
#pragma once 

class Obstacle1 
{ 
public: 
void obstacle1_spawn(Sprite &firstwall, bool &GameOn, RenderWindow &gameDisplay) 
{ 
    srand(time(0)); 
    RandPosx = (rand() % 300)+ 1; 
    cout << RandPosx << endl; 
    cout << firstwall.getPosition().y << endl; 
    firstwall.setPosition(300, 100); 

    while (firstwall.getPosition().y < 1000) 
    { 
     firstwall.move(0.0f, 0.5f); 
     if (firstwall.getPosition().y > 1000) 
     { 
      GameOn = false; 
      gameDisplay.close(); 
     } 
    } 



    } 
}; 
+1

Вы прошли через код с помощью отладчика? При очень наивном первом взгляде это выглядит так: 'while (GameOn == true)' никогда не бывает правдой, но я подозреваю, что вы легко найдете проблему, перешагнув код, пока не доберетесь до вас. – George

ответ

0

приложение никогда не вступит while (gameDisplay.pollEvent(evnt), так как это будет пропущена, когда начинается игра , и поскольку внутри while (GameOn == true) ничего нет, то устанавливает GameOn до false, приложение эффективно застревает внутри этого цикла. Таким образом, никакие события не могут быть опрошены, что вызывает невосприимчивость.

+0

ОК спасибо, я постараюсь исправить это :) –

+0

@JosephH Я рекомендую вам попробовать, что нужно делать в вашей программе в режиме отладки, как предложил Джордж в своем комментарии! –