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

[SFML] problem z przesuwankiem kilku obiektow na raz

Ostatnio zmodyfikowano 2016-10-30 11:25
Autor Wiadomość
Szustarol
Temat założony przez niniejszego użytkownika
[SFML] problem z przesuwankiem kilku obiektow na raz
» 2016-10-29 22:58:41
Witam!
Chcę zanimować przesuwanie pasów na drodze, ale niestety coś jest nie tak.
Jeśli ich nie przesuwam wszystko jest okej, ale jeśli dam move na każdy to robi się między nimi przerwa
Daję kod:
C/C++
void lines::initialise( sf::RenderWindow & window ) {
    std::vector < sf::RectangleShape > temp;
    temp.resize( ammount );
    siz = window.getSize().y / 40;
    for( int i = 0; i < ammount; i++ ) {
        temp[ i ].setSize( sf::Vector2f( 6, siz ) );
        temp[ i ].setFillColor( sf::Color( 255, 255, 255 ) );
    }
    for( int i = 0; i < ammount; i++ ) {
        temp[ i ].setPosition( 0, siz * 2 * i );
    }
    line = temp;
}

void lines::drawintargetwindow( sf::RenderWindow & window ) {
    int temp;
    temp = window.getSize().x * 0.4 - 3;
    for( int i = 0; i < ammount; i++ ) {
        line[ i ].setPosition( temp, line[ i ].getPosition().y );
        window.draw( line[ i ] );
    }
    temp = window.getSize().x * 0.6 - 3;
    for( int i = 0; i < ammount; i++ ) {
        line[ i ].setPosition( temp, line[ i ].getPosition().y );
        window.draw( line[ i ] );
    }
}

void lines::move() {
    time = clock.getElapsedTime();
    clock.restart();
    for( int i = 0; i < ammount; i++ ) {
        line[ i ].move( sf::Vector2f( 0, speed * time.asSeconds() ) );
        if( line[ i ].getPosition().y > siz * 40 )
             line[ i ].setPosition( 0, 0 - siz );
       
    }
}
wiec jesli wykomentuje calkowicie funkcje move, to odstepy sa prawidlowe
zadalem juz to pytanie na forum sfml ale nie otrzymalem odpowiedzi wiec pytam tutaj
podam link do oryginalnego pytania bo sa tam screenshoty ktore wyjasniaja moje pytanie
en.sfml-dev.org/forums/index.php?topic=21036.0
P-153033
michal11
» 2016-10-29 23:44:35
W funkcji drawintargetwindow (swoja droga fatalnie się to czyta, zastosuj np. CamelCase) dwa razy rysujesz tą samą linię i dodatkowo jeszcze jej ustawiasz jakąś pozycję, to może być potencjalny błąd.

Edit.
Sorry za literówki, pisałem późno i z telefonu.
P-153035
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-10-30 00:06:56
Ale po narysowaniu ona juz nie jest potrzebna (bo juz jest narysowana), moze sie myle ale nie wydaje mi sie by aż tak to sfmlowi szkodziło
swoja droga fatalnie dir to czytaj, <-nie rozumiem tego zdania, mógłbyś inaczej wytłumaczyć
P-153037
Gibas11
» 2016-10-30 00:57:29
Przeczytaj co zwraca metoda sf::Clock::restart() (nie do końca błąd, ale zaśmiecasz sobie kod) i sprawdź czy zmienna 'amount' ma poprawny rozmiar podczas przesuwania.

//edit: I zarzucę klasykiem, daj minimalny, ale kompletny kod reprodukujący błąd.
P-153039
Szustarol
Temat założony przez niniejszego użytkownika
» 2016-10-30 11:25:59
C/C++
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
using namespace sf;
int main() {
    Clock zegar;
    Time time;
    RenderWindow okno( VideoMode( 800, 600 ), "test" );
    RectangleShape pasek[ 20 ];
    int siz = 600 / 40;
    for( int i = 0; i < 20; i++ ) {
        pasek[ i ].setSize( sf::Vector2f( 6, siz ) );
        pasek[ i ].setFillColor( sf::Color( 255, 255, 255 ) );
    }
    for( int i = 0; i < 20; i++ ) {
        pasek[ i ].setPosition( 0, siz * 2 * i );
    }
    int temp;
    int speed = 100;
    while( okno.isOpen() ) {
        time = zegar.restart();
        for( int i = 0; i < 20; i++ ) {
            pasek[ i ].move( sf::Vector2f( 0, speed * time.asSeconds() ) );
            if( pasek[ i ].getPosition().y > siz * 40 )
                 pasek[ i ].setPosition( 0, 0 - siz );
           
        }
        okno.clear();
        temp = 800 * 0.4;
        for( int i = 0; i < 20; i++ ) {
            pasek[ i ].setPosition( temp, pasek[ i ].getPosition().y );
            okno.draw( pasek[ i ] );
        }
        temp = 800 * 0.6;
        for( int i = 0; i < 20; i++ ) {
            pasek[ i ].setPosition( temp, pasek[ i ].getPosition().y );
            okno.draw( pasek[ i ] );
        }
        okno.display();
    }
}
chociazby taki kod- przerwa jest faktycznie mniejsza niz w normalnym kodzie ale jest widoczna

EDIT
zauwazylem ze jesli w kodzie programu zrobie tak
C/C++
movegameelements( line );
speed = log( mainclock.getElapsedTime().asMilliseconds() );
speed += 100;
mainwindow.clear( sf::Color( 0, 0, 0 ) );
drawgameelements( mainwindow, line );
mainwindow.display();
zamiast tak
C/C++
speed = log( mainclock.getElapsedTime().asMilliseconds() );
speed += 100;
mainwindow.clear( sf::Color( 0, 0, 0 ) );
drawgameelements( mainwindow, line );
mainwindow.display();
movegameelements( line );
to przerwa jest o wiele mniejsza
czy moze wiec to byc problem powolności algorytmu?
P-153049
« 1 »
  Strona 1 z 1