【问题标题】:GTK and SFML 2 Blurred spritesGTK 和 SFML 2 模糊精灵
【发布时间】:2013-07-08 05:26:33
【问题描述】:

我想同时使用 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 类。
  • 如果您生成一个仅将单个图像绘制到RenderTarget 的示例怎么办?这样我们就可以继续关注 SFML + GTK 问题...

标签: gtk sfml sprite blurry drawingarea


【解决方案1】:

我不得不打电话

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

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

【讨论】:

    【解决方案2】:

    我的猜测:

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

    【讨论】:

    • 对不起,它什么也没做:/
    • 好的,所以我想你应该试试 Zack 的建议:创建一个只显示一个精灵的最小应用程序。
    • 我发现了问题,OpenGL 上下文可能有 1x1 大小。应用显示第一个精灵的第一个像素。
    • @user2221315 您能否提供解决问题所需的代码?换句话说,您需要将上下文设置为正确大小的代码?这样其他人也可以解决问题:)
    • 但我不知道如何解决它:/
    猜你喜欢
    • 2023-03-19
    • 2017-05-19
    • 2012-05-09
    • 2015-03-02
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多