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

Przetwarzanie obiektów w grze

Ostatnio zmodyfikowano 2024-02-11 17:34
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
Przetwarzanie obiektów w grze
» 2024-02-10 19:33:54
Witam.
Wymyśliłem sobie wygodny sposób na przetwarzanie obiektów w grze. Czy jest to dobra praktyka czy nie. A jeżeli nie, to jaka byłaby lepsza.

C/C++
std::vector < GameObject * > gameObjects;
std::vector < Unit * > units;
std::vector < Building * > buildings;
std::vector < Nature * > natures;

C/C++
enum class type { none, unit, building, nature };

class GameObject
{
public:
   
float x, y, radius;
   
//sf::Texture* texture;
    //sf::Sprite* sprite;
   
   
GameObject( float, float, float );
   
~GameObject();
   
//void setTexture(sf::Texture*);
    //void update();
    //void render(sf::RenderWindow*);
};

class Unit
    : public GameObject
{
   
// villager, swordman
public:
   
Unit( float, float, float, type );
   
~Unit();
};

class Building
    : public GameObject
{
public:
   
// castle, house
   
Building( float, float, float, type );
   
~Building();
};

class Nature
    : public GameObject
{
public:
   
// tree, rocks,
   
Nature( float, float, float, type );
   
~Nature();
};
P-180719
pekfos
» 2024-02-10 20:01:01
Może lepiej byłoby trzymać jedną kolekcję elementów na bazie GameObject. Wtedy aktualizacja, renderowanie, itp to jedna pętla a nie kilka. Ale jak to co wymyśliłeś jest wygodne to rób tak, jak najbardziej.
P-180722
DejaVu
» 2024-02-10 20:17:05
Moim zdaniem najwygodniej mieć klasę bazową GameObject, która posiada wszystkie możliwe metody, których implementacja jest pusta (np. GetWeapon() zwraca null). Następnie gdy implementujesz jednostkę, która ma broń, to po prostu przeciążasz metodę GetWeapon() i zwracasz właściwą broń. Jeżeli jest to budynek to nic nie robisz i zwrócone zostanie null (brak broni).

W ten sposób pozbędziesz się problemu rzutowania na typ szczegółowy, więc wszędzie będziesz sobie pracował z GameObject i jedyne co będziesz musiał sprawdzać to czy "GetWeapon()" zwróciło null czy nie.
P-180723
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-10 21:04:35
Właśnie to próbuję osiągnąć - stworzyć "podstawkę" dla jednostek kilku typów : unit, building, natureObject, by potem móc w wygodny sposób chociażby je sortować co w renderingu jest istotne.  

W grze sterowalne mają być tylko jednostki.
Budynki i natureObject'y (kamienie, drzewa) są statyczne, ale osobne listy są wygodne w póżniejszym przetwarzaniu.
( np. drzewa rosną, budynki są zaznaczane lub animowane )
P-180724
DejaVu
» 2024-02-10 21:08:09
Jeżeli potrzebujesz sortowania 'pod rendering' to albo robisz grę 2D (good enough), albo masz modele 3d i nigdy nie zadziała Ci poprawnie rozwiązanie dopóki nie włączysz bufora Z-index w OpenGL-u.
P-180725
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-10 21:31:12
Teraz robię grę 2D "Village". Ma to być gra strategiczna RTS. Gra będzie polegała na tworzeniu robotników oraz przydzielaniu im zadań takich jak wycinka drzew, pozyskiwanie kamienia. Robotnicy oprócz wydobywania tych surowców będą je także dostarczać do siedziby głównej gracza po zebraniu. Gracz wygrywa gdy stworzy odpowiednią ilość robotników.

Jestem newbie w programowaniu, obecnie przerabiam tutoriale z Unity, by lepiej zrozumieć mechanikę RTS.
P-180726
DejaVu
» 2024-02-11 10:41:33
Jeżeli masz grę stricte 2D, to obiekty nie powinny na siebie nachodzić, więc sortowanie nie powinno być Ci w ogóle potrzebne. Chyba, że chcesz mieć warstwy, to wówczas możesz dodać z-index do każdego obiektu i sortować cały kontener po Z-index. Dopiero jak stwierdzisz, że to rozwiązanie jest 'za wolne' to możesz myśleć jak optymalizować kod. Przedwczesna optymalizacja zwiększa istotnie złożoność kodu, a ta szybko komplikuje wytwarzanie oprogramowania i wykonywanie zmian w konceptach. Im mniej kodu tym łatwiej robić adaptacje.
P-180728
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-11 17:34:45
Dziękuję za rady :-)
P-180729
« 1 »
  Strona 1 z 1