MagicznyKacper Temat założony przez niniejszego użytkownika |
[SFML] Poruszanie się sprite'ów w danym obszarze. » 2012-10-10 17:58:47 Cześć. Natrafiłem na kolejny problem z którym nie mogę sobie poradzić, mianowicie. Grę praktycznie już skończyłem, ale pozostał mi do naprawienia jeden bug który pozwalał Sprite'om wylatywać poza okienko w eter. Napisałem do tego taki kod: if( left ) if( Box.GetPosition().x >= 0 ) { Box.Move( - 3, 0 ); } if( right ) if( Box.GetPosition().x <= 775 ) Box.Move( 3, 0 );
if( up ) if( Box.GetPosition().y >= 0 ) Box.Move( 0, - 3 );
if( down ) if( Box.GetPosition().y <= 575 ) Box.Move( 0, 3 );
if( left_key ) if( Box1.GetPosition().x >= 0 ) { Box1.Move( - 3, 0 ); } if( right_key ) if( Box1.GetPosition().x <= 775 ) Box1.Move( 3, 0 );
if( up_key ) if( Box1.GetPosition().y >= 0 ) Box1.Move( 0, - 3 );
if( down_key ) if( Box1.GetPosition().y <= 575 ) Box1.Move( 0, 3 );
Sterowanie Box1 odbywa się za pomocą klawiatury stąd końców _key. Jak w drugim przypadku (sterowanie klawiaturą) kod działa wręcz idealnie to w pierwszym mogę nadal przekroczyć lewą granicę okna. Co prawda czasami działa normalnie, czasami blokuje się w połowie a jeszcze innym razem przechodzi jak daleko chcę z tym, że trochę wolniej niż normalnie powinien się poruszać obrazek. Myślę, że napisałem dosyć zrozumiale, jeśli nadal nie wiadomo o co chodzi to po prostu napiszcie w komentarzach a postaram się wyjaśnić lub nagrać film. Z góry dziękuję za pomoc. |
|
Savail |
» 2012-10-10 18:38:04 a spróbuj dopisać se jeszcze takie zabezpieczenie że np: if( Box.GetPosition().x < 0 ) { Box.getPosition().x = 0 } Mnie takie rzeczy się zdarzały czasami gdy porównywałem zmienne różnych typów bez przeprowadzenia jawnej konwersji a tej domyślnej niekoniecznie można ufać. Więc jeśli GetPosition().x zwraca ci liczbę typu float to zamień ją na int lub 0 zamień na typ float (0.0f). |
|
MagicznyKacper Temat założony przez niniejszego użytkownika |
» 2012-10-10 18:50:36 Box.GetPosition().x zwraca int, przynajmniej tak wynika z konsoli. cout << Box.GetPosition().x << endl;
Także zamiana na float nic nie daje (testowałem). Nie specjalnie rozumiem na czym ma polegać to zabezpieczenie, bo wklepując Twój kod prosto do kompilatora wyrzuci błąd, a dodając kolejny znak równości tylko spowolni ruch w lewo za każdym razem, nawet jak jestem na środku `mapy`. |
|
Savail |
» 2012-10-10 18:57:49 Nie znam się na SFML'u więc nie wiem co zwraca ci te wywołanie: Box.GetPosition().x Założyłem, że te wywołanie zwraca ci referencję do zmiennej x, a jeśli wywala ci błąd to napisz jaki. I tak btw, to od czego zależy sterowanie pierwszego Boxa? Bo jeśli to jest bot to możliwe że coś w tym szwankuje i jeśli te zmienne left right... to są boole to powinieneś je ustawiać na false w chwili zetknięcia z granicą |
|
MagicznyKacper Temat założony przez niniejszego użytkownika |
» 2012-10-10 19:07:29 Błąd: .\main.cpp(76) : error C2039: 'getPosition' : is not a member of 'sf::Sprite' 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\SFML/Graphics/Sprite.hpp(44) : see declaration of 'sf::Sprite' 1>.\main.cpp(76) : error C2228: left of '.x' must have class/struct/union
Zwraca mi aktualną pozycję na osi x. Dodam, że nie działa po lewej stronie jak i dla po prawej (czyli po obu może wyjść poza ekran), Box1 i Box steruje człowiek. W bool'u jest to czy gracz nacisnął dany guzik czy nie. |
|
Savail |
» 2012-10-10 19:10:00 a czytałeś w ogóle te błędy?:p literówka się zdarzyła, powinieneś sam to zobaczyć |
|
MagicznyKacper Temat założony przez niniejszego użytkownika |
» 2012-10-10 19:11:49 Faktycznie, poprawiłem i o to co wyskoczyło. 1>.\main.cpp(76) : error C3892: 'sf::Drawable::GetPosition' : you cannot assign to a variable that is const |
|
Savail |
» 2012-10-10 19:14:18 Angielski to podstawa w rozpoznawaniu błędów i poprawianiu ich :P. Z tego wynika że ta funkcja zwraca ci wartość zmiennej x jako stałą a więc nie możesz jej modyfikować... |
|
« 1 » 2 |