domin568 Temat założony przez niniejszego użytkownika |
[SFML] Unhandled Exception - dziwny błąd » 2013-07-31 18:10:10 Witam , po kompilacji (pomyślnej) wyskakuje mi okienko z komunikatem first chance exception , okno z SFML jest białe , odkryłem że moja funkcja która przypisuje sf::Text jakiś ciąg znaków jest winowajcą (bez niej nie wyskakuje ten błąd ) Przycisk.cpp void Button::setText( sf::String wyraz ) { text.setString( wyraz ); }
Przycisk.h void setText( sf::String );
main.cpp int _tmain( int argc, _TCHAR * argv[] ) { sf::Event zdarzenie; sf::RenderWindow okno( sf::VideoMode( 800, 400, 32 ), "Pierwsze menu" ); sf::Mouse myszka; Button przycisk( 400, 200, 100, 100, "START" ); while( okno.isOpen() ) { while( okno.pollEvent( zdarzenie ) ) { sf::Vector2f posMouse( myszka.getPosition( okno ).x, myszka.getPosition( okno ).y ); if( zdarzenie.type == sf::Event::Closed ) { okno.close(); } if( zdarzenie.type == sf::Event::MouseButtonPressed && przycisk.inRectangle( posMouse ) == true ) { okno.clear( sf::Color( 255, 0, 0 ) ); } } okno.display(); } return 0; }
Nigdy nie miałem takiego błędu więc proszę was bardziej doświadczonych o pomoc |
|
MrPoxipol |
» 2013-07-31 18:34:38 Wystarcza samo, sf:Mouse::getPosition(Window) do pobrania pozycji myszki. Daj jako argument, const sf::String & wyraz . Możliwe też, że masz taki błąd, który jest w dalszej części kodu, lub w klasie Button. Co do sprawdzania czy mysz, znajduję się w obrębie sprajta (drawable): sf::FloatRect bounds = text.getGlobalBounds(); while( Win.isOpen() ) { sf::Vector2i pos = sf::Mouse::GetPosition( Win ); if( event.type == sf::Event::MouseButtonPressed && bounds.contains( sf::Vector2f( pos ) ) ) Win.clear(); }
|
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-07-31 19:17:04 Tutaj cały mój kod : main.cpp #include "stdafx.h" #include <SFML/Window.hpp> #include <iostream> #include <SFML/Graphics.hpp> #include <SFML/OpenGL.hpp> #include <cstdlib> #include "Przycisk.h" using namespace std; int _tmain( int argc, _TCHAR * argv[] ) { sf::Event zdarzenie; sf::RenderWindow okno( sf::VideoMode( 800, 400, 32 ), "Pierwsze menu" ); sf::Mouse myszka; Button przycisk( 400, 200, 100, 100, "START" ); while( okno.isOpen() ) { while( okno.pollEvent( zdarzenie ) ) { sf::Vector2f posMouse( myszka.getPosition( okno ).x, myszka.getPosition( okno ).y ); if( zdarzenie.type == sf::Event::Closed ) { okno.close(); } if( zdarzenie.type == sf::Event::MouseButtonPressed && przycisk.inRectangle( posMouse ) == true ) { okno.clear( sf::Color( 255, 0, 0 ) ); } } okno.display(); } return 0; }
przycisk.h #include <SFML\Graphics.hpp> #include <SFML\Window.hpp> class Button { private: Button(); sf::Font font; sf::String zdanie; sf::RectangleShape kwadrat; sf::Font czcionka; sf::Text text; public: Button( float, float, float, float, sf::String ); void setRozmiarCzcionki( unsigned int rozmiar_czcionki ); void loadFont( sf::String jaka_czcionka ); void setFont( sf::Font font ); void setText( sf::String ); void setColorText( int R, int G, int B ); void setPositionPrzycisk( float x, float y ); void setSizePrzycisk( float a, float b ); bool inRectangle( sf::Vector2f pozycja_myszki ); void RysujPrzycisk( sf::RenderWindow & oknoApp ); };
przycisk.cpp #include "stdafx.h" #include "Przycisk.h" #include <SFML\Graphics.hpp> #include <SFML\Window.hpp> #include <iostream> using namespace std;
void Button::setRozmiarCzcionki( unsigned int rozmiar_czcionki ) { text.setCharacterSize( rozmiar_czcionki ); }
void Button::loadFont( sf::String jaka_czcionka ) { if( !czcionka.loadFromFile( jaka_czcionka ) ) { cout << "Niestety , nie udalo sie zaladowac czcionki " << endl; } }
void Button::setFont( sf::Font font ) { text.setFont( font ); } void Button::setText( sf::String wyraz ) { text.setString( wyraz ); } void Button::setColorText( int R, int G, int B ) { text.setColor( sf::Color( R, G, B ) ); }
void Button::setPositionPrzycisk( float x, float y ) { text.setPosition( sf::Vector2f( x, y ) ); kwadrat.setPosition( sf::Vector2f( x, y ) ); }
void Button::setSizePrzycisk( float a, float b ) { kwadrat.setSize( sf::Vector2f( a, b ) ); }
bool Button::inRectangle( sf::Vector2f pozycja_myszki ) { if( kwadrat.getGlobalBounds().contains( pozycja_myszki ) ) { return true; } else return false; }
void Button::RysujPrzycisk( sf::RenderWindow & oknoApp ) { oknoApp.draw( text ); oknoApp.draw( kwadrat ); }
Button::Button( float x, float y, float a, float b, sf::String zdanies ) { Button::loadFont( "arial.ttf" ); Button::setFont( czcionka ); Button::setText( zdanies ); Button::setRozmiarCzcionki( 18 ); Button::setColorText( 255, 0, 0 ); Button::setSizePrzycisk( a, b ); Button::setPositionPrzycisk( x, y ); }
|
|
MrPoxipol |
» 2013-07-31 20:27:23 Button::loadFont( "arial.ttf" );
Daj samo loadFont("arial.ttf"); itd. Czemu przy ustawianiu koloru, nie używasz sf::Color? W bool Button::inRectangle( sf::Vector2f pozycja_myszki ) kompilator powinien Cię informować, że nie ostatecznej wartości do zwrócenia. W void Button::RysujPrzycisk( sf::RenderWindow & oknoApp ) musisz pierwsze rysować kwadrat, a na nim tekst, a nie odwrotnie. Oczywiście jeszcze to co napisałem we wcześniejszym poście i jeszcze takie info, że w SFML 2 wystarczy jak załączasz Graphics.hpp, a i radzę Ci używać Vector2 i innych ułatwień SFML (wbudowanych), są na prawdę pomocne ;) /edit: A, i jeszcze nawet z tego co widzę, nie rysujesz tego przycisku ;) |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-07-31 20:41:26 Już nie pamietam , ale chyba dlatego ze miałem problem z "przeniesieniem" sf::Color z zewnątrz , i żeby szybko poszło to tak zrobiłem , jednak te błędy są kosmetyczne i nawet wiem ze można to zrobić inaczej . Bool inRectangle , ta funkcja działa bo jak wywale Button::setText (zdanies) no to wszystko pada , gdy kliknie w pusty przycisk ekran robi sie na czerwono . Za wskazówkę o rysowaniu Ci dziękuje . O co Ci chodzi z pierwsza dygresją ?? Próbowałem wszystkie opcje bez setText wszystko jest dobrze . Dodam ze pracuje w Visual 2012 . Jak by ktoś mi pomógł (sam ciagle szukam) był bym ogromnie wdzięczny , napewno sie odwdzięczę :) |
|
MrPoxipol |
» 2013-07-31 20:45:36 xevuelowi nie pasuje (ha! szybszy byłem z usunięciem :P) Ale stosując się do moich rad osiągniesz efekt. Przetestowałem i działa. Tak to wygląda (dowód, że działa, ofc po zmianach): |
|
domin568 Temat założony przez niniejszego użytkownika |
» 2013-07-31 21:36:51 Nie za bardzo wiem o co Ci chodzi z " Daj samo loadFont("arial.ttf"); itd. " przecież w konstruktorze właśnie identycznie tak zrobiłem xd , Mi po zmienieniu typu przyjmowanego setText (sf::String ) na setText (const sf::String wyraz ) ; , oraz zmieniłem kolejność rysowania (<- tak to było banalne ) , tylko nie wiem o co Ci biega z tym co napisałeś na początku to na pewno chodzi o to :) |
|
MrPoxipol |
» 2013-07-31 21:40:44 W sumie Daj samo loadFont("arial.ttf"); itd. |
nie musisz uwzględniać. setText (const sf::String wyraz ) ; |
setText( const sf::String & wyraz ) I ogólnie jak widzę, że masz troszkę braków :P A teraz dokładniej zmiany jakie zrobiłem (ważniejsze): main.cpp Przycisk.h - tutaj głównie to z const sf::String & tekstsf::Font & font w argumencie (po co wysyłać przez wartość ?) Przycisk.cpp No i to w sumie będzie tyle. |
|
« 1 » 2 |