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 #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
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 ); }
int main( int argc, char ** argv ) { sf::Texture tex; 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 ); 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 ); gtk_widget_realize( area ); gtk_widget_set_double_buffered( area, false ); Win.create( sf::WindowHandle( GDK_WINDOW_HWND( area->window ) ) ); 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. |
|
DejaVu |
» 2013-07-10 21:19:06 Rozmazane sprajty = włączony antyaliasing. Wyłącz go :) Nie było takiego tematu dla SFML 2.0...? :P Dziwne... sf::Texture xyz; xyz.setSmooth( false );
|
|
MrPoxipol Temat założony przez niniejszego użytkownika |
» 2013-07-10 21:38:03 Niestety nic to nie daje :/ |
|
pekfos |
» 2013-07-10 21:54:38 To tylko wyłączenie smootha dla danej tekstury. Antyaliasing się ustawia w sf::ContextSettings, pole antialiasingLevel (domyślnie ustawione na 0) |
|
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? |
|
DejaVu |
» 2013-07-10 23:16:56 |
|
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. |
|
DejaVu |
» 2013-07-11 00:19:05 A może Ty rysujesz planszę jednolitym kolorem zamiast teksturą poprawnie wczytaną? :P |
|
« 1 » 2 3 4 |