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

[SFML] Zmienianie sie grafiki

Ostatnio zmodyfikowano 2011-10-21 19:25
Autor Wiadomość
lelu0
Temat założony przez niniejszego użytkownika
[SFML] Zmienianie sie grafiki
» 2011-10-18 15:37:56
Witam. Postanowiłem napisać grę w trzy karty. Problemy zaczęły się, gdy chciałem żeby po wybraniu właściwej bądź niewłaściwej karty wyświetlały się odpowiednie napisy. Problem w tym że po włączeniu aplikacji na ekranie jest wyświetlany napis od razu, a cały ekran nieustannie miga. oto kod (jest jeszcze w samym środku pracy, wiec jako tako gra nie działa jak powinna, jest jeszcze sporo do napisania, ale staram się ją testować na bieżąco):
C/C++
#include <iostream>
#include <SFML/Graphics.hpp>


using namespace std;
int wylosuj( int l ) // losuje liczbe od 1 do 2 do przypisania do elementu tablicy
{
   
   
    l =( rand() % 2 ) + 1;
    return l;
   
}
bool spr( int a[], int c ) //funkcja sprawdzajaca
{
   
   
    do {
        if( a[ c ] == 2 ) // jeœli by³a zwraca prawde
             return true;
       
        c++;
       
    } while( c <= 1 );
   
    return false;
   
}

int main()
{
   
    srand( time( 0 ) );
    int karty[ 3 ];
   
    int l[ 2 ];
    int i = 0;
    do { // sprawdzanie start
        int liczba;
        liczba = wylosuj( 0 ); // losuje liczbe dla elementów tablicy  nr 1 i 2
        if( spr( l, 0 ) == false ) // sprawdzanie powtórzeñ
        {
            karty[ i ] = liczba; // przydziela do elementu tablicy wylosowan¹ liczbê
            i++;
        }
    } while( i <= 2 ); //koniec sprawdzania
   
   
    // tworze grafike
    sf::Image karta;
    karta.LoadFromFile( "karta.png" );
   
    sf::Sprite kartas;
    kartas.SetImage( karta );
    kartas.SetPosition( 100, 200 );
   
    sf::Sprite kartas2;
    kartas2.SetImage( karta );
    kartas2.SetPosition( 300, 200 );
   
    sf::Sprite kartas3;
    kartas3.SetImage( karta );
    kartas3.SetPosition( 500, 200 );
   
   
   
   
   
   
   
   
   
   
    //deklarowanie okna i zdarzenie zamykajace
   
    sf::RenderWindow okno( sf::VideoMode( 800, 600, 32 ), "Trzy Karty" );
    while( okno.IsOpened() )
    {
        sf::Event zdarzenie;
        while( okno.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == sf::Event::Closed )
                 okno.Close();
           
        }
       
        // tworzenie zmiennych tekstowycz
       
        sf::String t1( L"Trzy Karty" );
        sf::String t2( L"Zwyciestwo" );
        sf::String t3( L"Przegrana" );
       
        t1.SetPosition( 300, 10 );
        t2.SetPosition( 300, 540 );
        t3.SetPosition( 300, 540 );
       
       
       
       
       
       
       
       
       
       
        //rysowanie grafiki
       
        okno.Clear( sf::Color( 30, 180, 100 ) );
        okno.Draw( t1 );
        okno.Draw( kartas );
        okno.Draw( kartas2 );
        okno.Draw( kartas3 );
        okno.Display();
       
       
        //sterowanie
        int select;
        const sf::Input & sterowanie = okno.GetInput();
       
        if( sterowanie.IsKeyDown( sf::Key::A ) )
             select = karty[ 0 ];
       
        if( sterowanie.IsKeyDown( sf::Key::S ) )
             select = karty[ 1 ];
       
        if( sterowanie.IsKeyDown( sf::Key::D ) )
             select = karty[ 2 ];
        // sprawdzanie zwyciestwa
        int zwyciestwo = 2;
        if( zwyciestwo == select )
        {
           
            okno.Clear( sf::Color( 30, 180, 100 ) );
            okno.Draw( t2 );
            okno.Display();
        }
        else
        {
            okno.Clear( sf::Color( 30, 180, 100 ) );
            okno.Draw( t3 );
            okno.Display();
        };
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
    }
   
   
   
   
   
   
   
   
   
   
   
    return 0;
}

Wiem że wygląda trochę chaotycznie. Więc co musze zrobic żeby komunikaty wyswietlały się poprawnie a ekran nie migał?
P-42277
blojayble
» 2011-10-19 21:55:06
Po pierwsze, to próbuj działać obiektowo.

Po drugie, ja najpierw robię sterowanie,a dopiero potem rysowanie i jest cacy.


Po trzecie

C/C++
int zwyciestwo = 2;
if( zwyciestwo == select )
{
   
    okno.Clear( sf::Color( 30, 180, 100 ) );
    okno.Draw( t2 );
    okno.Display();
}
else
{
    okno.Clear( sf::Color( 30, 180, 100 ) );
    okno.Draw( t3 );
    okno.Display();
};


Może chodzi o else, jeżeli nie spełni pierwszego warunku, to mogą dziać się różne cuda, chyba że nie załapałem ukrytego sensu tego kodu.


Proponuję dokładnie określić co dla czego, i umieścić to w pętli while(GetEvent), ponieważ na samym początku się to wykonuje, a jeżeli nie zdążysz na początku nacisnąć przycisku, co jest niemożliwe, aby być takim szybkim :), to oczywiste, że wyświetli się ten napis. Proponuję wyobrazić sobie, jak to w ogóle miało działać, bo jest "nieco" nieprzemyślane.


Pozdro.
P-42341
lelu0
Temat założony przez niniejszego użytkownika
» 2011-10-21 19:25:19
Dzięki za pomoc, to mój pierwszy program w sfml po kursie na tej stronie, chciałem sprawdzić czy cos umiem ale wychodzi że niewiele ;) w każdym razie dzienki, jak bede mial natchnienie to jeszcze popróbuje.
P-42392
« 1 »
  Strona 1 z 1