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

[SFML 1.6] Czyszczenie ekranu

Ostatnio zmodyfikowano 2013-01-12 03:38
Autor Wiadomość
crash
Temat założony przez niniejszego użytkownika
[SFML 1.6] Czyszczenie ekranu
» 2013-01-11 03:39:13
Postanowiłem poznać SFML i przyznaję, zaczyna mi się podobać. Kiedyś testowałem SDL, jakoś jednak nie przypadł mi do gustu. Do rzeczy.

Chcę przetestować swój algorytm kolizji dwóch prostokątów, do tego wymyśliłem taki oto schemat: klawiszami w,a,s,d będę jeden z prostokątów przemieszczać po ekranie. Pojawił się taki problem, że nie mogę za żadne skarby zamalować starej pozycji przemieszczanego prostokąta. Kod:

C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>

//#include "colissions.hpp"

#include <iostream>

using namespace std;
using namespace sf;

int main()
{
    RenderWindow RW( VideoMode( 800, 600, 32 ), "SFML test" );
   
    RW.Clear( Color( 255, 0, 0 ) );
    RW.Display();
   
    int x1 = 120, x2 = 120, y1 = 80, y2 = 80;
   
    Shape
    S1 = Shape::Rectangle( 120, 120, 80, 80, Color( 150, 50, 250 ) ),
    S2 = Shape::Rectangle( 300, 300, 380, 380, Color( 150, 50, 200 ) );
   
    S1.SetOutlineWidth( 5 );
    S2.SetOutlineWidth( 5 );
   
    //S1.EnableFill(true);
   
    RW.Draw( S1 );
    RW.Draw( S2 );
   
    while( RW.IsOpened() )
    {
        Event E;
       
        while( RW.GetEvent( E ) )
        {
            if( E.Type == Event::KeyPressed && E.Key.Code == 256 ) return 0;
           
            if( E.Type == Event::KeyPressed && E.Key.Code == sf::Key::W )
            {
                //switch (E.Key)
                //{
                //    W:  /*  y1-=10; y2-=10; */ break;
                //   A: S1.Move(-10,10); /*x1-=10; x2-=10;*/ break;
                //   S: S1.Move(0,10); /*y1+=10; y2+=10;*/ break;
                //  D: S1.Move(10,10); /*x1+=10; x1+=10; */ break;
                //}
                Shape Red = Shape::Rectangle( x1, y1, x2, y2, Color( 255, 0, 0 ) );
               
                RW.Draw( Red );
                RW.Display();
               
                S1.Move( 0, - 10 );
                RW.Draw( S1 );
            }
        }
        RW.Display();
    }
}

Z góry dzięx za pomoc

P-73547
DejaVu
» 2013-01-11 05:48:37
na początku pętli napisz:
C/C++
RW.Clear( Color( 255, 0, 0 ) );
P-73548
crash
Temat założony przez niniejszego użytkownika
» 2013-01-11 07:08:58
Którą pętlę masz na myśli? Testowałem w różnych miejscach i kiszka. Teraz próbuę innego podejścia. Podejrzewam, że lepiej będzie jak zacznę wyświetlać sprity, póki co pomęczę jeszcze kształty.
P-73550
DejaVu
» 2013-01-11 07:17:02
P-73551
krzyk
» 2013-01-11 07:25:40
RW.Draw przenieś do głównej pętli.
P-73554
crash
Temat założony przez niniejszego użytkownika
» 2013-01-11 07:35:01
Coś czuję, że będę musiał użyć sprite'ów, zawsze lubiłem ten gazowany napój ;) Pocudowałem i kifoza jak u Donalda Tuska. Kod:

C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>

//#include "colissions.hpp"

#include <iostream>

using namespace std;
using namespace sf;

int main()
{
    RenderWindow RW( VideoMode( 800, 600, 32 ), "SFML test" );
   
    RW.Clear( Color( 255, 0, 0 ) );
    RW.Display();
   
    int x1 = 120, x2 = 120, y1 = 80, y2 = 80;
   
    Shape S1 = Shape::Rectangle( 120, 120, 80, 80, Color( 150, 50, 250 ) ),
    S2 = Shape::Rectangle( 300, 300, 380, 380, Color( 150, 50, 200 ) );
   
    S1.SetOutlineWidth( 5 );
    S2.SetOutlineWidth( 5 );
   
    //S1.EnableFill(true);
   
    RW.Draw( S1 );
    RW.Draw( S2 );
    RW.Display();
   
    while( RW.IsOpened() )
    {
        Event E;
       
        while( RW.GetEvent( E ) )
        {
            if( E.Type == Event::KeyPressed && E.Key.Code == 256 ) return 0;
           
            unsigned char c = E.Key.Code;
           
            if( E.Type == Event::KeyPressed /*&& E.Key.Code == sf::Key::W*/ )
            {
                cout << c; // .....
               
                switch( c )
                {
                    w: y1 -= 10; y2 -= 10; break;
                    a: x1 -= 10; x2 -= 10; break;
                    s: y1 += 10; y2 += 10; break;
                    d: x1 += 10; x2 += 10; break;
                }
               
                RW.Clear( Color::Red );
                RW.Display();
                S1.Rectangle( x1, y1, x2, y2, Color( 150, 50, 200 ), 5, Color( 150, 50, 200 ) );
                RW.Draw( S1 );
                RW.Draw( S2 );
                RW.Display();
            }
        }
    }
}
P-73555
DejaVu
» 2013-01-11 07:39:38
W zasadzie to źle piszesz kod. Nie umieszcza się kodu renderującego w pętli z obsługą zdarzeń.
P-73556
crash
Temat założony przez niniejszego użytkownika
» 2013-01-11 07:42:59
Naprowadź, proszę, będę dźwięczny jak ta Nokia :)

edit: zerknę za 2-3h
P-73557
« 1 » 2
  Strona 1 z 2 Następna strona