SFML community forums
Help => Graphics => Topic started by: Casey on December 21, 2010, 04:53:31 am
-
Hi all,
I'm trying to write a class that manages a cursor but I'm getting some weird behaviour and I need some help to see if someone else can figure it out before it drives me insane.
class is defined as follows
class cursor
{
public:
int getCursorX();
int getCursorY();
bool isPressed();
cursor();
void update();
private:
sf::Sprite sprite;
};
cursor::cursor()
{
sf::Image cursor1;
cursor1.LoadFromFile("cursor.png");
sf::Sprite sprite(cursor1);
sprite.SetCenter(10.f,10.f);
myWindow.Draw(sprite);
myWindow.Display();
sf::Sleep(3);
}
int cursor::getCursorX()
{
return myWindow.GetInput().GetMouseX();
}
int cursor::getCursorY()
{
return myWindow.GetInput().GetMouseY();
}
bool cursor::isPressed()
{
return myWindow.GetInput().IsMouseButtonDown(sf::Mouse::Left);
}
void cursor::update()
{
int x=getCursorX();
int y=getCursorY();
sprite.SetPosition((float) (x-10),(float) (y-10));
myWindow.Draw(sprite);
}
In the constructor, I placed a line to draw and display the loaded sprite so that I could make sure that it loaded properly.
when I create a new cursor with the command
cursor *-cursorName- = new cursor();
the image is displayed in the top left corner of the window for 3 seconds as would be expected but then when I call
-cursorName->update();
it only draws a single white pixel at the mouse location, offest by 10 pixels, rather than my loaded cursor sprite. Ive even loaded a completely black image and the pixel stilll comes up as white.
-
Are you sure the image is being loaded?
Try this.
class Cursor {
public:
Cursor() {
m_Sprite = sf::Sprite(m_Image);
}
Cursor(std::string& path) {
if(!m_Image.LoadFromFile(path)) {
// Exit or do whatever
}
m_Sprite = sf::Sprite(m_Image);
}
virtual ~Cursor() { }
virtual void Draw(sf::Window& Window) {
Window.Draw(m_Sprite);
}
virtual void Update(sf::Window& Window) {
m_Position.x = Window.GetInput().GetMouseX();
m_Position.y = Window.GetInput().GetMouseY();
m_Pressed = Window.GetInput().IsMouseButtonDown(sf::Mouse::Left);
m_Sprite.SetPosition(m_Position);
}
virtual sf::Vector2f GetCursorPosition() { return m_Position; }
virtual float GetCursorX() { m_Position.x }
virtual float GetCursorY() { m_Position.y }
protected:
sf::Image m_Image;
sf::Sprite m_Sprite;
sf::Vector2f m_Position;
bool m_Pressed;
};
class MyCursor : public Cursor {
public:
MyCursor() {
Cursor::Cursor("cursor.png");
}
};
Edit:
Call it like this:
int main(int argc, char** argv) {
// Create video mode, window, etc.
MyCursor myCursor = MyCursor();
// Inside the loop
myCursor.Update(myWindow);
myCursor.Draw(myWindow);
}