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

[SFML]problem z animacja postaci

Ostatnio zmodyfikowano 2012-11-03 13:07
Autor Wiadomość
DanielSC
Temat założony przez niniejszego użytkownika
[SFML]problem z animacja postaci
» 2012-11-01 10:29:19
Otóż chciałem zrobić animacji chodzacej postaci ale jest taki problem ze 1 z 3 srpajtow sie nie wyswietla a mianowice sprajt2
C/C++
#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;


int main()
{
    int punkty = 1;
    srand( time( NULL ) );
    int polozeniex =( rand() & 400 ) + 1;
    int polozeniey =( rand() & 400 ) + 1;
    int dalej;
    sf::Clock zegar;
    double czas1 = 0.5;
    double czas3 = 0.7;
    double czas4 = 0.9;
    double czas2 = 0.9;
    double reset;
    reset = czas2;
   
   
    sf::RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), "Np" );
   
    sf::Image obrazek1;
    sf::Image obrazek2;
    sf::Image obrazek3;
    sf::Image obrazek4;
   
   
    obrazek1.LoadFromFile( "ludek1.png" );
    obrazek2.LoadFromFile( "ludek2.png" );
    obrazek3.LoadFromFile( "ludek3.png" );
    obrazek4.LoadFromFile( "ludek4.png" );
   
   
   
    sf::Sprite sprajt1;
    sf::Sprite sprajt2;
    sf::Sprite sprajt3;
    sf::Sprite sprajt4;
   
   
   
   
    sprajt1.SetImage( obrazek1 );
    sprajt1.SetPosition( 200, 200 );
    sprajt1.SetScale( 1, 1 );
   
    sprajt2.SetImage( obrazek2 );
    sprajt2.SetPosition( 200, 200 );
    sprajt2.SetScale( 1, 1 );
   
    sprajt3.SetImage( obrazek3 );
    sprajt3.SetPosition( 200, 200 );
    sprajt3.SetScale( 1, 1 );
   
    sprajt4.SetImage( obrazek4 );
    sprajt4.SetPosition( 200, 200 );
    sprajt4.SetScale( 1, 1 );
   
   
    while( oknoAplikacji.IsOpened() )
    {
        sf::Event zdarzenie;
        while( oknoAplikacji.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == sf::Event::Closed )
                 oknoAplikacji.Close();
           
        }
        const sf::Input & sterowanie = oknoAplikacji.GetInput();
       
        if( zegar.GetElapsedTime() >= reset )
             zegar.Reset();
       
        if( sterowanie.IsKeyDown( sf::Key::Left ) )
       
        {
            sprajt2.Move( - 0.1, 0.0 );
            sprajt1.Move( - 0.1, 0.0 );
            sprajt3.Move( - 0.1, 0.0 );
           
        }
       
        if( sterowanie.IsKeyDown( sf::Key::Right ) )
        {
            sprajt2.Move( 0.1, 0.0 );
            sprajt1.Move( 0.1, 0.0 );
            sprajt3.Move( 0.1, 0.0 );
        }
       
        if( sterowanie.IsKeyDown( sf::Key::Up ) )
        {
            sprajt2.Move( 0.0, - 0.1 );
            sprajt1.Move( 0.0, - 0.1 );
            sprajt3.Move( 0.0, - 0.1 );
        }
       
        if( sterowanie.IsKeyDown( sf::Key::Down ) )
        {
            sprajt2.Move( 0.0, 0.1 );
            sprajt1.Move( 0.0, 0.1 );
            sprajt3.Move( 0.0, 0.1 );
        }
       
       
       
       
       
       
       
       
       
       
        oknoAplikacji.Clear( sf::Color::White );
        if( zegar.GetElapsedTime() > czas4 );
       
        oknoAplikacji.Draw( sprajt4 );
       
       
       
       
       
       
        if( zegar.GetElapsedTime() >= czas1 )
             oknoAplikacji.Draw( sprajt1 );
       
        if( zegar.GetElapsedTime() >= czas3 )
             oknoAplikacji.Draw( sprajt3 );
       
        if( zegar.GetElapsedTime() >= czas2 )
             oknoAplikacji.Draw( sprajt2 );
       
        oknoAplikacji.Display();
       
    }
   
   
   
    return 0;
}
P-68100
DanielSC
Temat założony przez niniejszego użytkownika
» 2012-11-01 10:30:23
a i sprajta4 nie ma
P-68101
Mrovqa
» 2012-11-01 14:47:35
Umieszczaj kod w znacznikach [cpp][/cpp]
Masz straszny burdel w tym kodzie. Ciężko idzie się w nim połapać.
C/C++
double czas1 = 0.5;
double czas3 = 0.7;
double czas4 = 0.9;
double czas2 = 0.9;
double reset;
reset = czas2;
Numerujesz czasy (zmienne) nie po kolei. Niepotrzebnie bawisz się w przesuwanie każdego sprajta po kolei... Rysujesz sprajt na sprajcie; może problem tkwi w tym, że aplikacja działa, ale obrazki są podobne i po prostu tego nie widzisz?
P-68109
DanielSC
Temat założony przez niniejszego użytkownika
» 2012-11-01 16:02:47
Obrazki różnia się od siebie a burdel związany jest z tym że od kilka dni temu zabrałem się za SFML i po prostu jak cos zapomne to dopisuje na koniec.
P-68112
diego997
» 2012-11-02 11:04:02
P-68152
Admixior
» 2012-11-02 17:04:26
A jak się ma wyświetlać sprajt nr 2 skoro
double czas2 = 0.9;
jest na tyle duży że wcześniej będzie nr 3.
C/C++
if( zegar.GetElapsedTime() > czas4 );

oknoAplikacji.Draw( sprajt4 );






if( zegar.GetElapsedTime() >= czas1 )
     oknoAplikacji.Draw( sprajt1 );

if( zegar.GetElapsedTime() >= czas3 )
     oknoAplikacji.Draw( sprajt3 );

if( zegar.GetElapsedTime() >= czas2 )
     oknoAplikacji.Draw( sprajt2 );

używaj else if żeby nie nakładać chyba że tego chcesz.

Znacznie lepszą praktyką byłby dzielenie
C/C++
switch(( int )( zegar.GetEapsedTime() / czas_unitowy_na_jeden_obrazek ) )
{
case 1:
    //wyswitlanie pierwszego;
    break;
case 2: //....
}
i oczywiście zerowanie zegara w odpowiednim miejscu i czasie
P-68233
DanielSC
Temat założony przez niniejszego użytkownika
» 2012-11-03 13:07:47
aha dzieki
P-68325
« 1 »
  Strona 1 z 1