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

[SFML 2.0] Metody scrollowania

Ostatnio zmodyfikowano 2012-11-07 21:00
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[SFML 2.0] Metody scrollowania
» 2012-11-05 10:09:36
Poniżej zamieszczam kod programu z funkcjami scrollowania oraz link do programu exe z grafikami tego programu. Link do grafik: http://hostuje.net/file.php?id=a40fce53b7b4109867d2d6cab73e8892 A tutaj kod programu:
C/C++
#ifndef GRACZ_H
#define GRACZ_H
#include <SFML/Graphics.hpp>

const int SZER_EKR = 800;
const int WYSO_EKR = 600;

//Aktualnie rysowana klatka
int mActuallFrame = 0;
//Zmienna przechowuj¹ca numer u¿ywanej linii
int mActuallLine = 0;
//Czas którym liczymy co ile maj¹ byæ prze³¹czane klatki
sf::Clock mAnimFrameTime;
//Tworzymy zegar dziêki któremu bêdziemy mogli odmierzaæ czas
sf::Clock loopClock;
//Zmienna wskazuj¹ca ile czasu minê³o od ostatniej aktualizacji logiki
float accumulator = 0;
//Zmienna wskazuj¹ca, co jaki czas ma nastêpowaæ aktualizacja logiki
float TIME_STEP = 0.03f;

class Gracz
{
private:
    void scroll_y( float & x, float & y );
public:
    float x;
    float y;
    float x1;
    float y1;
public:
    void back_scrolowanie_y( sf::Sprite & spr, sf::Sprite & spr1, float & x, float & y, float & xx, float & yy );
    void wrog_scrollowanie( sf::Sprite & Fota, float & x, float & x1, float y );
    void anim_scrollowanie( sf::Sprite & animation, float & x, float & y, float & x1 );
};
void Gracz::back_scrolowanie_y( sf::Sprite & spr, sf::Sprite & spr1, float & x, float & y, float & xx, float & yy )
{
    y += 0.05;
    if( y >= WYSO_EKR )
         y = 0;
   
    yy += 0.05;
    if( yy >= 0 )
         yy =- WYSO_EKR;
   
    spr.setPosition( x, y );
    spr1.setPosition( xx, yy );
}
void Gracz::wrog_scrollowanie( sf::Sprite & Fota, float & x, float & x1, float y )
{
    if( x <= SZER_EKR && x >= 0 )
    {
       
        x += 0.3;
        scroll_y( x, y );
        Fota.setPosition( x, y );
    }
    else
    {
        x1 -= 0.3;
        Fota.setPosition( x1, y );
        if( x1 <= 0 && x >= SZER_EKR )
        {
            x1 = SZER_EKR;
            x = y;
        }
       
    }
}
void Gracz::anim_scrollowanie( sf::Sprite & animation, float & x, float & y, float & x1 )
{
    //Pobieray czas ostatniej klatki, zapisujemy go do zmiennej i resetujemy zegar
    accumulator += loopClock.restart().asSeconds();
    //Je¿eli czas od ostatniej aktualizacji logiki jest wiêkszy ni¿ ten ustalony, rozpoczynamy aktualizacjê
    if( accumulator > TIME_STEP )
    {
        //Je¿eli minê³a 0.1 sekunda od ostatniej zmiany klatki, zrób to teraz
        if( mAnimFrameTime.getElapsedTime().asSeconds() > 0.1 )
        {
            //Zresetuj stoper
            mAnimFrameTime.restart();
           
            //Prze³¹cz klatkê na kolejn¹
            mActuallFrame++;
        }
       
        //Je¿eli numer klatki jest wiêkszy ni¿ ich rzeczywista iloœæ w obrazku
        if( mActuallFrame >= 4 )
        {
            //Zresetuj licznik klatek i prze³¹cz prze³¹cz siê na kolejn¹ liniê
            mActuallFrame = 0;
           
            //Zmieñ numer linii o 1 wiêcej
            mActuallLine++;
        }
       
        //Je¿eli numer linii jest wiêkszy ni¿ 2...
        if( mActuallLine >= 1 )
        {
            //Zresetuj licznik linii i zacznij animowaæ od pocz¹tku
            mActuallLine = 0;
        }
       
        //Ustaw region rysowania na aktualnie wyznaczon¹ klatkê w zmiennej mActuallFrame
        animation.setTextureRect( sf::IntRect( mActuallFrame * 128, mActuallLine * 128, 128, 128 ) );
       
        //Usuñ z akumulatora czas, aby móc ponownie zacz¹æ liczyæ
        accumulator -= TIME_STEP;
    }
    if( x <= SZER_EKR && x >= 0 )
    {
       
        x += 0.3;
        //scroll_y(x,y);
        animation.setPosition( x, y );
    }
    else
    {
        x1 -= 0.3;
        animation.setPosition( x1, y );
        if( x1 <= 0 && x >= SZER_EKR )
        {
            x1 = SZER_EKR;
            x = y;
        }
       
    }
   
}
void Gracz::scroll_y( float & x, float & y )
{
    if( x >= 240 && x <= 340 )
    {
        y = 200;
       
    }
   
}
#endif

C/C++
#include <SFML\Graphics.hpp>
#include "Gracz.h"

int main()
{
    sf::RenderWindow App( sf::VideoMode( SZER_EKR, WYSO_EKR, 32 ), "AnimScroll" );
    sf::Texture back, back1, anim;
    back.loadFromFile( "Grafika/Background.png" );
    back1.loadFromFile( "Grafika/Background.png" );
    anim.loadFromFile( "Grafika/Animacja_1.png" );
    sf::Sprite Back( back ), Anim( anim );
    sf::Sprite Back1( back1 );
    float x = 0, y = 0, x1 = 0; //Scroll Animacje
    float bx = 0, by = 0, bx1 = 0, by1 =- WYSO_EKR; //Scroll Background
    while( App.isOpen() )
    {
        App.clear( sf::Color( 0, 0, 0, 255 ) );
        sf::Event Event;
        while( App.pollEvent( Event ) )
        {
            if( Event.type == sf::Event::Closed )
            {
                App.close();
            }
        }
        Gracz gra;
        gra.back_scrolowanie_y( Back, Back1, bx, by, bx1, by1 );
        gra.anim_scrollowanie( Anim, x, y, x1 );
       
        App.clear();
        App.draw( Back );
        App.draw( Back1 );
        App.draw( Anim );
        App.display();
    }
    return EXIT_SUCCESS;
}

Teraz mam taką prośbę. Czy ktoś mógłby rzucić okiem na powyższy kod i powiedzieć co można by w nim zmienić, ulepszyć, etc.. tak aby kod działał nieco lepiej? Oraz czy ktoś mógłby dopisać do tego kodu parę funkcji o podobnym działaniu? Pisząc "podobnym działaniu" mam namyśli scrollowanie z dodatkowymi bajerami takimi jak np. scrollowanie z obrotem, scrollowanie w kształt scieżki przemieszczania się   węża, po okręgu itp.
P-68527
SeaMonster131
» 2012-11-05 15:58:48
Oraz czy ktoś mógłby dopisać do tego kodu parę funkcji o podobnym działaniu? Pisząc "podobnym działaniu" mam namyśli scrollowanie z dodatkowymi bajerami takimi jak np. scrollowanie z obrotem, scrollowanie w kształt scieżki przemieszczania się   węża, po okręgu itp.
Ty piszesz aplikację czy my?
P-68542
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-11-05 16:50:56
No niby ja ale gdybym umiał samodzielnie napisać te funkcje o których napisanie prosiłem to by tego postu w ogóle nie było a po za tym swoją odpowiedzią odebrałeś mi ostatnią szansę na to aby uwierzyć że na tym forum są jeszcze ludzie którzy czują tak jak ja i mogliby je napisać. Wtedy Ja i Wy równałoby się My! Więc jak?
P-68549
DejaVu
» 2012-11-05 16:53:29
Mi Ci niczego nie odbieramy... jednak jestem podobnego zdania co SeaMonster131, bowiem gier się nie tworzy w oparciu o kursy bądź gotowe rozwiązania - po prostu się myśli samodzielnie nad komponentami i ewentualnie w przypadku konieczności optymalizacji szuka się algorytmów rozwiązujących dany problem efektywnie.
P-68550
m4tx
» 2012-11-05 17:02:16
scrollowanie w kształt scieżki przemieszczania się węża, po okręgu
Polecam funkcje sin i cos :)
P-68551
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-11-05 17:31:56
No to już coś:) Dzięki!
P-68555
crash
» 2012-11-06 17:14:11
Tak btw żeby program działał szybciej możesz na jego wstępie stworzyć tablice gotowych wyników działania sin(x) oraz cos(x), od Ciebie już zależy dokładność (czy o jeden stopień, czy np 1/2 stopnia, czy 1/10). Zamiast wykonywać każdorazowo funkcje, operuj na gotowych wynikach ;>
P-68631
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-11-07 11:09:41
A jak by to w praktyce miało wyglądać? Mogę prosić o kawałek kodu dla uodpornionych na wiedzę?
P-68700
« 1 » 2 3
  Strona 1 z 3 Następna strona