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

[SFML] Błędne rysowanie figur geometrycznych

Ostatnio zmodyfikowano 2013-01-14 19:43
Autor Wiadomość
DanielSC
Temat założony przez niniejszego użytkownika
[SFML] Błędne rysowanie figur geometrycznych
» 2013-01-09 17:42:50
Chciałbym was się zapytać czemu po otoworzeniu tej Aplikacji i nacisnieciu lewego przycisku myszy rysuje mi czerwone paski zamiast kwadratow takich jak w rogu?

C/C++
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
using namespace std;

int main()
{
   
    RenderWindow Aplikacja( VideoMode( 900, 900, 32 ), "Aplikacja" ); //Style::Fullscreen );
    Shape kwadrat1[ 5 ];
   
    while( Aplikacja.IsOpened() )
    {
        Event zdarzenie;
        while( Aplikacja.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == Event::Closed )
                 Aplikacja.Close();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape )
                 Aplikacja.Close();
           
        }
       
        const Input & sterowanie = Aplikacja.GetInput();
        sterowanie.GetMouseX();
        sterowanie.GetMouseY();
        float x1[ 5 ], y1[ 5 ];
       
        while( sterowanie.IsMouseButtonDown( Mouse::Left ) )
        {
            int i = 0;
            x1[ i ] = sterowanie.GetMouseX();
            y1[ i ] = sterowanie.GetMouseY();
            i++;
            if( i < 5 )
                 break;
           
        }
       
        for( int i = 0; i < 5; i++ )
        {
            kwadrat1[ i ].AddPoint( x1[ i ], y1[ i ], Color::Red, Color::Red );
            kwadrat1[ i ].AddPoint( x1[ i ], y1[ i ] + 100, Color::Red, Color::Red );
            kwadrat1[ i ].AddPoint( x1[ i ] + 100, y1[ i ] + 100, Color::Red, Color::Red );
            kwadrat1[ i ].AddPoint( x1[ i ] + 100, y1[ i ], Color::Red, Color::Red );
           
        }
       
        Aplikacja.Clear( Color( 0, 0, 0 ) );
       
       
        for( int i = 0; i < 5; i++ )
        {
            Aplikacja.Draw( kwadrat1[ i ] );
        }
       
        Aplikacja.Display();
    }
    return 0;
}
P-73473
Mrovqa
» 2013-01-09 20:06:29
C/C++
while( sterowanie.IsMouseButtonDown( Mouse::Left ) )
{
    int i = 0;
    x1[ i ] = sterowanie.GetMouseX();
    y1[ i ] = sterowanie.GetMouseY();
    i++;
    if( i < 5 )
         break;
   
}
Szukam, patrzę i szukam, a sensu tego kawałku kodu znaleźć nie potrafię. Wiesz co to robi? Dodaj sobie cout/printf, który wypisze przed ifem wartość zmiennej i. Potem pomyśl, dlaczego tak jest.
P-73488
DejaVu
» 2013-01-09 20:24:11
Na temat rysowania wielokątów za pomocą OpenGL znajdziesz całą masę tematów, że jest to 'problematyczne' i są ku temu uzasadnione powody. Jeżeli koniecznie chcesz rysować poprawnie wielokąty to sprawdź czy SFML 2.0 nie ma już z tym problemów lub poszukaj jakiegoś algorytmu/biblioteki, która ma wsparcie rysowania wypełnionych wielokątów.
P-73492
DanielSC
Temat założony przez niniejszego użytkownika
» 2013-01-09 21:32:50
Ok pobawie się tym aż nie rozwiaże problemu :)Dzięki za wszelkie wsazówki .
---
O a jak tak napisze bez tablic program działa zgodnie z moim założeniem.
Ale chciałbym aby można było rysować 5 takich kwadratow np:
naciskam lewy przycisk mysz rysuje się kwadrat
naciskam 2 raz lewy przycisk myszy rysuje się 2 kwadrat
i tak dalej aż do 5

A to ten kod bez tablic z 1 kwadratem:

C/C++
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
using namespace std;

int main()
{
    RenderWindow Aplikacja( VideoMode( 900, 900, 32 ), "Aplikacja" ); //Style::Fullscreen );
    Shape kwadrat1;
   
    while( Aplikacja.IsOpened() )
    {
        Event zdarzenie;
        while( Aplikacja.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == Event::Closed )
                 Aplikacja.Close();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape )
                 Aplikacja.Close();
           
        }
        const Input & sterowanie = Aplikacja.GetInput();
        sterowanie.GetMouseX();
        sterowanie.GetMouseY();
        float x1, y1;
        x1 = sterowanie.GetMouseX();
        y1 = sterowanie.GetMouseY();
        if( sterowanie.IsMouseButtonDown( Mouse::Left ) )
        {
            kwadrat1.AddPoint( x1, y1, Color::Red, Color::Red );
            kwadrat1.AddPoint( x1, y1 + 100, Color::Red, Color::Red );
            kwadrat1.AddPoint( x1 + 100, y1 + 100, Color::Red, Color::Red );
            kwadrat1.AddPoint( x1 + 100, y1, Color::Red, Color::Red );
           
           
        }
        Aplikacja.Clear( Color( 0, 0, 0 ) );
        Aplikacja.Draw( kwadrat1 );
        Aplikacja.Display();
    }
    return 0;
}


-----
Jedyne jakie widze narazie rozwiązanie to przypisanie każdej figurze jednego przycisku np:
lewy przycisk myszy rysuje kwadrat1
prawy przycisk myszy rysuje kwadrat2
i tak dalej.
Macie może pomysł jak rozwiązać ten problem inaczej?
P-73507
Wasilek
» 2013-01-14 11:25:37
Poczytaj sobie np. o vectorach w STL to będziesz mógł sobie dynamicznie tworzyć i usuwać tyle kwadratów ile ci tylko komp uciągnie ;)

A jak interesuję cię tylko dodawanie tych kilku kwadratów to możesz dać zmienną, którą określasz ile jest kwadratów aktualnie(-1 aby z tablicą się zgadzało :) ) i co każde kliknięcie przycisku dodaje się kwadrat i zmienna zwiększa się.

C/C++
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
using namespace std;

int main()
{
    RenderWindow Aplikacja( VideoMode( 900, 900, 32 ), "Aplikacja" ); //Style::Fullscreen );
    Shape kwadrat[ 5 ]; // To zmieniłem
    int liczba_kwadratow = 0; // To dodałem
   
    while( Aplikacja.IsOpened() )
    {
        Event zdarzenie;
        while( Aplikacja.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == Event::Closed )
                 Aplikacja.Close();
           
            if( zdarzenie.Type == sf::Event::KeyPressed && zdarzenie.Key.Code == sf::Key::Escape )
                 Aplikacja.Close();
           
        }
        const Input & sterowanie = Aplikacja.GetInput();
        sterowanie.GetMouseX();
        sterowanie.GetMouseY();
        float x1, y1;
        x1 = sterowanie.GetMouseX();
        y1 = sterowanie.GetMouseY();
        if( sterowanie.IsMouseButtonDown( Mouse::Left ) )
        {
            kwadrat[ liczba_kwadratow ].AddPoint( x1, y1, Color::Red, Color::Red ); // Tutaj zmieniłem
            kwadrat[ liczba_kwadratow ].AddPoint( x1, y1 + 100, Color::Red, Color::Red );
            kwadrat[ liczba_kwadratow ].AddPoint( x1 + 100, y1 + 100, Color::Red, Color::Red );
            kwadrat[ liczba_kwadratow ].AddPoint( x1 + 100, y1, Color::Red, Color::Red );
            liczba_kwadratow++; // To dodałem
           
           
        }
        Aplikacja.Clear( Color( 0, 0, 0 ) );
        Aplikacja.Draw( kwadrat1 );
        Aplikacja.Display();
    }
    return 0;
}

Oprócz tego nie rozumiem np. do czego jest to
C/C++
const Input & sterowanie = Aplikacja.GetInput(); // To wystarczy na początku zadeklarować
sterowanie.GetMouseX();
sterowanie.GetMouseY();

A :D I zapomniałem dodać, że to moje wywali błąd jak dojdziesz do 5 kwadratów :) Możesz dać albo blokadę w ifie, albo zastosować własnie vectory z STL'a
P-73903
DanielSC
Temat założony przez niniejszego użytkownika
» 2013-01-14 19:43:41
Aha dzieki wielkie.
P-73957
« 1 »
  Strona 1 z 1