3

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

GTK+ SFML 问题

它应该如下所示:

在此处输入图像描述

编码:

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

2 回答 2

3

我不得不打电话

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

在绘图区域内创建 SFML 窗口之前。

于 2013-07-12T09:17:17.857 回答
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 );
于 2013-07-11T10:24:51.180 回答