GTK和SFML 2模糊的精灵

时间:2013-07-10 10:13:12

标签: gtk sfml sprite blurry drawingarea

我想一起使用GTK +和SFML 2.0。我创建了一个简单的窗口来测试它,但效果不好。精灵模糊了。下面是描述问题的屏幕截图。 /编辑: 窗口仅渲染纹理的第一个像素。

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;
}

2 个答案:

答案 0 :(得分:3)

我不得不打电话

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

绘图区中创建SFML窗口之前。

答案 1 :(得分:0)

我猜测:

使用sf::Sprite::setTexture的第二个参数正确重置精灵的大小。

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