I apologise if this seems rushed or I missed an easy google search, I tried but I'm running out of time quickly so this is sort of my last resort. It should be a fairly simple question though.
I started SFML pretty much today and all I want is a class which handles all the rendering in my program, and a thread which handles rendering alone. I can get the code defined
here for getting a thread to work in a class, but when I apply that to my own program I get the error:
"error C2064: term does not evaluate to a function taking 1 arguments xx\include\SFML\System\Thread.inl 48 1"
I have a feeling this is also because I am unfamiliar with the initiliazation lines in class constructors. My code is as follows (its pretty much stock standard from the tutorials, just been arranged differently)
#pragma once
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <vector>
class SpriteManager
{
public:
SpriteManager(void) : window(sf::VideoMode(gameWidth, gameHeight, 32), "Feldspar"), m_thread(&SpriteManager::renderingThread, &SpriteManager::window)
{
window.setVerticalSyncEnabled(true);
// Deactivate OpenGL context so it can be used in the other thread
window.setActive(false);
// Set up a box for the player to romp around in
sf::Texture texture;
if (!texture.loadFromFile("resources/textures/emberGolem.png", sf::IntRect(0, 0, 60, 60))) // IntRect = A simple rectangle. Takes coordinates for top left corner in the image and then size of rectangle.
{
// error...
}
sf::Sprite sprite;
sprite.setTexture(texture);
sprite.setPosition(sf::Vector2f(100, 100));
sprite.move(sf::Vector2f(100, 0));
vSprites.push_back(&sprite);
while (window.isOpen())
{
// Handle events
sf::Event event;
while (window.pollEvent(event))
{
// Window closed or escape key pressed: exit
if ((event.type == sf::Event::Closed) ||
((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::Escape)))
{
window.close();
break;
}
// Key listeners
if (event.type == sf::Event::KeyPressed)
{
// Movement keys
if(event.key.code == sf::Keyboard::A)
sprite.move(sf::Vector2f(-moveSpeed, 0));
else if(event.key.code == sf::Keyboard::S)
sprite.move(sf::Vector2f(0, moveSpeed));
else if(event.key.code == sf::Keyboard::D)
sprite.move(sf::Vector2f(moveSpeed, 0));
else if(event.key.code == sf::Keyboard::W)
sprite.move(sf::Vector2f(0, -moveSpeed));
}
}
//
// Main loop goes here
//
}
}
~SpriteManager(void);
void addSprite(sf::Sprite* pSprite);
private:
void renderingThread(sf::RenderWindow* window)
{
int i = 0; // Generic iterator variable which is recycled a few times. Best to reuse memory where we can.
while (window->isOpen())
{
// Clear the window
window->clear(sf::Color::Black);
// Run through the vector to draw all objects on the screen
for(i = 0; i < vSprites.size(); i++)
{
window->draw(*vSprites[i]);
}
// End of the current frame
window->display();
}
}
static const int gameWidth = 800;
static const int gameHeight = 600;
static const int moveSpeed = 10; // This should be in whichever file the player/creature is in
std::vector<sf::Sprite*> vSprites;
sf::RenderWindow window;
sf::Thread m_thread;
};
Help would be much appreciated!