| 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 |