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

[SFML] Czemu coś czego nie ruszam się rusza

Ostatnio zmodyfikowano 2011-07-18 19:35
Autor Wiadomość
akwes
Temat założony przez niniejszego użytkownika
[SFML] Czemu coś czego nie ruszam się rusza
» 2011-07-18 00:36:04
Witam. Chciałem zrobić pewien efekt w SFML, nie wiedziałem jak się do tego zabrać więc skleciłem taką klasę, która ten efekt dla mnie robi:

C/C++
// ================ ewait.h
#ifndef EWAIT_H
#define EWAIT_H
#include "naglowek.h"

class wait_efect
{
public:
    float x1, x2;
    float y1, y2;
    float ax, ay;
    int point;
    void draw( sf::RenderWindow * okno );
    wait_efect( float, float, float, float );
};
#endif


C/C++
// =============== ewait.cpp
#include "ewait.h"


wait_efect::wait_efect( float a, float b, float c, float d )
{
    // Dane wstawione na chama, ze wzgledu na testowanie
    // tego rozwiazania. Do stworzenia kwadratu potrzeba
    // tylko dwa punkty.
   
    x1 = 400;
    y1 = 400;
   
    x2 = 600;
    y2 = 600;
   
    /*
    Zmienna point okresla, które punkty mają już nie być dodawane.
    */
    point = 0;
   
    // Współrzędne ruchomego punktu.
    ax = 500;
    ay = 400;
}

void wait_efect::draw( sf::RenderWindow * okno )
{
    // Niestety, albo się nie da, albo ja nie wiem jak,
    // edytować punkty w Shape. Wiec za każdym razem,
    // tworzę nowy.
   
    sf::Shape kw;
   
    // Po ustalonych przejściach, punkt nie może
    // być dalej rysowany.
    if( ax == 600 && ay == 400 )
         point = 1;
    else if( ax == 600 && ay == 500 )
         point = 2;
    else if( ax == 600 && ay == 600 )
         point = 3;
    else if( ax == 500 && ay == 600 )
         point = 4;
    else if( ax == 400 && ay == 600 )
         point = 5;
    else if( ax == 400 && ay == 500 )
         point = 6;
    else if( ax == 400 && ay == 400 )
         point = 7;
    else if( ax == 500 && ay == 400 && point == 7 )
    {
        ax = 500;
        ay = 400;
        point = 0;
    }
   
    // Określenie zachowania zmieniającego się punktu.
    if( point == 0 )
         ax++;
    else if( point == 1 )
         ay++;
    else if( point == 2 )
         ay++;
    else if( point == 3 )
         ax--;
    else if( point == 4 )
         ax--;
    else if( point == 5 )
         ay--;
    else if( point == 6 )
         ay--;
    else if( point == 7 )
         ax++;
    // Punkt nad środkiem, zawsze obecny
    kw.AddPoint( 500, 400, sf::Color::Red );
    // Kolejny po nim, środek.
    kw.AddPoint( 500, 500, sf::Color::Red );
    // Od środka do aktualnej pozycji
    kw.AddPoint( ax, ay, sf::Color::Red );
   
    // do następnych punktów.
    if( point <= 0 )
         kw.AddPoint( 600, 400, sf::Color::Red );
   
    if( point <= 1 )
         kw.AddPoint( 600, 500, sf::Color::Red );
   
    if( point <= 2 )
         kw.AddPoint( 600, 600, sf::Color::Red );
   
    if( point <= 3 )
         kw.AddPoint( 500, 600, sf::Color::Red );
   
    if( point <= 4 )
         kw.AddPoint( 400, 600, sf::Color::Red );
   
    if( point <= 5 )
         kw.AddPoint( 400, 500, sf::Color::Red );
   
    if( point <= 6 )
         kw.AddPoint( 400, 400, sf::Color::Red );
   
    okno->Draw( kw );
}

C/C++
// ==== main.cpp
// ...
wait_efect * kwa1 = new wait_efect( 1, 2, 3, 4 );
// ...
// w pętli
kwa1->draw( & oknoAplikacji );
// ...

Jeżeli ktoś to odpali u siebie, to zobaczy że poza punktem który się rusza (ten z ax, ay), do pierwszego punktu rusza się również punkt środkowy, potem wraca na miejsce. Ktoś wie gdzie leży problem?
P-36176
DejaVu
» 2011-07-18 00:49:59
W Twoim kodzie leży problem :) Wkleiłeś fragment kodu w którym wiesz, że jest błąd. Nie wiemy jak dokładnie oczekujesz żeby Twój kod działał, więc nie jesteśmy w stanie udzielić Ci na to pytanie odpowiedzi. Kod działa zgodnie z tym co zostało przez Ciebie napisane - samo z siebie nic się nie zacznie ruszać na ekranie (chyba, że mucha Ci siądzie na ekranie monitora).
P-36177
akwes
Temat założony przez niniejszego użytkownika
» 2011-07-18 00:59:11
Ja doskonale wiem że kompilator robi dokładnie to co mu się powie :) Zgaduje że jest coś nie tak z kolejnością... No ale nie wiem gdzie.

Kod ma robić efekt... Nie wiem jak go opisać... Startujemy od całego kwadratu a potem zgodnie z ruchem wskazówek zegara, kwadrat zaczyna znikać.

Tak jak na zegarku. Jest godzina 12:00. Cały kwadrat jest zamalowany.
12:15 Zamalowany jest zewnętrzny kąt, i potem z czasem ten zewnętrzny kąt maleje, aż kwadrat zniknie.
P-36178
DejaVu
» 2011-07-18 01:35:49
Narysuj 4 linie i potem zmniejszaj długość jednej z nich. Gdy długość wyniesie 1 - nie rysuj linii i zacznij robić to samo z następną linią.
P-36179
akwes
Temat założony przez niniejszego użytkownika
» 2011-07-18 01:39:17
Kwadrat jest wypełniony, dlatego też rysuję wielokąt.

Może zobrazuje:

http://img827.imageshack.us/img827/2524/beztytuufzy.png

Czarne linie dodałem sam. Nie mam pojęcia czemu środkowy punkt, który jest w kodzie ustawiony na 500,500 zmienia swoje położenie. Tylko jeden punkt jest ruchomy i nie mogę znaleźć błędu, który powoduje ruch środkowego punktu. Środkowy punkt odgina się jedynie wtedy, kiedy ten główny ruchomy idzie od środka górnej krawędzi do prawego górnego rogu. Potem zawsze jest ok.

Nie wiem co powoduje że punkt:
C/C++
kw.AddPoint( 500, 500, sf::Color::Red );
Nie chce siedzieć w środku jak mu każę...
Nic innego tam nie rysuje, specjalnie mam czerwony kolor żeby nie mieszało się z niczym. Nie wierzę że ten punkt się faktycznie rusza, może to tylko złudzenie wywołane... no właśnie, nie wiem czym...



Dobra, coraz ciekawiej, ustawiłem inny kolor i przeźroczystość - co się okazało? Fragment przesunięty zmienił kolor, ale nie stał się przeźroczysty, jak reszta kwadratu...
P-36180
DejaVu
» 2011-07-18 12:06:11
No to tylko linie na obwodzie zmniejszają swoje długości
P-36188
akwes
Temat założony przez niniejszego użytkownika
» 2011-07-18 13:27:23
Jak z czterech linii mam zrobić w najlepszym przypadku pięciobok (czasem jest to sześciobok a nawet siedmiobok, widoczne na obrazku, do którego link dałem)?

// Bardziej niż na nowym rozwiązaniu zależy mi na poznaniu tego gdzie w tym kodzie jest błąd. Podejrzewam że coś jest nie tak z kolejnością, bo efekt się robi taki jak chcę, poza tym że na początku jakby dziwnie się figura zapętla i rysuje w złej kolejności coś.

http://img135.imageshack.us/img135/9580/beztytuuqq.png
Kolejny link, z większym opisem tego co się dzieje. Jest to czarny, przeźroczysty kwadrat na czerwonym tle.

//
Teraz to już naprawdę nie wiem...


Kropki są tutaj wynikiem tego

kw to ten sf::Shape, który rysuje

C/C++
for( unsigned int i = 0; i < kw.GetNbPoints(); i++ )
     okno->Draw( sf::Shape::Circle( kw.GetPointPosition( i ).x, kw.GetPointPosition( i ).y, 5, sf::Color::White ) );


Czemu tam się robi zgięcie skoro nie ma punktu?


//EDIT: Nie zamykam bo wtedy DejaVu nie przeczyta :P
Na forum SFML-a dowiedziałem się że:
"You just cannot use non-convex shapes with SFML. This is an openGL limitation."
Widzi Pan, jednak wina nie kodzie leży a w SFML :)
P-36190
DejaVu
» 2011-07-18 18:15:44
Myślę, że w przypadku poprawnie połączonych wierzchołków efekt jest osiągalny :)
P-36203
« 1 » 2
  Strona 1 z 2 Następna strona