Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[GTK+, SFML] Rozmazane sprajty

Ostatnio zmodyfikowano 2013-07-12 12:54
Autor Wiadomość
MrPoxipol
Temat założony przez niniejszego użytkownika
[GTK+, SFML] Rozmazane sprajty
» 2013-07-10 11:57:25
Chcę wykorzystać SFML do rysowania w GTK(tak, wiem, jest przecież cairo). Udało mi się znaleźć artykuł, w którym opisane było jak to zrobić dla SFML 1.6. Pozmieniałem wszystko tak, aby działało na SFML 2.0. Wszystko się kompiluje, program się uruchamia, lecz rysowane tekstury są rozmazane i nie zawsze odczytywane są eventy myszy. Dodam, że klasa MapView jest poprawna i działa dobrze(sprawdzałem pod samym SFML). Poniżej zamieszczam screen z owym problemem:
Kod
C/C++
#include <gtk/gtk.h>
#include <SFML/Graphics.hpp>
#include <gdk/gdkwin32.h>
#include <cstring>
#include <iostream>
#define MAP_SIZE 16
#define DEFAULT_TILE_SIZE 24
#define TB 1 // TILE BORDER

class MapView
{
    sf::Vector2u tile_size;
    sf::Vector2f position;
    sf::FloatRect tile_bounds[ MAP_SIZE ][ MAP_SIZE ];
   
    bool tile_pressed;
public:
   
    MapView();
    MapView( sf::Sprite tile[][ MAP_SIZE ], sf::Vector2f position );
    void updateEvents( sf::Event * event, sf::RenderWindow & Win );
    void render( sf::Sprite tile[][ MAP_SIZE ], sf::RenderWindow & Win );
};

MapView::MapView()
{
    tile_size = sf::Vector2u( DEFAULT_TILE_SIZE, DEFAULT_TILE_SIZE );
    position = sf::Vector2f( 0, 0 );
    tile_pressed = false;
}

MapView::MapView( sf::Sprite tile[ MAP_SIZE ][ MAP_SIZE ], sf::Vector2f position )
{
    this->tile_size = tile[ 0 ][ 0 ].getTexture()->getSize();
    this->position = position;
    tile_pressed = false;
   
    for( int i = 0; i < MAP_SIZE; ++i )
    for( int j = 0; j < MAP_SIZE; ++j )
         tile[ j ][ i ].setPosition( sf::Vector2f( j *( tile_size.x + TB ), i *( tile_size.y + TB ) ) + position );
   
    for( int i = 0; i < MAP_SIZE; ++i )
    for( int j = 0; j < MAP_SIZE; ++j )
    tile_bounds[ j ][ i ] = tile[ j ][ i ].getGlobalBounds();;
}

void MapView::updateEvents( sf::Event * event, sf::RenderWindow & Window )
{
    if( event->type == sf::Event::MouseButtonPressed && event->mouseButton.button == sf::Mouse::Left )
         tile_pressed = true;
   
    if( event->type == sf::Event::MouseButtonReleased )
         tile_pressed = false;
   
    if( tile_pressed )
    {
        sf::Vector2i pos = sf::Mouse::getPosition( Window );
        for( int i = 0; i < MAP_SIZE; ++i )
        for( int j = 0; j < MAP_SIZE; ++j )
        {
            if( tile_bounds[ j ][ i ].contains(( sf::Vector2f ) pos ) )
                 std::cout << j << ", " << i << std::endl;
           
        }
    }
}

void MapView::render( sf::Sprite tile[][ MAP_SIZE ], sf::RenderWindow & Win )
{
    for( int i = 0; i < MAP_SIZE; ++i )
    for( int j = 0; j < MAP_SIZE; ++j )
         Win.draw( tile[ j ][ i ] );
   
}

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

void on_expose( GtkWidget * widget, GdkEventExpose * event1, 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 ); // Nowe!
}

int main( int argc, char ** argv )
{
    sf::Texture tex; // Testowa tekstura.
    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 ); // Rozmiar podglądu.
   
    gtk_widget_realize( area );
    gtk_widget_set_double_buffered( area, false );
   
    Win.create( sf::WindowHandle( GDK_WINDOW_HWND( area->window ) ) ); // Dla Windows, na linuksa jest inaczej :P
    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;
}
Normalnie wszystko podzielone jest na kilka plików.
PS Okno GTK jest najprostsze jakie się dało zrobić(specjalnie do testu).

/edit:
Problem ze źle działającymi eventami rozwiązany, pozostaje dalej ten z rozmyciem.
P-87362
DejaVu
» 2013-07-10 21:19:06
Rozmazane sprajty = włączony antyaliasing. Wyłącz go :)
Frazy, które należy wpisać w wyszukiwarkę google:
Nie było takiego tematu dla SFML 2.0...? :P Dziwne...

C/C++
sf::Texture xyz; //...
xyz.setSmooth( false ); //wyłączenie antyaliasingu
P-87429
MrPoxipol
Temat założony przez niniejszego użytkownika
» 2013-07-10 21:38:03
Niestety nic to nie daje :/
P-87438
pekfos
» 2013-07-10 21:54:38
C/C++
xyz.setSmooth( false ); //wyłączenie antyaliasingu
To tylko wyłączenie smootha dla danej tekstury. Antyaliasing się ustawia w sf::ContextSettings, pole antialiasingLevel (domyślnie ustawione na 0)
P-87449
MrPoxipol
Temat założony przez niniejszego użytkownika
» 2013-07-10 22:48:33
Czyli problem nie tkwi w antyaliasingu, ma ktoś jakieś pomysły?
P-87462
DejaVu
» 2013-07-10 23:16:56
http://sfml-dev.org​/documentation/2.0​/classsf_1_1Texture.php#a0c3bd6825b9a99714f10d44179d74324

Powinno działać - u mnie działa na wersji RC (choć może coś sobie w kodzie sam poprawiłem).
P-87470
MrPoxipol
Temat założony przez niniejszego użytkownika
» 2013-07-10 23:45:36
Dodam, że tak powinna wygladać treść okna:

Smooth w SFML 2.0 jest standardowo wyłączony.
P-87476
DejaVu
» 2013-07-11 00:19:05
A może Ty rysujesz planszę jednolitym kolorem zamiast teksturą poprawnie wczytaną? :P
P-87479
« 1 » 2 3 4
  Strona 1 z 4 Następna strona