Jump to content
  • Advertisement
Sign in to follow this  
Concentrate

SFML: Different drawing order when rendering multiple widow, why?

This topic is 2511 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

This is a C++/SFML/opengl application.

Ok here is the draw function for a grid like box.

//draws a simple grid

void draw(sf::RenderWindow& canvas)const{
for(int i = 0; i < HEIGHT; ++i){
for(int j = 0; j < WIDTH; ++j){
if(m_list[j].piece.get() != NULL){ //[1]
m_list[j].piece->draw(canvas);
}
canvas.Draw(m_list[j].sprite); //[2]
}
}
canvas.Draw( m_background ); //[3]
}


Here is an example of the rendered image https://imgur.com/7AzVN

Assume [1] is always false for now. Now from the picture you see that [3] gets drawn first then [2] gets drawn. Thats fine and dandy, although I think that's somewhat backwards. Now in the same application, when event X happens, I created another window, which uses the above
code. And I would figure, it would render the same image as shown previously, when correct settings are placed. But actually, what I am seeing is that, in the new window( which is setActive now) it actually draws [2] first then [3]. And hence [2] gets covered by [3], since [3] covers a greater area than [2]. Why the difference? This is basically the second window creation code :


PromotionPiecePicker::PromotionPiecePicker(const sf::RenderWindow& window): mainWindow(window){
m_window.Create(sf::VideoMode(400,400,32), "Promition Picker");
m_window.Clear(sf::Color::White);
m_grid.setBackgoundColor(sf::Color::White);
m_grid.setCellColor(sf::Color::Red);
m_window.SetFramerateLimit(60);
}

detail::IChessPieceEnums::PieceType PromotionPiecePicker::getUserPick()
{
m_window.SetActive();

detail::IChessPieceEnums::PieceType pieceType;

while(m_window.IsOpened())
{
sf::Event event;
//handle event
while(m_window.GetEvent(event))
{
// Close window : exit
if (event.Type == sf::Event::Closed){
m_window.Close();
}

// Escape key : exit
if ((event.Type == sf::Event::KeyPressed) && (event.Key.Code == sf::Key::Escape)){
m_window.Close();
}
/* handle event */
if(m_window.GetInput().IsMouseButtonDown(sf::Mouse::Left)){
m_window.Close();
cout << "in event\n";
}
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

_displaySelections();

m_window.Display();
}

//make main window active again
mainWindow.SetActive();

return pieceType;
}
void PromotionPiecePicker::_displaySelections(){
m_grid.draw(m_window);
}


Any advice guys? You can actually see the whole code here in github. The above code is from PromotionPiecePicker.cpp class.

https://github.com/d...aster/ChessGame

Share this post


Link to post
Share on other sites
Advertisement
Ok problem is solved. The problem was that I was mixing some of opengl calls without saving the gl context. So as a resolution, I simply removed the opengl calls and replaced them with proper sfml calls.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!