Skocz do zawartości

wxWidgets + SFML 2.1


Madness

Rekomendowane odpowiedzi

Wielokrotnie poległem na łączeniu tych dwóch bibliotek, ale na forum sfml'a udało mi się znaleźć kod który mi w tym pomógł.

Po paru poprawkach, aplikacja skompilowała się. Napotkałem jednak dziwaczny problem, pomimo tego że mogę sobie rysować co chce poprzez sfml'a, to wygląda to tak:

(Standardowa tekstura 128x128 z ikoną Code::Blocks'a i window.clear(sf::Color::Black))

2hp0gf7.jpg

Kolor tła mogę zmieniać na całej powierzchni, ale rysować niestety tylko na takiej (na dole, po lewej widać czerwony kwadrat to właśnie ten kawałek tekstury).

Jakieś pomysły ?

 

#include <wx/wx.h>
#include <SFML/Graphics.hpp>

#ifdef __WXGTK__
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <gdk/gdkprivate.h>
#include <gtk/gtkwidget.h>
#endif

class SFMLRenderWindow : public wxControl, public sf::RenderWindow {
public:
   sf::Texture tex;
   sf::Sprite spr;
   sf::View view;
   sf::RenderTexture rt;
   SFMLRenderWindow(wxWindow * parent, int id) : wxControl(parent,id)
   {
       //wxControl(parent,id);

       #ifdef __WXGTK__
           gtk_widget_realize(m_wxwindow);
           gtk_widget_set_double_buffered(m_wxwindow, false);
           GdkWindow* Win = gtk_widget_get_window(m_wxwindow);
           XFlush(GDK_WINDOW_XDISPLAY(Win));
           sf::RenderWindow::Create(GDK_WINDOW_XWINDOW(Win));
       #else
           sf::ContextSettings settings;
           settings.depthBits = 32;
           settings.antialiasingLevel = 6;
           sf::RenderWindow::create(GetHandle(),settings);
       #endif
       sf::RenderWindow::setSize(sf::Vector2u(800,600));
       Bind(wxEVT_PAINT, &SFMLRenderWindow::onPaint, this);
       Bind(wxEVT_ERASE_BACKGROUND, &SFMLRenderWindow::onEraseBackground, this);
       Bind(wxEVT_IDLE, &SFMLRenderWindow::onIdle, this);
       Bind(wxEVT_KEY_DOWN, &SFMLRenderWindow::onKeyDown, this);
       tex.loadFromFile("cb.bmp");
       tex.setRepeated(true);
       spr.setTexture(tex);
//        view.setCenter(0,0);
//        view.setViewport(sf::FloatRect(0.0f,0.0f,1.0f,1.0f));
//        rt.create(800,600,true);
//        rt.clear();
//        spr.setTexture(rt.getTexture());
       //setView(view);
   }
   ~SFMLRenderWindow() {}

   void onPaint(wxPaintEvent& e) {
       wxPaintDC(this);

       sf::RenderWindow::setActive();
       //sf::RenderWindow::resetGLStates();
       sf::RenderWindow::clear(sf::Color::Black);

       sf::RenderWindow::draw(spr);
       spr.move(-0.01f,-0.01f);

       sf::RenderWindow::display();
   }

   void onEraseBackground(wxEraseEvent& e) {
       // Do nothing
   }

   void onIdle(wxIdleEvent& e) {
           Refresh();
   }

   void onKeyDown(wxKeyEvent& e) {
       if (e.GetKeyCode() == WXK_F11) {
           printf("F11");
       }
       else
           e.Skip();
   }
};


// Test application
class wxMiniApp : public wxApp {
public:
   virtual bool OnInit();
};

IMPLEMENT_APP(wxMiniApp)

bool wxMiniApp::OnInit() {
   wxFrame* frame = new wxFrame(NULL, -1, "SFML RenderWindow", wxDefaultPosition, wxSize(800, 600));
   new SFMLRenderWindow(frame, -1);
   frame->Show();

   return true;
}

 

 

EDIT: Dobra, udało mi się. Odpowiednio pomieszałem kod z tutka dla SFML 1.6 z powyższym i działa jak trzeba.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...