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

Prosty System Dialogów

Ostatnio zmodyfikowano 2024-06-06 02:26
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
» 2024-06-04 04:15:24
Myślę, że tak jak jest teraz, jest dobrze. Raczej już stylu zmieniać nie będę. Pozostało napisać scrolling i jakieś podstawowe skrypty.  

P-181184
tBane
Temat założony przez niniejszego użytkownika
» 2024-06-04 17:59:22

Scrollowanie chooseBox'a (chooseOption + scroll)
C/C++
if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) ) {
   
   
if( chooseOption == 0 && scroll > 0 )
       
 scroll -= 1;
   
else if( chooseOption > 0 )
       
 chooseOption -= 1;
   
}

if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) ) {
   
   
if( chooseOption + scroll < availableOptions.size() - 1 ) {
       
       
int maxScroll = availableOptions.size() - 5;
       
       
if( maxScroll < 0 )
           
 maxScroll = 0;
       
       
if( chooseOption >= 4 && scroll < maxScroll )
           
 scroll += 1;
       
else
           
 chooseOption += 1;
       
   
}
}

rendering chooseBox'a (i + scroll)
C/C++
void renderChooseBox( sf::RenderWindow * window ) {
   
sf::Texture dialogBoxTexture;
   
if( !dialogBoxTexture.loadFromFile( "assets/GUI/DialogBoxTexture.png" ) ) {
       
return;
   
}
   
   
sf::Sprite background;
   
background.setTexture( dialogBoxTexture );
   
background.setOrigin( dialogSize.x / 2.0f, dialogSize.y / 2.0f );
   
background.setPosition( view.getCenter().x, view.getCenter().y + screenHeight / 2.0f - dialogSize.y / 2.0f );
   
window->draw( background );
   
   
   
availableOptions.clear();
   
for( auto & o: currentDialogue->options ) {
       
if( o.condition && !o.condition() )
           
 continue;
       
       
availableOptions.push_back( o );
   
}
   
   
for( int i = 0; i < 5; i++ ) {
       
       
if( i + scroll >= availableOptions.size() )
           
 return;
       
       
sf::Text text = sf::Text( availableOptions[ i + scroll ].text, dialogBoxFont, characterSize );
       
if( i == chooseOption )
           
 text.setFillColor( sf::Color( 255, 201, 14 ) );
       
else
           
 text.setFillColor( textDialogueColor );
       
       
textPosition.x = background.getPosition().x - dialogSize.x / 2.f + padding;
       
textPosition.y = background.getPosition().y - dialogSize.y / 2.f + float( i ) * lineHeight + padding;
       
text.setPosition( textPosition );
       
       
window->draw( text );
       
   
}
   
   
}
P-181185
pekfos
» 2024-06-04 18:51:11
Wygląda jakby można było łatwo przegapić opcje na dole, bo nie wiadomo że jest ich więcej. Dodałbym wyświetlanie jakiejś strzałki w górę/dół w tych wypadkach.
P-181186
tBane
Temat założony przez niniejszego użytkownika
» 2024-06-04 18:54:35
To byłoby trudne, gdyż dialog zamykający ma być zawsze na samym dole. Ale to i tak dobry pomysł :-)
P-181187
tBane
Temat założony przez niniejszego użytkownika
» 2024-06-05 16:59:04
Przykładowy dialog:

"To jest testowa odpowiedź."
6, "Kim jesteś?"
7, "Co tutaj robisz?"
10, "Nauczysz mnie czegoś o polowaniu?"
8, "Mam skórę wilczura, chcesz ją odkupić?"
11, "Testowa opcja dialogowa"
-1, "Żegnaj"
P-181188
pekfos
» 2024-06-05 20:00:10
Trochę to wyrwane z kontekstu. Skąd wiadomo jaki numer ma ten konkretny dialog? Chyba nie masz pliku 4.txt z tym skryptem? Nie żeby coś, ale ludzie tworzą języki do konkretnych celów żeby sobie ułatwić życie, na przykład przez utrudnienie popełnienia błędu. Jak na razie główne zagrożenie jakie widzę to ręczne zarządzanie numerami, które wyglądają z kodu jakby były globalnymi identyfikatorami. Możesz zrobić typo w którym dialog z jednym NPC nieintencjonalnie przeskoczy na zupełnie inny dialog z zupełnie inną postacią i znajdziesz to dopiero w playtestach. Możesz temu zapobiec tak że jeden NPC to jest jeden plik, a numery w pliku są lokalne dla tego pliku. Parsując go sprawdzisz sobie czy wszystkie identyfikatory prowadzą do istniejących dialogów (i czy wszystkie są osiągalne), po czym przetłumaczysz lokalne identyfikatory na automatycznie nadane globalne identyfikatory.
P-181204
tBane
Temat założony przez niniejszego użytkownika
» 2024-06-05 21:33:03
tak właśnie zamierzałem zrobić. Stworzyć plik dla każdego ID dialogu. Wydawało mi się to logiczne oraz łatwe w wykonaniu
P-181215
pekfos
» 2024-06-05 22:23:29
A będzie łatwe w użyciu? Bo będziesz pewnie tego używać dużo więcej niż implementował. Jak to jest drzewko dialogowe, to może warto wyrazić to w pliku jako drzewo? Coś takiego wydaje się być łatwiejsze w użyciu:
5 "Czego chcesz?"
    "Kim jesteś?"
        "Jestem myśliwym. Poluję na zwierzynę."
    "Co tutaj robisz?"
        "Obecnie odpoczywam, ale gdy tylko zbiorę siły, ruszę na polowanie."
    "Nauczysz mnie czegoś o polowaniu?"
        "Bardzo chętnie, dam ci za nią miksturę leczniczą."
            "Proszę, oto skóra wilczura"
                "A to Twoja mikstura." 5
            "Może innym razem ... " 5
    "Żegnaj" -1
Kolejne wcięcia to odpowiedź, opcje, odpowiedź, opcje, itd. Opcja dialogowa bez podanego następnego dialogu mogłaby wracać do ostatniego menu. Identyfikator dialogu jest na początku linii z odpowiedzią i jest opcjonalny, jak go nie podasz to parser nada automatycznie jakiś niekolidujący.
P-181220
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona