2013-07-10 83 views
3

我想一起使用GTK +和SFML 2.0。我創建了一個簡單的窗口來測試,但效果不佳。精靈模糊。下面是描述問題的屏幕截圖。 /編輯: 該窗口僅渲染紋理的第一個像素。GTK和SFML 2模糊的精靈

GTK+ SFML problem

它應該是這樣的:

enter image description here

代碼:

#include <gtk/gtk.h> 
#include <SFML/Graphics.hpp> 
#include <gdk/gdkwin32.h> 

sf::RenderWindow Win; 
sf::Sprite tile[ MAP_SIZE ][ MAP_SIZE ]; 

void on_expose(GtkWidget * widget, gpointer data) 
{ 
    MapView * view =(MapView *) data; 
    sf::Event event; 
    while(Win.pollEvent(event)) 
    { 
     if(event.type == sf::Event::Closed) 
      Win.close(); 

     view->updateEvents(& event, Win); 
    } 

    Win.clear(sf::Color::White); 
    view->render(tile, Win); 
    Win.display(); 

    gtk_widget_queue_draw(widget); 
} 

int main(int argc, char ** argv) 
{ 
    sf::Texture tex; // Testing texture 
    if(!tex.loadFromFile("gfx/7.png")) 
     std::cout << "Unable to load texture!\n"; 

    for(int i = 0; i < MAP_SIZE; ++i) 
    for(int j = 0; j < MAP_SIZE; ++j) 
     tile[ j ][ i ].setTexture(tex); // Default texture, a.k.a MAP_NONE 

    MapView view(tile, sf::Vector2f(0, 0)); 

    gtk_init(& argc, & argv); 

    GtkWidget * window; 
    GtkWidget * area; 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    area = gtk_drawing_area_new(); 

    gtk_container_add(GTK_CONTAINER(window), area); 

    GdkEventMask mask; 
    mask = GDK_ALL_EVENTS_MASK; 
    gtk_widget_add_events(area, mask); 

    gtk_widget_set_can_focus(area, true); 
    gtk_widget_set_size_request(area, 16 * 25, 16 * 25); // Preview size. 

    gtk_widget_realize(area); 
    gtk_widget_set_double_buffered(area, false); 

    Win.create(sf::WindowHandle(GDK_WINDOW_HWND(area->window))); // Windows-only solution 
    Win.setFramerateLimit(30); 

    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); 
    g_signal_connect(area, "expose-event", G_CALLBACK(on_expose), & view); 

    gtk_widget_show_all(window); 
    gtk_main(); 

    return 0; 
} 
+0

您能否提供顯示您所描述問題的屏幕截圖?你提到「精靈模糊」,但在你的屏幕截圖中根本沒有任何精靈。另外,我建議您將代碼示例減少到重現此問題所需的最少量代碼。這個'MapView'類不需要。 –

+0

如果您生成一個只將單個圖像繪製到「RenderTarget」的例子,該怎麼辦?這樣我們可以繼續專注於SFML + GTK問題... –

回答

3

繪圖區域內創建SFML窗口前致電

gdk_window_resize(area->window, MAP_SIZE*25, MAP_SIZE*25); 

0

我大膽猜測:

使用第二個參數以正確重置精靈的大小。

for(int i = 0; i < MAP_SIZE; ++i) 
    for(int j = 0; j < MAP_SIZE; ++j) 
     tile[ j ][ i ].setTexture(tex, true); 
+0

對不起,但它什麼都不做:/ – poxip

+0

好吧,所以我想你應該嘗試Zack提出的建議:創建一個只顯示一個精靈的最小應用程序。 – Hiura

+0

我發現問題,OpenGL上下文可能有1x1大小。應用程序顯示第一個精靈的第一個像素。 – poxip