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

[C++, SFML] Obliczanie zmiany wartości suwaka

Ostatnio zmodyfikowano 2012-11-03 16:30
Autor Wiadomość
ridic14
Temat założony przez niniejszego użytkownika
[C++, SFML] Obliczanie zmiany wartości suwaka
» 2012-10-09 22:46:39
Zaprogramowałem II część swojego gui do sfml a mianowicie suwak.

wszystko pięknie działa oprócz tego że gdy podam liczby ujemne program nie potrafi tego przeliczyć:

kod działający na liczby dodatnie:

C/C++
for( int i = 0; i < _max + 1; i++ ) // _max to maxymalna wartość zmiennej możliwa do ustawienia przez suwak
{
    if( suwak.getPosition().x - pole.getPosition().x > _interval * i ) //_interval to przedział(długość suwaka / maxymalną wartość zmiennej
    {
        var = pocz + i; //ustalenie wartości jeśli spełnia warunek; pocz to wartość minimalna
        //std::cout << (int)var << std::endl;
    }
    else if( suwak.getPosition().x == pole.getPosition().x + pole.getSize().x ) //jeśli suwak jest na końcu daje maksymalną wartość
    {
        var = _max;
    }
}



gcvt( var, 3, varStr ); // zamiana na char żeby móc wyświetlić w sfml
std::cout <<( int ) var << std::endl;

próbowałem zmieniać operatory i inne rzeczy np.:
var = pocz - i; lub i > _max +1; i tak nic się nie zmieniało :(

liczę na pomoc:) dzięki
P-66546
Admixior
» 2012-10-09 23:07:36
Zastanawia mnie fakt po co pętla.
Przecież wystarczy zwykłe dzielenie.
Ot tak to wygląda u mnie:
C/C++
int Klasa::MoveMouse( Vector2f pos ) //nowa pozycja myszki na ekranie
{
    if( !clicked ) return 0; //suwak w ogole nie klikniety zwracamy 0
   
    if( pos.x > pixel.pos_end ) pos.x = pixel.pos_end; //suwak za bardzo w prawo (ustawiamy ostatni mozliwy pixel)
   
    if( pos.x < pixel.pos_start ) pos.x = pixel.pos_start; //suwak za bardzo w lewo (...)
   
    suwak.SetPosition( pos.x, pixel.pos_y ); //ustawiamy pozycje suwaka
    unsigned int difference_pos = pos.x - pixel.pos_start; //obliczamy ile jest przesuniecia od pozycji startowej
    unsigned int sel = difference_pos / pixel.move_step; //dzielimy przez _invertal (ilosc pixeli na jeden krok)
    if( select.cur_sel != sel ) //zmienila się wartosc
    {
        value = start_value +( select.cur_sel = sel ) * value_per_step;
        //value - wlasciwa wartosc
        //start_value - od jakiej wartosci zaczynamy
        //select.cur_sel = sel   -  mnoznik - ile jest krokow wykonanych (wiadomo o co chodzi)
        //value_per_step  -  ile wartosci sie dodaje co jeden krok
       
       
        //odswieżenie tekstu
    }
    return 1;
}

//PS umieściłbym klasę ale mój program pójdzie na konkurs więc nie chcę żeby później ktoś mówił że było jakieś naruszenie zasad (że kod z neta czy coś...).
P-66547
ridic14
Temat założony przez niniejszego użytkownika
» 2012-10-10 16:10:45
Nie, klasę już mam ale chodziło o to że mój sposób nie działa na liczby ujemne

ale zrobiłem(działa na + i -:
C/C++
for( int i = 0; i < _max + 1; i++ )
{
    if( suwak.getPosition().x - pole.getPosition().x > _interval * i )
    {
        var = pocz + i;
        //std::cout << (int)var << std::endl;
    }
    else if( suwak.getPosition().x == pole.getPosition().x + pole.getSize().x )
    {
        var = _max;
    }
}
if( _max < 0 )
{
   
    for( int i = 0; i < - _max - 1; i++ )
    {
        //std::cout << (bool)(_max < 0) << std::endl;
        if( suwak.getPosition().x - pole.getPosition().x > _interval * - i )
        {
            var = pocz - i;
            //std::cout << (int)var << std::endl;
        }
        else if( suwak.getPosition().x == pole.getPosition().x + pole.getSize().x )
        {
            var = _max;
        }
    }
}
P-66560
ridic14
Temat założony przez niniejszego użytkownika
» 2012-11-03 16:30:52
Na podstawie kodu 2 posty wyżej:
C/C++
przedzial =( slideArea.getSize().y - sliderH ) /( maxValue - startValue );
float przesun = slider.getPosition().y - slideArea.getPosition().y;
float now = przesun / przedzial;
value = startValue + now;

proste i dobrze obliczające wartość
P-68349
« 1 »
  Strona 1 z 1