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
» 2024-08-04 22:44:45
No właśnie testowałem na różne sposoby i ten kod mi działał. Nie znałem tego wzoru. Postaram się zapamiętać. Dzięki za pomoc mistrzu :-)
P-181402
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-05 16:47:08
Jeszcze buga znalazłem. Jak z prawego inventory przechodzę na lewy inventory to zaznacza puste pola. Pomożesz mi jeszcze z tym ?

noezgif
noezgif

C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) {
   
if( activePanel == activeInventoryPanel::Right ) {
       
// ACTIVE PANEL RIGHT
        // TO-DO
       
if( cursor % itemsInRow == 0 ) {
           
activePanel = activeInventoryPanel::Left;
           
cursor = cursor + itemsInRow - 1;
           
// tu muszę jakoś obliczyć cursor ...
       
}
       
else
           
 cursor -= 1;
       
   
}
   
else {
       
// ACTIVE PANEL LEFT
       
if(( cursor % itemsInRow != 0 ) )
           
 cursor -= 1;
       
   
}
}
P-181407
pekfos
» 2024-08-05 18:38:09
cursor i scroll razem dają indeks w wektorze przedmiotów, więc wiesz że wskazujesz na nieistniejący przedmiot i możesz kursor poprawić. A jak, to zależy jaki efekt chcesz uzyskać. Tylko czy nie byłoby lepiej utrzymywać 2 kursory i przełączać panele osobnym klawiszem? Pomyśl co by było jakby na lewym panelu był tylko 1 przedmiot. Logika dla przejścia na prawy panel w ogóle zadziała jak nie możesz dojechać do krawędzi? Nie wspominając ile trzeba klawiszy nacisnąć by przejść w jakieś miejsce na prawym panelu po każdym przejściu na lewy.
P-181408
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-05 18:43:13
cursor i scroll razem dają indeks w wektorze przedmiotów, więc wiesz że wskazujesz na nieistniejący przedmiot i możesz kursor poprawić.
No właśnie tylko jak poprawić cursor i scroll. Próbuję to sobie jakoś rozrysować i za każdym razem mi nie wychodzi :-/

Tylko czy nie byłoby lepiej utrzymywać 2 kursory i przełączać panele osobnym klawiszem? Pomyśl co by było jakby na lewym panelu był tylko 1 przedmiot.
Z przechodzeniem z inventoryLeft na inventoryRight nie mam problemu.

C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) {
   
   
if( activePanel == activeInventoryPanel::Left ) {
       
if( cursor + inventoryLeft->scroll * itemsInRow >= inventoryLeft->inventory->items.size() - 1 ) {
           
// tu jest rozwiązanie tego o czym wspomniałeś - przejście z lewego na prawy inventory gdy cursor wskazuje puste miejsce po ostatnim itemie
           
activePanel = activeInventoryPanel::Right;
           
cursor = cursor / itemsInRow * itemsInRow;
       
}
       
else if( cursor % itemsInRow == itemsInRow - 1 ) {
           
activePanel = activeInventoryPanel::Right;
           
cursor = cursor - itemsInRow + 1;
       
}
       
else {
           
cursor += 1;
       
}
       
    }
   
else {
       
       
if( cursor % itemsInRow != itemsInRow - 1 ) {
           
if( cursor + 1 + inventoryRight->scroll * itemsInRow < inventoryRight->inventory->items.size() )
               
 cursor += 1;
           
       
}
    }
   
}
P-181409
pekfos
» 2024-08-05 18:54:15
No właśnie tylko jak poprawić cursor i scroll. Próbuję to sobie jakoś rozrysować i za każdym razem mi nie wychodzi :-/
scrolla nie ruszaj bo masz przedmioty na widoku, chyba że przekroczyłeś jakimś sposobem maxScroll. Oblicz indeks który ci wyszedł i jak jest większy od indeksu ostatniego przedmiotu w panelu, to odejmij różnicę od cursor. To da zachowanie poprawne, ale niekoniecznie najlepsze/intuicyjne.
P-181410
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-05 19:07:18
Nie wiem czy o to chodziło, ale nie działa.

C/C++
if( cursor + inventoryLeft->scroll * itemsInRow >= inventoryLeft->inventory->items.size() ) {
   
cursor = cursor -( inventoryLeft->inventory->items.size() - inventoryLeft->scroll * itemsInRow );
}
P-181411
pekfos
» 2024-08-05 19:16:46
Nie o to chodziło. Miałeś porównać dwie rzeczy i obliczyć ich różnicę, a nie odejmujesz tych samych rzeczy.
C/C++
auto & items = inventoryLeft->inventory->items; // szkoda pisania
if( items.empty() )
   
 cursor = 0; // Nieistniejący przedmiot, ale nie ma przedmiotów w ogóle więc co poradzić
else
{
   
// Zamiast najpierw porównać potem odjąć, prościej najpierw odjąć i sprawdzić wynik
   
int diff = cursor + inventoryLeft->scroll * itemsInRow // indeks
   
-( items.size() - 1 ); // drugi indeks, nie rozmiar. Powinno wyjść zero jak już wskazujemy ostatni przedmiot
   
if( diff > 0 )
       
 cursor -= diff;
   
}
P-181412
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-05 19:25:52
Aaa takie coś. Dobra działa.  


C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) {
   
if( activePanel == activeInventoryPanel::Right ) {
       
// ACTIVE PANEL RIGHT
       
       
if( cursor % itemsInRow == 0 ) {
           
           
activePanel = activeInventoryPanel::Left;
           
           
if( inventoryLeft->inventory->items.size() == 0 )
               
 cursor = 0;
           
else {
               
cursor = cursor + itemsInRow - 1;
               
               
int diff = cursor + inventoryLeft->scroll * itemsInRow -( inventoryLeft->inventory->items.size() - 1 );
               
if( diff > 0 )
                   
 cursor -= diff;
               
           
}
        }
       
else
           
 cursor -= 1;
       
   
}
   
else {
       
// ACTIVE PANEL LEFT
       
if(( cursor % itemsInRow != 0 ) )
           
 cursor -= 1;
       
   
}
}
P-181413
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona