-
hi,
i am working on a 2D shooter. As i wanted to rework the code because its just spaghetti, i caused an error i cant fix myself and hope that someone of you guys can help me ;)
i will post the code that i think will be relevant for solving the issue. if you need something more, please tell me.
//main.cpp
#include "Game.h"
int main()
{
Game pew;
pew.ChangeState(Game::gameStates::MAINMENU);
pew.Run();
return 0;
}
//Game.h
#ifndef GAME_H
#define GAME_H
#include <iostream>
#include <memory>
#include "GameState.h"
#include "MainMenuState.h"
#include "PlayState.h"
#include "Intro.h"
class Game
{
public:
Game();
~Game();
enum class gameStates{ MAINMENU, INTRO, SETTINGS, PLAY, GRAPHICSET, SOUNDSET, DIFFSET, COOPSET, HIGHSCORE };
void Run();
void ChangeState(gameStates newState);
bool isRunning(){ return running; };
void setRunning(bool mRunning);
sf::RenderWindow window;
private:
void Quit();
void Update();
void HandleEvents();
void Render();
std::unique_ptr<GameState> CurrentState;
bool running;
};
#endif
//Game.cpp
#include "Game.h"
Game::Game()
{
running = true;
window.create(sf::VideoMode(800, 600), "Pew");
window.setFramerateLimit(60);
window.setVerticalSyncEnabled(true);
}
Game::~Game()
{
CurrentState = nullptr;
}
void Game::Run()
{
while (running)
{
Update();
HandleEvents();
Render();
Quit();
}
}
void Game::ChangeState(gameStates newState)
{
switch (newState)
{
case gameStates::MAINMENU:
CurrentState = std::move(std::unique_ptr<MainMenuState>(new MainMenuState));
break;
case gameStates::PLAY:
CurrentState = std::move(std::unique_ptr<PlayState>(new PlayState));
break;
case gameStates::INTRO:
CurrentState = std::move(std::unique_ptr<Intro>(new Intro));
break;
}
}
void Game::setRunning(bool mRunning)
{
running = mRunning;
}
void Game::Quit()
{
if (!running)
window.close();
}
void Game::Update()
{
CurrentState->Update(*this);
}
void Game::HandleEvents()
{
CurrentState->HandleEvents(*this);
}
void Game::Render()
{
window.clear();
CurrentState->Render(*this);
window.display();
}
//MainMenuState.h
#ifndef MAINMENUSTATE_H
#define MAINMENUSTATE_H
#include "Game.h"
#include "MenuSfx.h"
#include "IOstuff.h"
class MainMenuState : public GameState
{
public:
MainMenuState();
~MainMenuState();
void HandleEvents(Game &game);
void Update(Game &game);
void Render(Game &game);
private:
IOsound iosound;
MenuSound sound;
bool playing;
float speed;
float elapsedTime;
float x_movement;
float y_movement;
float x, y;
short int debauch;
short int selection;
int volume;
sf::Event *pEvent;
sf::Clock *pClock;
sf::Texture *texture;
sf::Sprite *sprite;
Background bg;
Text play, again, settings, close;
};
#endif
//MainMenuState.cpp
#define PI 3.14159
#include "MainMenuState.h"
#include <cmath>
MainMenuState::MainMenuState()
{
bg.setFilePath("graphics//core//menu.png");
//sound & music
sound.LoadSoundBuffer();
sound.setBuffer(volume);
playing = false;
speed = 0.5;
selection = 0;
iosound.ReadSoundSettings(volume);
pEvent = new sf::Event;
pClock = new sf::Clock;
texture = new sf::Texture;
sprite = new sf::Sprite;
//Enemy
elapsedTime = 0;
x_movement = 0;
y_movement = 0;
debauch = 200;
texture->loadFromFile("graphics//enemies//enemy.png");
texture->setSmooth(false);
sprite->setTexture(*texture);
sprite->setOrigin(36.5, 35);
//buttons
play.setStringAndSize("play", 70);
again.setStringAndSize("again", 70);
settings.setStringAndSize("settings", 70);
close.setStringAndSize("close", 70);
play.setPosition(270, 150);
again.setPosition(270, 150);
settings.setPosition(270, 250);
close.setPosition(270, 350);
}
MainMenuState::~MainMenuState()
{
delete pEvent;
delete pClock;
delete sprite;
delete texture;
pEvent = nullptr;
pClock = nullptr;
sprite = nullptr;
texture = nullptr;
}
void MainMenuState::HandleEvents(Game &game)
{
while (game.window.pollEvent(*pEvent))
{
if (pEvent->type == sf::Event::Closed)
game.setRunning(false);
//Keyboard selection
if (pEvent->type == sf::Event::KeyPressed)
{
switch (pEvent->key.code)
{
case sf::Keyboard::Up:
if (selection > 0)
{
selection -= 1;
sound.PlaySound("select");
}
else
selection = 0;
break;
case sf::Keyboard::Down:
if (selection < 2)
{
selection += 1;
sound.PlaySound("select");
}
else
selection = 2;
break;
case sf::Keyboard::Return:
if (selection == 0)
{
if (playing)
game.ChangeState(Game::gameStates::PLAY);
else
playing = true;
game.ChangeState(Game::gameStates::INTRO);
}
else if (selection == 1)
game.ChangeState(Game::gameStates::SETTINGS);
else
game.setRunning(false);
break;
default:
break;
}
}
}
}
void MainMenuState::Update(Game &game)
{
if (selection == 0)//Spielen
{
play.setColor(sf::Color(255, 128, 0));
again.setColor(sf::Color(255, 128, 0));
settings.setColor(sf::Color(255, 255, 255));
close.setColor(sf::Color(255, 255, 255));
}
else if (selection == 1)//Settings
{
play.setColor(sf::Color(255, 255, 255));
again.setColor(sf::Color(255, 255, 255));
settings.setColor(sf::Color(255, 128, 0));
close.setColor(sf::Color(255, 255, 255));
}
else//Beenden
{
play.setColor(sf::Color(255, 255, 255));
again.setColor(sf::Color(255, 255, 255));
settings.setColor(sf::Color(255, 255, 255));
close.setColor(sf::Color(255, 128, 0));
}
//moving enemy
elapsedTime = pClock->restart().asMilliseconds();
x_movement += elapsedTime;
y_movement += elapsedTime;
y = sprite->getPosition().y;
x = sprite->getPosition().x;
y = 300 + std::sin((y_movement * PI) / 180) * debauch;
x = 400 + std::cos((x_movement * PI) / 180) * debauch;
if (x_movement > 360)
x_movement = 0;
if (y_movement > 360)
y_movement = 0;
sprite->setPosition(x, y);
}
void MainMenuState::Render(Game &game)
{
bg.Render(game.window);
game.window.draw(*sprite);
if (playing)
again.Render(game.window);
else
play.Render(game.window);
settings.Render(game.window);
close.Render(game.window);
}
(http://img0.www.suckmypic.net/img/V/8/zgEByn4H/err.png)
as the picture is german, let me say that right to _Myptr and running it says <could not read memory>
the right table is the call stack.
the debug output says this:
Ausnahme (erste Chance) bei 0x50024EBE (sfml-window-2.dll) in Pew ReWork.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xFEEEFEEE
Ausnahmefehler bei 0x50024EBE (sfml-window-2.dll) in Pew ReWork.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0xFEEEFEEE
Das Programm "[2032] Pew ReWork.exe" wurde mit Code 0 (0x0) beendet.
means something like: exception error at 0x50024EBE (sfml-window-2.dll) in Pew ReWork.exe: 0xC0000005: access violation when writing at position 0xFEEEFEEE
(freely translated, my english is a bit rusty)
thank you for your help
-
The picture is broken. It says 'no hotlinking' on a fiery background.
-
The picture is broken. It says 'no hotlinking' on a fiery background.
http://www.suckmypic.net/zgEByn4H.png (http://www.suckmypic.net/zgEByn4H.png) <-link
(http://img0.www.suckmypic.net/img/V/8/zgEByn4H/err-png_thumb.jpg) (http://www.suckmypic.net/zgEByn4H.png)
one of there should work :D
-
This is an educated guess: change it so that unique ptr to GameState is on a line BEFORE sf::RenderWindow in your game class, now it is after. Touch no other code. I'm sorry if I'm cryptic but I don't want to write elaborate explanation if it'll end up being wrong. Actually it's wrong already - I thought it's deletion order but you set the unique ptr to null yourself. :-[
-
This is an educated guess: change it so that unique ptr to GameState is on a line BEFORE sf::RenderWindow in your game class, now it is after. Touch no other code. I'm sorry if I'm cryptic but I don't want to write elaborate explanation if it'll end up being wrong.
do you mean something like changing this:
class Game
{
public:
Game();
~Game();
enum class gameStates{ MAINMENU, INTRO, PLAY, SETTINGS, GRAPHICSET, SOUNDSET, DIFFSET, COOPSET, HIGHSCORE };
void Run();
void ChangeState(gameStates newState);
bool isRunning(){ return running; };
void setRunning(bool mRunning);
sf::RenderWindow window;
private:
void Quit();
void Update();
void HandleEvents();
void Render();
std::unique_ptr<GameState> CurrentState;
bool running;
};
into this:
class Game
{
public:
Game();
~Game();
enum class gameStates{ MAINMENU, INTRO, PLAY, SETTINGS, GRAPHICSET, SOUNDSET, DIFFSET, COOPSET, HIGHSCORE };
void Run();
void ChangeState(gameStates newState);
bool isRunning(){ return running; };
void setRunning(bool mRunning);
std::unique_ptr<GameState> CurrentState;
sf::RenderWindow window;
private:
void Quit();
void Update();
void HandleEvents();
void Render();
//here was the ptr
bool running;
};
does not really change something :( it just makes my ptr public
-
When your MainMenuState calls ChangeState it deletes itself because of unique_ptr being set to something different and because of that things such as sf::Event, sf::Clock etc. that are its members are deleted already so in next pollEvent loop it'll crash, you should return immediately from HandleEvents if you called ChangeState.
-
When your MainMenuState calls ChangeState it deletes itself because of unique_ptr being set to something different and because of that things such as sf::Event, sf::Clock etc. that are its members are deleted already so in next pollEvent loop it'll crash, you should return immediately from HandleEvents if you called ChangeState.
i understand what you mean. but how can i realize this?
-
You should make it so the unique ptr that was there originally is stored somewhere for 'delayed' deletion or return from HandleEvents if you called ChangeState.
-
You should make it so the unique ptr that was there originally is stored somewhere for 'delayed' deletion or return from HandleEvents if you called ChangeState.
mhh. okay i will think about how to handle that. but i find it strange, that this whole stuff works in this case:
//main.cpp
#include "Game.h"
int main()
{
Game cyberPong;
cyberPong.ChangeState(Game::gameStates::MAINMENU);
while (cyberPong.isRunning())
{
cyberPong.Run();
}
return 0;
}
//GameState.h
#ifndef GAMESTATE_H
#define GAMESTATE_H
class Game;
class GameState
{
public:
virtual void HandleEvents(Game &game) = 0;
virtual void Update(Game &game) = 0;
virtual void Draw(Game &game) = 0;
virtual ~GameState(){};
};
#endif
//Game.h
#ifndef GAME_H
#define GAME_H
#include <iostream>
#include <memory>
#include <SFML\Graphics.hpp>
#include "GameState.h"
#include "MainMenuState.h"
#include "PlayState.h"
class Game
{
public:
Game();
enum class gameStates{ MAINMENU, PLAY};
void Run();
void ChangeState(gameStates newState);
bool isRunning();
bool running;
sf::RenderWindow window;
private:
std::unique_ptr<GameState> CurrentState;
};
#endif
//Game.cpp
#include "Game.h"
Game::Game()
{
window.create(sf::VideoMode(1280, 720), "CyberPong");
window.setFramerateLimit(60);
running = true;
}
void Game::Run()
{
while (window.isOpen())
{
CurrentState->HandleEvents(*this);
window.clear(sf::Color(0,134,194));
CurrentState->Update(*this);
CurrentState->Draw(*this);
window.display();
}
}
void Game::ChangeState(gameStates newState)
{
switch (newState)
{
case gameStates::MAINMENU:
CurrentState = std::move(std::unique_ptr<MainMenuState>(new MainMenuState));
break;
case gameStates::PLAY:
CurrentState = std::move(std::unique_ptr<PlayState>(new PlayState));
break;
}
}
bool Game::isRunning()
{
return running;
}
//MainMenuState.h
#ifndef MAINMENUSTATE_H
#define MAINMENUSTATE_H
#include "Game.h"
class MainMenuState : public GameState
{
public:
MainMenuState();
~MainMenuState();
void HandleEvents(Game &game);
void Update(Game &game);
void Draw(Game &game);
private:
bool bStartGameSelected;
bool bQuitGameSelected;
sf::Font font;
sf::Text txtStartGame;
sf::Text txtQuitGame;
};
#endif
//MainMenuState.cpp
#include "MainMenuState.h"
MainMenuState::MainMenuState()
{
font.loadFromFile("Font//Saddlebag.ttf");
txtStartGame.setFont(font);
txtStartGame.setString("Spiel Starten");
txtStartGame.setCharacterSize(30);
txtStartGame.setPosition(400, 250);
txtQuitGame.setFont(font);
txtQuitGame.setString("Spiel Beenden");
txtQuitGame.setCharacterSize(30);
txtQuitGame.setPosition(400, 400);
}
void MainMenuState::HandleEvents(Game &game)
{
sf::Event event;
while (game.window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
game.window.close();
game.running = false;
}
if (event.type == sf::Event::MouseButtonReleased)
{
if (event.mouseButton.button == 0)
{
if (bStartGameSelected)
game.ChangeState(Game::gameStates::PLAY);
else if (bQuitGameSelected)
{
game.window.close();
game.running = false;
}
}
}
}
}
void MainMenuState::Update(Game &game)
{
if (txtStartGame.getGlobalBounds().contains(
sf::Mouse::getPosition(game.window).x,
sf::Mouse::getPosition(game.window).y) &&
txtStartGame.getColor() != sf::Color::Green)
{
txtStartGame.setColor(sf::Color::Green);
bStartGameSelected = true;
}
else if (!txtStartGame.getGlobalBounds().contains(
sf::Mouse::getPosition(game.window).x,
sf::Mouse::getPosition(game.window).y) &&
txtStartGame.getColor() == sf::Color::Green)
{
txtStartGame.setColor(sf::Color::White);
bStartGameSelected = false;
}
if (txtQuitGame.getGlobalBounds().contains(
sf::Mouse::getPosition(game.window).x,
sf::Mouse::getPosition(game.window).y) &&
txtQuitGame.getColor() != sf::Color::Green)
{
txtQuitGame.setColor(sf::Color::Green);
bQuitGameSelected = true;
}
else if (!txtQuitGame.getGlobalBounds().contains(
sf::Mouse::getPosition(game.window).x,
sf::Mouse::getPosition(game.window).y) &&
txtQuitGame.getColor() == sf::Color::Green)
{
txtQuitGame.setColor(sf::Color::White);
bQuitGameSelected = false;
}
}
void MainMenuState::Draw(Game &game)
{
game.window.draw(txtStartGame);
game.window.draw(txtQuitGame);
}
MainMenuState::~MainMenuState()
{
std::cout << "Menudestruktor wurde aufgerufen" << std::endl;
}
//PlayState.h
#ifndef PLAYSTATE_H
#define PLAYSTATE_H
#include "Game.h"
#include "GameState.h"
class PlayState : public GameState
{
public:
PlayState();
~PlayState();
void HandleEvents(Game &game);
void Update(Game &game);
void Draw(Game &game);
private:
std::unique_ptr<sf::CircleShape> upBall;
std::shared_ptr<sf::RectangleShape> spPad1;
std::shared_ptr<sf::RectangleShape> spPad2;
};
#endif
//PlayState.cpp
#include "PlayState.h"
PlayState::PlayState()
{
spPad1 = std::make_shared<sf::RectangleShape>(sf::Vector2f(53, 192));
spPad2 = std::make_shared<sf::RectangleShape>(sf::Vector2f(53, 192));
upBall = std::unique_ptr<sf::CircleShape>(new sf::CircleShape(20));
spPad1->setPosition(0, 300);
spPad2->setPosition(1227, 300);
}
PlayState::~PlayState()
{
std::cout << "Playstate wurde zerstört" << std::endl;
}
void PlayState::HandleEvents(Game &game)
{
sf::Event event;
while (game.window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
game.window.close();
game.running = false;
}
}
}
void PlayState::Update(Game &game)
{
}
void PlayState::Draw(Game &game)
{
game.window.draw(*upBall);
game.window.draw(*spPad1);
game.window.draw(*spPad2);
}
-
In these sf::Event is on stack as a local in function so it lasts as long as the scope it's in does not caring how long the class this function is called on lives, only member variables and this care about whether or not class lives. In MainMenuState you (for some reason..., that's really bad practice) allocate it with new in the class itself and that gets deleted in destructor when class gets freed by unique ptr.
-
In these sf::Event is on stack as a local in function so it lasts as long as the scope it's in does not caring how long the class this function is called on lives, only member variables and this care about whether or not class lives. In MainMenuState you (for some reason..., that's really bad practice) allocate it with new in the class itself and that gets deleted in destructor when class gets freed by unique ptr.
okay so i changed the mainMenuState.
it looks now like this:
//MainMenuState.h
#ifndef MAINMENUSTATE_H
#define MAINMENUSTATE_H
#include "Game.h"
#include "MenuSfx.h"
#include "IOstuff.h"
class MainMenuState : public GameState
{
public:
MainMenuState();
~MainMenuState();
void HandleEvents(Game &game);
void Update(Game &game);
void Render(Game &game);
private:
IOsound iosound;
MenuSound sound;
bool playing;
float speed;
float elapsedTime;
float x_movement;
float y_movement;
float x, y;
short int debauch;
short int selection;
int volume;
sf::Event pEvent;
sf::Clock pClock;
sf::Texture texture;
sf::Sprite sprite;
Background bg;
Text play, again, settings, close;
};
#endif
//MainMenuState.cpp
#define PI 3.14159
#include "MainMenuState.h"
#include <cmath>
MainMenuState::MainMenuState()
{
bg.setFilePath("graphics//core//menu.png");
//sound & music
sound.LoadSoundBuffer();
sound.setBuffer(volume);
playing = false;
speed = 0.5;
selection = 0;
iosound.ReadSoundSettings(volume);
//Enemy
elapsedTime = 0;
x_movement = 0;
y_movement = 0;
debauch = 200;
texture.loadFromFile("graphics//enemies//enemy.png");
texture.setSmooth(false);
sprite.setTexture(texture);
sprite.setOrigin(36.5, 35);
//buttons
play.setStringAndSize("play", 70);
again.setStringAndSize("again", 70);
settings.setStringAndSize("settings", 70);
close.setStringAndSize("close", 70);
play.setPosition(270, 150);
again.setPosition(270, 150);
settings.setPosition(270, 250);
close.setPosition(270, 350);
}
MainMenuState::~MainMenuState()
{
std::cout << "zerstoert aldaa";
}
void MainMenuState::HandleEvents(Game &game)
{
while (game.window.pollEvent(pEvent))
{
if (pEvent.type == sf::Event::Closed)
game.setRunning(false);
//Keyboard selection
if (pEvent.type == sf::Event::KeyPressed)
{
switch (pEvent.key.code)
{
case sf::Keyboard::Up:
if (selection > 0)
{
selection -= 1;
sound.PlaySound("select");
}
else
selection = 0;
break;
case sf::Keyboard::Down:
if (selection < 2)
{
selection += 1;
sound.PlaySound("select");
}
else
selection = 2;
break;
case sf::Keyboard::Return:
if (selection == 0)
{
if (playing)
game.ChangeState(Game::gameStates::PLAY);
else
playing = true;
game.ChangeState(Game::gameStates::INTRO);
}
else if (selection == 1)
game.ChangeState(Game::gameStates::SETTINGS);
else
game.setRunning(false);
break;
default:
break;
}
}
}
}
void MainMenuState::Update(Game &game)
{
if (selection == 0)//Spielen
{
play.setColor(sf::Color(255, 128, 0));
again.setColor(sf::Color(255, 128, 0));
settings.setColor(sf::Color(255, 255, 255));
close.setColor(sf::Color(255, 255, 255));
}
else if (selection == 1)//Settings
{
play.setColor(sf::Color(255, 255, 255));
again.setColor(sf::Color(255, 255, 255));
settings.setColor(sf::Color(255, 128, 0));
close.setColor(sf::Color(255, 255, 255));
}
else//Beenden
{
play.setColor(sf::Color(255, 255, 255));
again.setColor(sf::Color(255, 255, 255));
settings.setColor(sf::Color(255, 255, 255));
close.setColor(sf::Color(255, 128, 0));
}
//moving enemy
elapsedTime = pClock.restart().asMilliseconds();
x_movement += elapsedTime;
y_movement += elapsedTime;
y = sprite.getPosition().y;
x = sprite.getPosition().x;
y = 300 + std::sin((y_movement * PI) / 180) * debauch;
x = 400 + std::cos((x_movement * PI) / 180) * debauch;
if (x_movement > 360)
x_movement = 0;
if (y_movement > 360)
y_movement = 0;
sprite.setPosition(x, y);
}
void MainMenuState::Render(Game &game)
{
bg.Render(game.window);
game.window.draw(sprite);
if (playing)
again.Render(game.window);
else
play.Render(game.window);
settings.Render(game.window);
close.Render(game.window);
}
i can now switch the state.
but when the state is changed i really quick get the next error:
HEAP[Pew ReWork.exe]: HEAP: Free Heap block 55f87d8 modified at 55f8854 after it was freed
Pew ReWork.exe hat einen Haltepunkt ausgelöst.
Das Programm "[1560] Pew ReWork.exe" wurde mit Code 0 (0x0) beendet.
http://www.suckmypic.net/C38mbus8.png (http://www.suckmypic.net/C38mbus8.png)
(http://img0.www.suckmypic.net/img/k/T/C38mbus8/weteef-png_thumb.jpg) (http://www.suckmypic.net/C38mbus8.png)
well :D what da f*** :'D
-
as this happens in the intro state, i think it would be good to see that code too... too much? :D
//Intro.h
#ifndef INTRO_H
#define INTRO_H
#include "Game.h"
class Intro : public GameState
{
public:
Intro();
~Intro();
void HandleEvents(Game &game);
void Update(Game &game);
void Render(Game &game);
private:
Text startText;
sf::Event pEvent;
sf::Clock pClock;
sf::Texture intro;
sf::Sprite introSprite;
float elapsedTime;
float bgSpeed, y;
bool startintro;
int returnCounter;
};
#endif
//Intro.cpp
#include "Intro.h"
Intro::Intro()
{
//basic
elapsedTime = 0;
startintro = false;
returnCounter = 0;
//background
startText.setStringAndSize("Return to start", 60);
intro.loadFromFile("graphics//core//intro.jpg");
intro.setSmooth(false);
introSprite.setTexture(intro);
introSprite.setPosition(0, 600);
bgSpeed = 0.03;
y = introSprite.getPosition().y;
}
Intro::~Intro()
{
}
void Intro::HandleEvents(Game &game)
{
while (game.window.pollEvent(pEvent))
{
if (pEvent.type == sf::Event::Closed)
game.setRunning(false);
if (pEvent.type == sf::Event::KeyPressed)
{
if (pEvent.key.code == sf::Keyboard::Return)
returnCounter += 1;
if (pEvent.key.code == sf::Keyboard::Escape)
game.setRunning(false);
}
}
}
void Intro::Update(Game &game)
{
if (!startintro)
{
startText.setOrigin(startText.getGlobalBounds().width / 2, startText.getGlobalBounds().height / 2);
startText.setPosition(game.window.getSize().x / 2, game.window.getSize().y / 2);
introSprite.setPosition(0, 600);
}
if (returnCounter == 1)
startintro = true;
if (returnCounter >= 2)
game.ChangeState(Game::gameStates::PLAY);
//move background
elapsedTime = pClock.restart().asMilliseconds();
y -= bgSpeed * elapsedTime;
introSprite.setPosition(0, y);
//end intro
if (y <= -1200)
{
game.ChangeState(Game::gameStates::PLAY);
startintro = false;
}
}
void Intro::Render(Game &game)
{
if (!startintro)
startText.Render(game.window);
if (startintro)
game.window.draw(introSprite);
}
-
It's STILL a member variable so you can't use it after you call ChangeState, this error is quite clear on that - you modified it after it was freed. This is different that the other, working code where sf::Event was local to function.
In last one the error/crash was more cryptic, but the fact it was in window.dll (only pollEvent and a handlful of other functions are from window.dll, the drawing ones are all from graphics.dll) and 0xFEEEFEEE being present was hinting at using a (sf::Event) pointer after it was freed, since that's what CRT on Windows is setting freed heap memory to.
-
thank you ;) i tested some things, it must be as you say. i got something wrong in my mainmenu class. i will try to fix this tomorrow :D
Edit:
Sorry, but i just can't find whats wrong...
-
okay, i got it running :P
the mistake was in the intro
changed it to this:
//Intro.h
#ifndef INTRO_H
#define INTRO_H
#include "Game.h"
class Intro : public GameState
{
public:
Intro();
~Intro();
void HandleEvents(Game &game);
void Update(Game &game);
void Render(Game &game);
private:
sf::Clock pClock;
sf::Texture intro;
sf::Sprite introSprite;
float elapsedTime;
float bgSpeed, y;
};
#endif
//Intro.cpp
#include "Intro.h"
Intro::Intro()
{
elapsedTime = 0;
intro.loadFromFile("graphics//core//intro.jpg");
intro.setSmooth(false);
introSprite.setTexture(intro);
introSprite.setPosition(0, 600);
bgSpeed = 0.03;
y = introSprite.getPosition().y;
}
Intro::~Intro()
{
}
void Intro::HandleEvents(Game &game)
{
sf::Event pEvent;
while (game.window.pollEvent(pEvent))
{
if (pEvent.type == sf::Event::Closed)
game.setRunning(false);
if (pEvent.type == sf::Event::KeyPressed)
{
if (pEvent.key.code == sf::Keyboard::Escape)
game.setRunning(false);
if (pEvent.key.code == sf::Keyboard::Return)
game.ChangeState(Game::gameStates::PLAY);
}
}
}
void Intro::Update(Game &game)
{
elapsedTime = pClock.restart().asMilliseconds();
y -= bgSpeed * elapsedTime;
introSprite.setPosition(0, y);
if (y <= -1200)
game.ChangeState(Game::gameStates::PLAY);
}
void Intro::Render(Game &game)
{
game.window.draw(introSprite);
}
thanks for the help ;) this topic can now be closed