Question

Trying to create a game but i've run into my first hurdle. The game launches into a blank white screen instead of showing the Red screen and i cant proceed into the loading screen and the menu. I've checked that I'm using display for each of my screens but can't figure out where i'm going wrong. I also get no errors. Below is my code

game.cpp

#include "stdafx.h"
#include "Game.h"
#include "LoadScreen.h"
#include "MainMenu.h"


void Game::Start (void)
{
    Game game;
if(_gameState != Unlaunched)
    return;
game._mainWindow.create(sf::VideoMode(1024,768,32),"Code Matrix");
_gameState = Game::LogoScreen;

while (!Exists())
{
    GameLoop();
}
game._mainWindow.close();
}

bool Game::Exists()
{
    if(_gameState == Game::Exiting)
        return true;
    else
        return false;
}

void Game::GameLoop()
{
    Game game;
    sf::Event currentEvent;
    while (game._mainWindow.pollEvent(currentEvent))
    {
        switch (_gameState) 
        {
        case Game::MenuWindow:
            {
                ShowMenu();
                break;
            }
        case Game::LogoScreen:
            {
                ShowLogoScreen();
                break;
            }

        case Game::Playing:
            {
                sf::Event currentEvent;
                while (game._mainWindow.pollEvent(currentEvent))
                {
                game._mainWindow.clear(sf::Color(255,0,0));
                game._mainWindow.display();

                if(currentEvent.type == sf::Event::Closed) 
                    _gameState = Game::Exiting;
                if(currentEvent.type == sf::Event::KeyPressed)
                {
                    if(currentEvent.key.code == sf::Keyboard::Escape) ShowMenu();
                }
                }
                break;
            }
        }
    }
}

void Game::ShowLogoScreen()
{
    Game game;
    LoadScreen loadScreen;
    loadScreen.Show(game._mainWindow);
    _gameState = Game::MenuWindow; 
}

void Game::ShowMenu()
{
Game game;
MainMenu mainMenu;
MainMenu::MenuOption option = mainMenu.show(game._mainWindow);
switch(option)
{
case MainMenu::Exit:
    _gameState = Game::Exiting;
    break;
case MainMenu::Play:
    _gameState = Game::Playing;
    break;
}
}
Game::GameState Game::_gameState = Unlaunched;

LoadScreen.cpp

#include "stdafx.h"
#include "LoadScreen.h"

void LoadScreen::Show(sf::RenderWindow & renderWindow)
{
    sf::Texture image;
    if (image.loadFromFile("images/LoadingScreen.png") !=true)
    {
        return;
    }

    sf::Sprite sprite (image);

    renderWindow.draw(sprite);
    renderWindow.display();

    sf::Event event;
    while (true)
    {
        while (renderWindow.pollEvent(event))
        {
            if(event.type == sf::Event::EventType::KeyPressed
                ||event.type == sf::Event::EventType::MouseButtonPressed
                || event.type == sf::Event::EventType::Closed)
            {
                return;
        }
    }
}
}

MainMenu.cpp

#include "stdafx.h"
  #include "MainMenu.h"


  MainMenu::MenuOption MainMenu::show(sf::RenderWindow& window)
  {

    //Load menu image from file
    sf::Texture image;
   image.loadFromFile("images/MainMenu.png");
   sf::Sprite sprite(image);

   //Setup clickable regions 
   //Play menu item coordinates
   MenuItem playButton;
   playButton.rect.top= 319;
   playButton.rect.height = 626;
   playButton.rect.left = 189;
   playButton.rect.width = 329;
   playButton.action = Play;

   //Options menu item coordinates
   MenuItem optionButton;
   optionButton.rect.left = 356;
   optionButton.rect.height = 596;
   optionButton.rect.top = 287;
   optionButton.rect.width = 483;
   optionButton.action = Options;

   //Exit menu item coordinates
   MenuItem exitButton;
   exitButton.rect.left = 554;
   exitButton.rect.height = 580;
   exitButton.rect.top = 318;
   exitButton.rect.width = 687;
   exitButton.action = Exit;



   _menuItems.push_back(playButton);
   _menuItems.push_back(exitButton);

   window.draw(sprite);
   window.display();

   return GetMenuAction(window);
 }

 MainMenu::MenuOption MainMenu::HandleClick(int x, int y)
 {
   std::list<MenuItem>::iterator it;

   for ( it = _menuItems.begin(); it != _menuItems.end(); it++)
   {
     sf::Rect<int> menuItemRect = (*it).rect;
     if( menuItemRect.height > y 
       && menuItemRect.top < y 
       && menuItemRect.left < x 
       && menuItemRect.width > x)
       {
         return (*it).action;
       }
   }

   return null;
 } 
 MainMenu::MenuOption  MainMenu::GetMenuAction(sf::RenderWindow& window)
 {
   sf::Event menuEvent;

   while(true)
   {

     while(window.pollEvent(menuEvent))
     {
         if(menuEvent.type == sf::Event::MouseButtonPressed)
       {
           return HandleClick(menuEvent.mouseButton.x,menuEvent.mouseButton.y);
       }
       if(menuEvent.type == sf::Event::Closed)
       {
         return Exit;
       }
     }
   }
 }
Was it helpful?

Solution

void Game::ShowLogoScreen()
{
    Game game; // <- this creates a NEW game. You want to use your already created game.
    LoadScreen loadScreen;
    loadScreen.Show(game._mainWindow);
    _gameState = Game::MenuWindow; 
}

You create a new game local to the logo screen. That one probably does not even own a window. You should reference your existing game variable.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top