Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Inventory - Czyli zawartość plecaka w grze RPG

Ostatnio zmodyfikowano 2024-08-15 17:08
Autor Wiadomość
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.

C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) {
   
cursor += itemsInRow; // values from 0 to (itemsInRow*itemsInCol)-1
   
   
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;
   
}
}
P-181391
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-03 20:10:29
Napisałem i działa.

C/C++
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 ?
P-181392
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?
P-181393
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

inwentarz
inwentarz
P-181394
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.

C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Enter ) ) {
   
// USE THE ITEM
   
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;
       
   
}
   
}
P-181395
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.
P-181397
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.

C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Enter ) ) {
   
// USE THE ITEM
   
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;
       
   
}
   
}

P-181398
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ę.
C/C++
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ć
C/C++
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.
P-181401
« 1 » 2 3 4
  Strona 1 z 4 Następna strona