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

[SFML] Unhandled Exception - dziwny błąd

Ostatnio zmodyfikowano 2013-08-01 09:33
Autor Wiadomość
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
C/C++
void Button::setText( sf::String wyraz )
{
    text.setString( wyraz );
}
Przycisk.h
C/C++
void setText( sf::String );
main.cpp
C/C++
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
P-89123
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):
C/C++
// mamy sobie tekst (obiekt 'text')
sf::FloatRect bounds = text.getGlobalBounds();
while( Win.isOpen() )
{
    // Jakieś zdarzenia etc., etc.
    //..
    //..
    sf::Vector2i pos = sf::Mouse::GetPosition( Win );
    if( event.type == sf::Event::MouseButtonPressed && bounds.contains( sf::Vector2f( pos ) ) )
         Win.clear();
    //..
    //..
}
P-89127
domin568
Temat założony przez niniejszego użytkownika
» 2013-07-31 19:17:04
Tutaj cały mój kod :

main.cpp
C/C++
#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
C/C++
#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
C/C++
#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 );
}
P-89132
MrPoxipol
» 2013-07-31 20:27:23
C/C++
Button::loadFont( "arial.ttf" );
//..
//etc.

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 ;)
P-89134
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ę :)
P-89135
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):
Screen
Screen
P-89136
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 :)
P-89144
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
  • Niepotrzebnie tworzysz obiekt myszy, później i tak wystarczy sf::Mouse::GetPosition(target)
  • Przed sprawdzeniem czy mysz jest w kwadracie, musisz pobrać jej aktualną pozycję i wysłać do funkcji.
  • Nie rysujesz przycisku :p
Przycisk.h - tutaj głównie to z const sf::String & tekst
sf::Font & font w argumencie (po co wysyłać przez wartość ?)

Przycisk.cpp
  • Wiadomo, j.w
  • Zamieniłem rysowanie (kolejność)

No i to w sumie będzie tyle.
P-89145
« 1 » 2
  Strona 1 z 2 Następna strona