tBane Temat założony przez niniejszego użytkownika |
Inventory - Czyli zawartość plecaka w grze RPG » 2024-08-03 20:02:00 Witam. Próbuję jakoś napisać system scroll'owania przedmiotów w ekwipunku. Napisałem coś takiego, ale to nie działa tak jak powinno. if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) { cursor += itemsInRow; int maxScroll = inventory->inventory->items.size() / itemsInRow -( itemsInCol - 1 ); if( maxScroll < 0 ) maxScroll = 0; if( cursor >= itemsInRow * itemsInCol ) { inventory->scroll += 1; if( inventory->scroll > maxScroll ) inventory->scroll = maxScroll; cursor -= itemsInRow; } }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-08-03 20:10:29 Napisałem i działa. if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) { if(( cursor / itemsInRow * itemsInRow ) + itemsInRow < inventory->inventory->items.size() ) cursor += itemsInRow; int maxScroll = inventory->inventory->items.size() / itemsInRow -( itemsInCol - 1 ); if( maxScroll < 0 ) maxScroll = 0; if( cursor >= itemsInRow * itemsInCol ) { inventory->scroll += 1; if( inventory->scroll > maxScroll ) inventory->scroll = maxScroll; cursor -= itemsInRow; } }
Teraz mam jeszcze jedno pytanie. Jak ustawić scroll i cursor, gdy usuwamy jakiś item ? |
|
DejaVu |
» 2024-08-03 20:28:41 A czemu chcesz coś robić ze scrollem przy usuwaniu jakiegoś elementu? to tak istotne, aby lista się 'skurczyła' w realtime? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-08-03 20:32:25 Tak. Załóżmy, że zjadamy mięso w grze i jest to ostatni kawałek mięsa, który jest w inwentarzu. Po zjedzeniu mięsa cursor oraz scroll powinny ulec zmianie. Przed - cursor 18, scroll 1 Po - cursor 17, scroll 0 |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-08-03 20:47:01 Nie wiem jak na to wpadłem ale działa. if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Enter ) ) { useItem(); if( cursor + inventory->scroll * itemsInRow >= inventory->inventory->items.size() ) { int maxScroll =( inventory->inventory->items.size() - 1 ) / itemsInRow -( itemsInCol - 1 ); if( maxScroll < 0 ) maxScroll = 0; if( inventory->scroll > maxScroll ) { inventory->scroll -= 1; cursor = cursor + itemsInRow - 1; } else cursor -= 1; } }
|
|
pekfos |
» 2024-08-03 23:43:15 Ten kod może wprowadzać sytuację w której scroll > maxScroll. Może wprowadzać gracza w błąd jeżeli nie zerujesz scroll przy otwieraniu ekwipunku. Przykładowo scroll=2, cursor=0, zużyj wszystkie widoczne przedmioty poza jednym i wtedy scroll=2, maxScroll=0. Wygląda jakbyś miał jeden przedmiot, bo normalnie nie da się tak przewinąć widoku. Jak zużyjesz ostatni widoczny przedmiot, wtedy przesuwasz scroll tylko o 1. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-08-04 14:30:00 Tak jest poprawnie ? I przy każdym uruchomieniu panelu inwentarza ustawiam scroll=0. if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Enter ) ) { useItem(); if( cursor + inventory->scroll * itemsInRow >= inventory->inventory->items.size() ) { int maxScroll =( inventory->inventory->items.size() - 1 ) / itemsInRow -( itemsInCol - 1 ); if( maxScroll < 0 ) maxScroll = 0; if( inventory->scroll > maxScroll ) { cursor = cursor +( inventory->scroll - maxScroll ) * itemsInRow - 1; inventory->scroll = maxScroll; } else cursor -= 1; } }
|
|
pekfos |
» 2024-08-04 22:36:46 Skoro pytasz o poprawność, to nie. Gdy items jest puste, maxScroll to albo bardzo duża ujemna liczba, albo bardzo duża dodatnia, zależnie czy program jest budowany pod 32 czy 64 bitową architekturę. int maxScroll =( inventory->inventory->items.size() - 1 ) / itemsInRow -( itemsInCol - 1 );
Typowym wzorem na dzielenie z zaokrągleniem w górę jest (a + b - 1) / b. Matematycznie się zgadza z tym co masz, bo -(-1) na końcu odpowiada +b, ale się psuje przez to że masz 32/64-bitowe -1 bez znaku. Powinno być int maxScroll =( inventory->inventory->items.size() + itemsInRow - 1 ) / itemsInRow - itemsInCol;
A tak na serio to przetestuj dla różnych przypadków. Przecież nie będziesz pytać o każdy napisany kod czy jest poprawny. |
|
« 1 » 2 3 4 |