Public Group

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

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

## 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 on other sites
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.

• ### Game Developer Survey

We are looking for qualified game developers to participate in a 10-minute online survey. Qualified participants will be offered a \$15 incentive for your time and insights. Click here to start!

• 9
• 11
• 15
• 21
• 26