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

Przycinanie się poruszania

Object Storage Arubacloud
0 głosów
137 wizyt
pytanie zadane 22 czerwca 2016 w C i C++ przez niezalogowany

Witam, mam problem z poruszaniem się, takim płynnym, bez przycinania...(nie chodzi mi o płynne w sensie, że takie stopniowe przyśpieszanie/zwalnianie. Mam na myśli po prostu stałe poruszanie się bez ścinek) tak wygląda trochę mojego kodu

//sterowanie
                if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
                {
                    player.idz();
                }

                if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
                {
                    player.change_rotation(5);
                }else if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
                {
                    player.change_rotation(-5);
                }

i w player.cpp coś takiego:

void Player::change_rotation(int value)
{
 shape.setRotation(shape.getRotation()+value);
}




void Player::idz()
{
	float rotacja = shape.getRotation();
	vx = sin(( rotacja * 3.14 ) / 180.0f);
    vy = -cos(( rotacja * 3.14 ) / 180.0f );

	shape.move(speed*vx,speed*vy);
}

i postać się bardzo nienaturalnie porusza, tzn gdy kliknę a/d to robi taki jakby jeden obrót, chwila przerwy i robi ze zmienną prędkością reszte obrotów (w sensie zmiany rotacji) i podobnie z ruchem do przodu, mogę przytrzymać W i postać czasami się wcale nie rusza, po chwili szybko przyśpiesza, zwalnia, zacina się itp. Podczas tworzenia sugerowałem się projektem Szymona Siarkiewicza i albo coś schrzaniłem albo nie wiem... Próbowałem użyć komendy OknoAplikacji.setFrameLimit(); (oknoAplikacji - okno, na którym pracuje) ale to nic nie dało

dorzucam tutaj plik .h

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <windows.h>

#include <SFML/Graphics.hpp>

class Player
{
    sf::ConvexShape shape;
    float vx, vy;
public:
    int speed;
    Player();
    sf::ConvexShape return_shape();
    void idz();
    void change_rotation(int value);
};

 

1 odpowiedź

0 głosów
odpowiedź 22 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
wybrane 22 czerwca 2016
 
Najlepsza

Po pierwsze.. nie pobieraj rotacji z shape'u.. powinieneś stworzyć osobną zmienną float rotate, ponieważ rotacja obiektu to jest jego logika, a nie.. że tak powiem.. wizualność. Przy renderowaniu po prostu wykorzystujesz tą zmienną by pokazać obróconą figurę. Podobnie nie powinieneś brać pozycji gracza z pozycji jego grafiki.. grafika może mieć w przyszłości inną pozycję niż rzeczywiście ma gracz (#kamera). Ale to tak na przyszłość. 
Teraz do sedna.. 
Ruch postaci powinien odbywać się w sposób następujący:
Postać.x+=cos(Kąt_w_stopniach*Pi/180.0)*Speed;
Postać.y+=sin(Kąt_w_stopniach*Pi/180.0)*Speed;

Chociaż tak na prawdę używanie Speed sprawia, że obiekt będzie przemieszczał się skokowo.. inaczej mówiąc tyle ile wynosi speed to o tyle pikseli postać będzie się "teleportować". Nie jest to złe jednak przy sprawdzaniu kolizji można mieć problemy w stylu teleportowania się przez przeszkody (jeżeli speed będzie mieć za dużą wartość).
PRZYKŁADOWY KOD:

class Player
{
    sf::ConvexShape Shape;
    sf::Vector2f Pos;
    float Rotate;
    int Speed;
public:
    Player():Speed(2),Rotate(0),Pos(0,0){}
    void idz()
    {
        Pos.x+=cos(Rotate*3.14/180.0)*Speed;
        Pos.y+=sin(Rotate*3.14/180.0)*Speed;
    }
    void change_rotation(int value)
    {
        Rotate+=value;
    }
    void Draw(sf::RenderWindow &Window)
    {
        //Jakieś tam modyfikowanie tego Shape'a
        //Nanoszenie pozycji Shape.setPosition(Pos)
        //I rotacji Shape.setRotation(Rotate)
        //To jest w komentarzu ponieważ funkcje powyżej stosowałem dla zwykłego sf::RecktangleShape,
        //ale to powinno zachowywać sie podobnie (nie znam sf::ConvexShape)
        Window.draw(Shape);
    }
};


BTW. Wiesz, że warunki których używasz do sprawdzania, czy klawisz jest naciśnięty nie mają nic wspólnego z klasą Event.. czyt. możesz te warunki umieścić poza pętlą ponieważ funkcja sf::Keyboard::isKeyPressed pobiera dane bezpośrednio z klawiatury (sprawdza czy klawisz jest po prostu wciśnięty.. nie filtruje tego system. Z tego powodu nie ma tego denerwującego powtarzania klawisza (click -> przerwa -> powtarzanie) jak w np. edytorze tekstowym. Ale to taka ciekawostka.

1
komentarz 22 czerwca 2016 przez niezalogowany
Bezpośrednio nie odpowiedziałeś na problem, ale na końcu napisałeś o tym z wydarzeniami... i co się okazało? Cała sterowanie podpiąłem niechcący pod wydarzenia (pomyliłem po prostu miejsce między klamrami) i wystarczyło wyciąć i wklepać ten kod trochę niżej i wszystko smiga, aż zacząłem wszystko zmieniać na sprajty bo zwątpiłem czy te prymitywy działają tak jak należy haha, dzięki wielkie!

Podobne pytania

0 głosów
0 odpowiedzi 97 wizyt
pytanie zadane 28 czerwca 2020 w OpenGL, Unity przez Szyszka Gaduła (3,490 p.)
+1 głos
1 odpowiedź 100 wizyt
pytanie zadane 25 maja 2022 w Python przez kacper1445 Gaduła (4,880 p.)
0 głosów
2 odpowiedzi 857 wizyt
pytanie zadane 15 maja 2022 w Systemy operacyjne, programy przez Kamil Naja Nałogowiec (27,410 p.)

92,632 zapytań

141,500 odpowiedzi

319,879 komentarzy

62,012 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!

...