Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Jak zrobić z tego animację skoku?

#1
Jak zrobić z tego animację skoku?
Po prostu nie wiem jak. Stworzyłem sobie już postać, którą poruszam WSAD`em, nałożyłem sprite`a, zrobiłem też animację podczas ruchu, ale nie wiem jak zrobić z tego animację.

w konstruktorze playera, stworzyłem sobie tablicę współrzędnych o które ma się poruszyć:

Kod:
for (int i = 0; i < 30; i++)

    {
        rot += 3.14 / 32.0f;
        ax[i] = 1.5*sin(rot);
        bx[i] = -1.5*cos(rot);
        //std::cout << i << " ->     Rot: " << rot << "     ax: " << ax[i] << "     bx: " << bx[i] << std::endl;



    }
    rot = 0;

I zaś mam właśnie funkcję skok:

Kod:
void Player::skok()

{
    
    status = IDZ;
    
    sf::Time t2 = anim_clock.getElapsedTime();
    
        if (anim_clock.getElapsedTime()>sf::seconds(0.09f))
        {
            std::cout << t2.asSeconds() << std::endl;
            sprite.move(ax[i], bx[i]);
            anim_clock.restart();
            i++;
            if (i == 29) i = 0;
        }

I nie wiem jak zrobić z tego animację, bo jak przyciskam spację, to w miarę płynnie, po prostu się przemieszcza. Ale no chyba rozumiecie o co chodzi, chcę żeby po wciśnięciu spacji, wykonał się cały zakres ruchów, tak jakbym 30 razy kliknął spację.

To cały kod:

Player.h: http://wklej.org/id/1724806/
Engine.h: http://wklej.org/id/1724810/
Game.h: http://wklej.org/id/1724811/

Player.cpp: http://wklej.org/id/1724814/
Engine.cpp: http://wklej.org/id/1724817/
Game.cpp: http://wklej.org/id/1724816/
main.cpp: http://wklej.org/id/1724815/


Jak coś to czas pobiera się:
Kod:
anim_clock.getElapsedTime()

AtEDIT

Bo jak dla mnie to co napisałem powinno działać. Tzn. jak widzicie odmierzam sobie 0.09s, czyli tyle czasu trwania ma moja klatka. I teraz jeśli umieściłbym to powiedzmy w takiej pętli:

Kod:
for (int a = 0; a<30; a++){
        sf::Time t2 = anim_clock.getElapsedTime();

        if (anim_clock.getElapsedTime()>sf::seconds(0.09f))
        {
            std::cout << t2.asSeconds() << std::endl;
            sprite.move(ax[i], bx[i]);
            anim_clock.restart();
            i++;
            if (i == 29) i = 0;
        }
    }

To kod odpowiedzialny za poruszanie się mojej postaci podczas skoku powinien jak dla mnie wykonać się te '30' razy, ale wykonuje się tylko raz, dlaczego?
 System operacyjny: windows_seven Przeglądarka: firefox
#2
RE: Jak zrobić z tego animację skoku?
Skok nie powinien blokować wykonywania się programu. Powinieneś zdefiniować sobie jakieś pole, które by przechowywało stan obiektu (czy aktualnie wykonuje skok) oraz pole reprezentujące numer klatki animacji.
Masz tutaj mały przykład w JS. Możesz wielokrotnie klikać przycisk, a to nie zaburza animacji skoku.
Kod:
<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript">
        var r = 16, x = r, y = 80, dx = 1, dy = 0, skok = false, n = 120, curr_n;

        function jump()
        {
            if (skok == false)
            {
                curr_n = 0;
                skok = true;
            }
        }

        function draw()
        {
            var canvas = document.getElementById('canvas1');
            var ctx = canvas.getContext('2d');

            ctx.clearRect(0, 0, canvas.width, canvas.height);

            if (x >= canvas.width-r)
                dx = -1;
            if (x <= r)
                dx = 1;
            x += dx;

            ctx.beginPath();
            if (skok)
            {
                dy = -64*Math.sin(curr_n/n*Math.PI);
                if (curr_n == n)
                    skok = false;
                else
                    curr_n++;
            }
            ctx.arc(x, y + dy, r, 0, 2*Math.PI);
            ctx.stroke();
        }
    </script>
</head>
<body onload="window.setInterval(function(){draw()}, 5);">
    <input type="button" value="Skok" onclick="jump()" /><br/>
    <canvas id="canvas1" width="320" height="100" />
</body>
</html>
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#3
RE: Jak zrobić z tego animację skoku?
(29.05.2015, 13:59)Szachista napisał(a):
Kod:
</body>
</html>

Szczerze to ciężko mi będzie coś takiego zrealizować, ktoś inny zaproponował mi tak:

Cytat:No to inaczej: wydziel część odpowiedzialną za animację do osobnej klasy abstrakcyjnej z metodami reset i nextFrame oraz wskaźnikiem na postać + zrób podklasę JumpAnimation, wtedy będziesz miał wszystko ładnie opakowane.


Mniej-więcej tak:


class Animation {
private:
Player* player;
 
protected:
unsigned int frameId; // klatka animacji
 
public:
virtual bool nextFrame();
 
void reset(); // ustawia `frameId` na `0`
 
void setPlayer(Player* player);
Player* getPlayer();
}




class JumpAnimation: public Animation {
 
bool nextFrame() {
player->position->x = frameId * jakieś tam równanie okręgu;
player->position->y = frameId * jakieś tam równanie okręgu;
frameId++;
 
return (frameId > 30); // załóżmy, że nasza animacja ma 30 klatek
}
}



W renderze wywołujesz tylko nextFrame danej animacji i od razu masz zanimowaną postać.
Jeżeli nextFrame zwróci false, oznacza to koniec animacji.

Ten sposób ma jeszcze jedną zaletę, a mianowicie trzymanie się zasady jednej odpowiedzialności.


Pierwszy problem jaki napotkałem, to to, że nie potrafię pobrać pozycji mojego obiektu klasy Player.

Co prawda mam zdefiniowane w klasie:

Kod:
public: sf::Vector2f getPosition();

Ale jak stworzyłem metodę:

Kod:
void Player :: get_position()

{
    std::cout << this->getPosition().x;
    std::cout << this->getPosition().y;
}

To mam 'unresolved external symbol'. I nie wiem dlaczego.


AtEDIT

Wrzuciłem do domyślnego konstruktora

Kod:
this->position_x = this->sprite.getPosition().x;
    
    this->position_y = this->sprite.getPosition().y;

Bo w nim na początku ustawiam pozycję sprite`a na środek ekranu i zaś go tylko przesuwam, dobrze myślę?


No i stworzyłem jeszcze funkcję:

Kod:
void Player::aktualizuj()
{
    


    this->position_x = this->sprite.getPosition().x;
    
    this->position_y = this->sprite.getPosition().y;
    
}

I wywołałem tam gdzie poruszam postacią.
 System operacyjny: windows_seven Przeglądarka: firefox
#4
RE: Jak zrobić z tego animację skoku?
W pliku nigdzie nie zamieściłeś kodu tej metody. Poza tym nagłówek tej metody wygląda zupełnie inaczej, dlatego kompilator wyświetla błąd unresolved external symbol. Powinna ona wyglądać
Kod:
sf::Vector2f Player::getPosition()
{
    // nie masz pola w klasie, które przechowuje pozycję
}
A u siebie masz
Kod:
void Player::getPosition()
{
}

Oczywiście, że całą animację można ładnie upakować Wesoły
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#5
RE: Jak zrobić z tego animację skoku?
Ostatecznie co do pozycji klasy 'Player'.

1: Funkcje:



void Player::setPosition(float x, float y)
{
this->position_x = x;
this->position_y = y;
}
void Player::move(float x, float y)
{
this->position_x += x;
this->position_y += y;
}
void Player::info_pos()
{
 
 
 
 
 
std::cout << "X-owa" << this->position_x << std::endl;
std::cout << "Y-kowa" << this->position_y << std::endl;
 
}



2. W konstruktorze domyślny mam:


sprite.setPosition(1280/2,720/2);
this->setPosition(1280 / 2, 720 / 2);



3. W każdej funkcji odpowiedzialnej za poruszanie postacią mam:

 
void Player::idz_l()
{
status = IDZ;
 
 
//info_pos();
this->move(-2, 0);
sprite.move(-2, 0);
}


Dobrze myślę?

AtEDIT_2

Co radzący mi miał na myśli pisząc:

Kod:
Player* getPlayer();
to jest w pliku Animation.h

Mam napisać definicję tej metody w tym pliku czy w Player.h?

I jak ma ona wyglądać?

tzn. chodzi mi o to:

Player getplayer(){};

A może:

Player Animation::getplayer(){}; ??
 System operacyjny: windows_seven Przeglądarka: firefox
#6
RE: Jak zrobić z tego animację skoku?
To się powinno znaleźć w pliku Animation.cpp (jeśli takowy istnieje):
Kod:
Player* Animation::getPlayer()
{
    return player;
}
Tyle że składnik player powinien być chroniony, a nie prywatny, bo z poziomu klasy JumpAnimation nie będzie dostępny.
 System operacyjny: linux_ubuntu Przeglądarka: firefox
Programy: Polecane / Nowe / Inne




Podobne wątki (Jak zrobić z tego animację skoku?)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  OpenGL - jak wygenerować animację klatka po klatce. Dreamer1x6xX 3 9683 19.03.2015, 08:55
Ostatni post: Szachista
  Problem z niewykonującą się instrukcją skoku .[Assembler 8086] 16 bitowy. Trojan3000 2 5171 09.12.2014, 20:33
Ostatni post: Trojan3000
Ściana Jak zrobić animację w logomocji? danio262 2 9128 06.04.2010, 17:38
Ostatni post: Neomex Cpp

Skocz do: