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

[SFML 2] System przedmiotów i ekwipunku

Ostatnio zmodyfikowano 2015-10-02 11:05
Autor Wiadomość
qest43
Temat założony przez niniejszego użytkownika
[SFML 2] System przedmiotów i ekwipunku
» 2015-09-10 20:10:21
Zastanawiam się jak stworzyć system ekwipunku w grze. Będzie przykładowo kilka typów przedmiotów, -broń, -ubranie, -jadalne. Myślę żeby stworzyć klasę Items a w tym funkcję wirtualne, passive i active, pasywne efekty w pętli zawsze by działały, a aktywne po wciśnięciu danego przycisku. Ale przykładowo weźmy typ -jadalne:

Są 3 eliksiry życia:
-Pierwszy dodaje 10 HP
-Drugi dodaje 20HP
-Trzeci 10 many

czyli jak to teraz rozwiązać. Stworzyć klasy HealthPotion,ManaPiotion, i tak do każdego nowego przedmiotu który różni się działaniem?
Wiem że to też zależy od projektu, ale to moja ogólna wizja, chce się upewnić czy to dobry pomysł, czy macie jakieś inne uwagi lub pomysły. Bo jak jest 50 typów eliksirów to czy 50 klas najlepiej stworzyć, czy w jednej klasie Potion jakiś switch po prostu?
P-137407
RazzorFlame
» 2015-09-10 21:03:44
C/C++
class Item
{
public:
    bool bUsable, bWearable;
    class Bonus
    {
    public:
        enum
        {
            BONUS_ADD_HP = 0,
            BONUS_ADD_MP
        };
        short Type;
        int Count;
    };
    Bonus ItemBonus;
    Item() { }
    void Use( Actor * ArgActor )
    {
        if( bUsable )
        {
            ArgActor->GetBonus( ItemBonus );
        }
        else std::cout << "Cannot use not usable item!" << std::endl;
       
    }
};

class Actor
{
public:
    Actor() { }
    void GetBonus( Item::Bonus & ArgBonus )
    {
        switch( ArgBonus.Type )
        {
        case Item::Bonus::BONUS_ADD_HP:
            {
                this->AddHealth( ArgBonus.Count );
                break;
            }
        case Item::Bonus::BONUS_ADD_MP:
            {
                this->AddMana( ArgBonus.Count );
                break;
            }
        }
    }
};
P-137408
Piastlis
» 2015-09-11 23:27:28
Moim zdaniem nie powinieneś na tym etapie zajmować się interpretacją konkretnych przedmiotów wyposażenia tylko stworzyć jednolity system wszystkich elementów w grze.Do reprezentacji powinna wystarczyć jedna liczba  unsigned long long czyli 8 bajtów.Powiedzmy pierwsze 2 bajty czyli 65536 to rodzaj elementu. Drugie 2 bajty to opis właściwości : magiczny-niemagiczny,przenośny-nieprzenośny,pływający-niepływający.. itd.Pozostają jeszcze 4 bajty do opisania np masy ,mocy magicznej lub bojowej i co tam innego będzie potrzebne.Widziałbym potrzebę stworzenia 2 reprezentacji: pojedynczej (miecz) i przedmiotów które mogą zawierać inne(magiczna sakwa ,kołczan na strzały lub jaskinia). Oczywiście bohaterowie też muszą posiadać taki opis.  
P-137432
RazzorFlame
» 2015-09-12 18:25:16
@Piastlis - twój system jest bardzo ograniczony, bardzo nieefektywny i do tego bardzo nieporęczny. Autor nie powinien bawić się w takie rzeczy, z resztą nikt nie powinien.  To jest bardzo słaby pomysł. Ciekawe w jaki sposób zapiszesz nazwe przedmiotu do unsigned long long. Zapewne będzie to coś w stylu:
C/C++
std::string NazwyPrzedmiotow[] = { "Potion", "Costam", "Sakwa" };
I potem zapisywanie numeru elementu tablicy.
Głupotą jest utrudnianie sobie życia bez żadnego sensu.
P-137443
Piastlis
» 2015-09-12 23:29:47
@RazzorFlame nie mam pojęcia dlaczego myślisz że ten system jest ograniczony.65536 elementów i każdy ma 281474976710656 "cech". Jeżeli uważasz że to ci nie pasuje to możesz zastosować inny podział i większą zmienną.(Słyszałeś o czymś takim jak struktura,unia,vector?) 
P-137461
RazzorFlame
» 2015-09-15 16:31:13
Jeżeli uważasz, że
każdy ma 281474976710656 "cech"
 to bardzo sie mylisz. Liczba Unsigned Long Long to 2^64, jeżeli zabierzesz te 65536 czyli 2^16 wychodzi że zostawiasz sobie 48 bitową liczbę dwójkową. Zapiszesz w niej 48 flag lub pare 16 bitowych liczb.
P-137535
Piastlis
» 2015-09-15 21:18:56
Akurat 2^48 to 281474976710656.Myślę że źle ten system wytłumaczyłem.Zacznę od formy najprostszej.Powiedzmy że chcę wprowadzić od programu kilka "didaskaliów".Punkty siły i many.Tak przy okazji pierwszy pomysł to broń: miecz,pistolet,karabin.Więc w każdym elemencie mapy dodaję zmienną char która określa jaka "didaskalia" się tam znajduje:
0 - nic nie na
1 - siła + 20
2 - siła + 40
3 - mana + 20
4 - mana + 40
5 - miecz
6 - pistolet
7 - karabin
Moim zdaniem nie ma potrzeby tworzyć osobnych obiektów tylko potraktować je wszystkie zbiorczo.To tylko drobne modyfikacje obiektu "gracz". Dla grafiki i fonii też wszystko jest jasne (czy didaskalia jest ma mapie czy w wyposażeniu).
Wprowadźmy kodowanie( 2 znaki char czyli unsigned short):
0-0 - nic nie ma
1  - siła 0-255 punkty do dodania
2  - mana 0-255 punkty do dodania
3  - rodzaj broni
I tak dalej.
   
P-137547
michal11
» 2015-09-15 23:25:26
Nie jestem ekspertem, ale jak bym dostał od ciebie taki kod ew. pomysł z przykładami to bym się bardzo zdenerwował próbując rozszyfrować jak działa ten twój system i co oznacza jakaś konkretna liczba.
P-137552
« 1 » 2 3
  Strona 1 z 3 Następna strona