GTK和SFML 2中的模糊精灵

3
我希望能同时使用GTK+和SFML 2.0。我创建了一个简单的窗口来测试,但是效果不好。精灵被模糊了。下面是描述问题的屏幕截图。 /编辑: 窗口仅呈现纹理的第一个像素。 代码如下:
#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;
}

你能否提供一个屏幕截图来展示你所描述的问题?你提到“精灵模糊”,但是在你的截图中并没有任何精灵。此外,我建议你将代码示例减少到最小化程度,以便重现问题。这个 MapView 类也是不必要的。 - Zack The Human
如果您创建一个只向“RenderTarget”绘制单个图像的示例,那么我们就可以专注于SFML + GTK的问题... - Zack The Human
2个回答

3

我不得不打电话

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

drawing-area内创建SFML窗口之前。

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

抱歉,但它什么也不做 :/ - poxip
好的,我猜你应该尝试一下Zack建议的方法:创建一个仅显示一个精灵的最小应用程序。 - Hiura
我找到了问题,OpenGL上下文可能只有1x1的大小。应用程序显示第一个精灵的第一个像素。 - poxip
@user2221315,你能提供修复问题所需的代码吗?换句话说,你需要设置上下文到正确的大小所需的代码是什么?这样其他人也可以解决问题 :) - Zack The Human
但我不知道该怎么修复它 :/ - poxip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接