• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Stopniowe obracanie obrazka [SFML]

Object Storage Arubacloud
0 głosów
325 wizyt
pytanie zadane 5 lutego 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)
otwarte ponownie 5 lutego 2017 przez 10kw10

Chcialbym zrobic tak ze obiekt obraca sie w strone gracza ale stopniowo, nie odrazu.

Napisalem cos takiego ale po wywolaniu program sie crashuje :D

double rotacja=(atan2(static_cast < double > (gracz.ob_gra.getPosition().y - bos[1].getPosition().y),static_cast < double > (gracz.ob_gra.getPosition().x - bos[1].getPosition().x) )*180.f/M_PI+40);
        while(bos[1].getRotation()!=rotacja)
        {
            if(rotacja>180)bos[1].rotate(-10);
            else bos[1].rotate(10);
        }

Prosze o pomoc ;)

komentarz 5 lutego 2017 przez niezalogowany
Czemu pętla while? Nie lepiej if jeżeli te instrukcje są w pętli gry? Pętla while taka jak jest teraz może się nigdy nie przerwać do tego.

Dlaczego do rotacji dodajesz na końcu 40 stopni? Ogólnie cała mechanika tego wymaga uzupełnienia. Kąt rotacja (kąt wektora położenia) i kąt z getRotation danego obiektu to dwie różnie zmieniające się rzeczy. By to okodować polecam przyjrzenie się jak one się zmieniają na kartce.
komentarz 5 lutego 2017 przez 10kw10 Pasjonat (22,880 p.)

Kod wyglada teraz tak:

double rotacja=(atan2(static_cast < double > (gracz.ob_gra.getPosition().y - bos[1].getPosition().y),static_cast < double > (gracz.ob_gra.getPosition().x - bos[1].getPosition().x) )*180.f/M_PI+40);
        if(!(bos[1].getRotation()-5<=rotacja && bos[1].getRotation()+5>=rotacja))
        {
            if(rotacja>180)bos[1].rotate(0.01);
            else bos[1].rotate(-0.01);
        }

lecz nie dziala zbyt dobrze.

Z whilem wydawalo mi sie lepsze.Instrukcje sa w metodzie. Wydaje mi sie ze mysle dobrze, rotacja czyli roznica miedzy "przodem" jednego obiektu do gracza, w ifie sie zmniejsza roznica az if bd falszywy.

Czemu 40 stopni? Zeby obiekt byl skierowany do srodka, a nie do pkt (0,0). W sumie to wpisywalem randomowe liczby, az wygladalo to przyzwoicie.

komentarz 5 lutego 2017 przez niezalogowany
Rotacja to stały kat wyliczany na podstawie położenia. Stałe położenie = stały kąt rotacja. Funkcją rotate zmieniasz kat ułożenia obiektów, a nie zmienną "rotacja":

https://zapodaj.net/7df1609252de0.jpg.html
komentarz 5 lutego 2017 przez 10kw10 Pasjonat (22,880 p.)
edycja 5 lutego 2017 przez 10kw10
tzn ze musze obliczyc dlugosc pomiedzy wektorem A, a wektorem B (wektor C)?

Czyli koniec A to poczatek C i koniec B to koniec C ? :D co ja pisze wgl ?

// jak ja ten obrazek rozumiem

wektor A to dlugosc od obiektu do "nowego" gracza

wektor B to dlugosc od obiektu do "starego" gracza

kat miedzy nimi ta kat obrotu obiektu. odleglosc trzeba zmniejszac az do wyniku 0, czyli jesli obiekt bedzie skierowany w strone gracza.

nowy gracz czyli tam gdzie aktualnie sie znajduje

stary gracz - tam gdzie sie znajdowal
komentarz 5 lutego 2017 przez niezalogowany

Musisz!!! Znaczy w tej koncepcji!!! Ogólnie z tego co mi się wydaje na podstawie tego kąta i tego kąta z [i].getRotation() jak sobie odpowiednio przyrównasz. Ja teraz na szybko zrobiłem taki kod:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <vector>
#include <cmath>

double M_PI = 3.14159;

int main()
{
    srand(time(NULL));
    sf::RenderWindow window(sf::VideoMode(1000, 800), "Czesc");
    window.setFramerateLimit(60);

    sf::RectangleShape rectangle1;
    std::vector<sf::RectangleShape> rect(4);

    rectangle1.setPosition(500, 400);
    rectangle1.setSize(sf::Vector2f(100, 30));
    rectangle1.setOrigin(50, 15);
    rectangle1.setFillColor(sf::Color::White);

    for(int i=0; i<rect.size(); i++)
    {
        rect[i].setSize(sf::Vector2f(100, 30));
        rect[i].setOrigin(50, 15);
        rect[i].setFillColor(sf::Color::Red);
        rect[i].setRotation(0);
    }

    rect[0].setPosition(500+100, 400+100);
    rect[1].setPosition(500-100, 400+100);
    rect[2].setPosition(500+100, 400-100);
    rect[3].setPosition(500-100, 400-100);

    int hipcio = 0;

    while(window.isOpen())
    {
        sf::Event event;
        while(window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed) window.close();
            if(event.type == sf::Event::KeyPressed)
            {
                if(event.key.code == sf::Keyboard::Escape) window.close();
            }
        }


        for(int i=0; i<rect.size(); i++)
        {
            double xx = rectangle1.getPosition().x - rect[i].getPosition().x;
            double yy = rectangle1.getPosition().y - rect[i].getPosition().y;

            double rotacja = atan2(yy,xx)*180.f/M_PI;
            double b = rotacja;
            double a = rect[i].getRotation();

            if(a != b)
            {
                if(yy>0)
                {
                    if(b-a>0)
                    {
                        rect[i].rotate(2);


                    }

                    if(b-a<0)
                    {

                        rect[i].rotate(-2);

                    }
                }
                else
                {
                    if(a-b<180)
                    {
                        rect[i].rotate(2);
                    }
                    if(a-b>180)
                    {
                        rect[i].rotate(-2);
                    }
                }
            }
        }

        window.clear();

        window.draw(rectangle1);
        for(int i=0; i<rect.size(); i++) window.draw(rect[i]);
        window.display();
    }

    return false;
}

Tylko coś prostego sknociłem, bo zakładałem, że przód każdego prostokąta to prawy bok. Natomiast te dolne obracają się jakoś nie w tą stronę... Może Ty znajdziesz błąd :)

komentarz 5 lutego 2017 przez 10kw10 Pasjonat (22,880 p.)
Up ;)
komentarz 5 lutego 2017 przez niezalogowany
Chyba więcej nie pomogę :)
komentarz 5 lutego 2017 przez 10kw10 Pasjonat (22,880 p.)
Juz chyba rozumiem. Jeszcze sie z tym przespie i bd git.

Dzieki wielkie ;)

A w sumie mam jeszcze jedno pytanie, czemu te kwadraty, jak sie juz odpowiednio ustawia, sie trzesa ? Troche to glupio wyglada.
komentarz 5 lutego 2017 przez niezalogowany

Ty u siebie uwzględniłeś to, ale ja zapomniałem. Gdy mamy powiedzmy warunek rob dopóki  == 0, to mając kat równy 0.001 to warunek nigdy nie zajdzie. Dlatego raz jest dodawany kąt, a raz odejmowany. To możesz zmodyfikować tutaj:

if(a != b) // chyba tutaj...

Ja jak coś więcej zrobię, albo lepiej to też się odezwę ;)

komentarz 6 lutego 2017 przez niezalogowany
@Hipcio dla czystego formalizmu wrzuć swoją odpowiedź do odpowiedzi pod pytaniem, to ja albo autor pytania dałby Ci najlepszą odpowiedź, aby ładnie oznaczyć że problem jest rozwiązany :)
komentarz 6 lutego 2017 przez 10kw10 Pasjonat (22,880 p.)

Dzwine... Gdy dam:

else
                {
                    if(a-b<360)
                    {
                        rect[i].rotate(-2);
                    }
                    if(a-b>361.01)
                    {
                        rect[i].rotate(-2);
                    }
                }

To wszystkie kreca sie dobrze ;/ Tylko ze dolne nigdy nie bd sie krecic w prawo.

komentarz 8 lutego 2017 przez niezalogowany
@shead problem tym razem nie jest rozwiązany...

@10kw10 nadal nie wiem co z tym zrobić dalej ;/
komentarz 8 lutego 2017 przez 10kw10 Pasjonat (22,880 p.)
chyba musze zmienic koncepcje celu gry, ale dzieki.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 805 wizyt
pytanie zadane 2 lipca 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)
0 głosów
0 odpowiedzi 84 wizyt
pytanie zadane 31 sierpnia 2017 w Systemy operacyjne, programy przez radzio31 Nowicjusz (240 p.)
–1 głos
1 odpowiedź 182 wizyt
pytanie zadane 6 lipca 2017 w C i C++ przez 10kw10 Pasjonat (22,880 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...