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

System Prefabrykatów

Ostatnio zmodyfikowano 2024-05-05 23:11
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
System Prefabrykatów
» 2024-05-04 19:58:39
Witam.
Próbuję dodać system prefabrykatów do mojej gry i nie wiem jak to zrobić. Wyskakuje mi błąd z konwersją:


C:\Users\tBane\Desktop\tBane\sources&programs\RPG2D\main.cpp Błąd 125 C2665 „Nature::Nature”: żadna przeciążona funkcja nie może przekonwertować wszystkich typów argumentów RPG  


C/C++
std::vector < GameObject * > prefabs;
std::vector < GameObject * > gameObjects;

prefabs.push_back( new Nature( "tree1", 32 ) );
gameObjects.push_back( new Nature( prefabs[ 0 ], 100, 50 ) );

C/C++
class Nature
    : public GameObject
{
public:
   
Texture * texture;
   
sf::Sprite * sprite;
   
   
Nature( string name, float radius )
        :
GameObject( name, 0, 0, radius )
   
{
       
this->texture = getTexture( name );
       
sprite = new sf::Sprite();
       
sprite->setTexture( * texture->texture );
       
sprite->setOrigin( texture->cx, texture->cy );
   
}
   
   
Nature( Nature * object, float x, float y )
        :
GameObject( object->name, x, y, object->radius )
   
{
       
this->texture = object->texture;
       
sprite = new sf::Sprite();
       
sprite->setTexture( * texture->texture );
       
sprite->setOrigin( texture->cx, texture->cy );
       
   
}
   
   
~Nature() { }
   
   
void update() {
       
sprite->setPosition( x, y );
       
collider->setPosition( x, y );
       
   
}
   
   
void render( sf::RenderWindow * window ) {
       
window->draw( * collider );
       
window->draw( * sprite );
       
   
}
}
;

P-181004
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-04 20:11:44
zrobiłem coś takiego i działa. Ale co w przypadku gdybym chciał kopiować teksturę od Nature* object ?

C/C++
Nature( GameObject * object, float x, float y )
    :
GameObject( object->name, x, y, object->radius )
{
   
this->texture = getTexture( name );
   
sprite = new sf::Sprite();
   
sprite->setTexture( * texture->texture );
   
sprite->setOrigin( texture->cx, texture->cy );
   
}
P-181005
DejaVu
» 2024-05-05 10:32:12
Polecam zainwestować Ci w ChatGPT 4 - będziesz przynajmniej miał odpowiedzi od ręki i zdobędziesz nowe umiejętności. ChatGPT 4:
Wygląda na to, że chcesz, aby obiekt `Nature` dziedziczył po obiekcie `GameObject` i kopiował jego teksturę. W Twoim konstruktorze klasa `Nature` przyjmuje wskaźnik na obiekt `GameObject` i używa jego atrybutów do zainicjowania samego siebie.

Jeśli chcesz skopiować teksturę z innego obiektu `Nature`, musisz zadbać, żeby twoja funkcja `getTexture(name)` była w stanie obsłużyć kopie tekstur pomiędzy różnymi obiektami tej samej klasy lub różnych klas.

Jeśli funkcja `getTexture` oczekuje tylko nazwy tekstury i zwraca nowy obiekt tekstury na podstawie tej nazwy, może być konieczne dodanie funkcjonalności do kopiowania istniejącej tekstury. Możesz to zrobić na przykład tak:

1. **Dodaj opcję kopiowania tekstury w funkcji `getTexture`:**
   - Jeśli funkcja `getTexture` obecnie nie wspiera kopiowania tekstury (tylko tworzy nową teksturę na podstawie nazwy), możesz dodać opcję, która pozwala na klonowanie istniejącej tekstury zamiast tworzenia nowej. To może być przydatne, jeśli tekstury są kosztowne do ładowania i chcesz ograniczyć zużycie pamięci.

2. **Modyfikacja konstruktora klasy `Nature`:**
   - Jeśli chcesz umożliwić kopiowanie tekstury z innego obiektu `Nature`, możesz przekazać bezpośrednio obiekt tekstury do konstruktora `Nature` i użyć go bezpośrednio zamiast wywoływać `getTexture`.

Przykładowa zmiana w konstruktorze, jeśli chcesz kopiować teksturę z istniejącego obiektu:
```cpp
Nature(GameObject *object, sf::Texture* existingTexture, float x, float y)
    : GameObject(object->name, x, y, object->radius)
{
    // Jeśli existingTexture jest nullptr, załaduj nową teksturę
    this->texture = existingTexture ? existingTexture : getTexture(object->name);

    sprite = new sf::Sprite();
    sprite->setTexture(*this->texture);
    sprite->setOrigin(this->texture->cx, this->texture->cy);
}
```

Takie podejście pozwala na elastyczność w zarządzaniu teksturami, gdzie możesz albo przekazać istniejącą teksturę do nowo tworzonego obiektu, albo załadować nową, jeśli taka jest potrzebna.
P-181007
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-05 15:56:55
Już zakupiłem Chat GPT 4. Jednak czasem wolę dostać radę od doświadczonego programisty, czy aby na pewno programuję w dobrym kierunku.

ok. czyli musialbym coś takiego zrobić - niewygodne.

C/C++
Nature( GameObject * object, Texture * texture float x, float y )
    :
GameObject( object->name, x, y, object->radius )
{
   
this->texture = texture;
   
sprite = new sf::Sprite();
   
sprite->setTexture( * texture->texture );
   
sprite->setOrigin( texture->cx, texture->cy );
   
}

pozostanę przy tej opcji jednak :

C/C++
Nature( GameObject * object, float x, float y )
    :
GameObject( object->name, x, y, object->radius )
{
   
this->texture = getTexture( name );
   
sprite = new sf::Sprite();
   
sprite->setTexture( * texture->texture );
   
sprite->setOrigin( texture->cx, texture->cy );
   
}
P-181008
DejaVu
» 2024-05-05 22:40:08
Jeżeli masz wątpliwości to podziel się nimi z ChatGPT tak jak byś się dzielił z kimś 'doświadczonym'. Możesz kwestionować nawet elementy, które Ci się nie podobają w obecnej implementacji, pisać co uważasz, że będzie Ci trudno zaimplementować przy obecnym rozwiązaniu i ChatGPT zacznie dostosowywać rozwiązanie, aby uwzględnić Twoje preferencje.

Ja bym w Twoim rozwiązaniu do zarządzania jednostkami dążył do tego, aby mieć klasę np. GameObject, która dostarcza wszystkie metody typu getWeapon, attackObject(GameObject*) itp. Wszystkie metody byłyby wirtualne z domyślną 'pustą' implementacją, a potem w obiektach potomnych typu Tree, Player itd. implementowałbym metody, których potrzebuję. Ponadto zadbałbym o to, aby mieć kontener obiektów np. GameObjects, w którym miałbym metody w stylu insertObject/eraseObject/getObjectsAtArea(sf::FloatRect) itp, aby zapewnić łatwe dodawanie/usuwanie/pobieranie wszystkich obiektów w grze.

Generalnie jak masz jakieś wątpliwości lub coś Ci się nie spina koncepcyjnie to po prostu pytaj ChatGPT. Moje doświadczenie mówi, że otrzymasz porady na dobrym poziomie od AI.
P-181012
pekfos
» 2024-05-05 22:45:07
Wygląda jak więcej zachodu niż pożytku. Co tu rozpisujesz, to jest kopiowanie obiektu więc najlepszym punktem wyjścia byłby poprawny konstruktor kopiujący. Gdyby nie trzymanie sf::Sprite przez wskaźnik (????), mógłby być domyślny. Osobiście nie widzę sensu w używaniu prefabrykatu piernika do tworzenia wiatraka, więc może to powinno wyglądać tak, z podziałem na typy:
C/C++
std::vector < Nature * > prefabsNature;
std::vector < GameObject * > gameObjects;

prefabsNature.push_back( new Nature( "tree1", 32 ) );
gameObjects.push_back( new Nature( prefabsNature[ 0 ], 100, 50 ) );
Jeśli chcesz mieć je wszystkie razem, to możesz zrobić dynamic_cast<> na właściwy typ i oczywiście obsługa błędu jeśli typ jest niewłaściwy.
C/C++
class Nature
    : public GameObject
{
public:
   
Texture * texture;
   
sf::Sprite sprite; // Po co był ten wskaźnik?? Jak ma być, trzeba zapewnić poprawne kopiowanie i zwalnianie pamięci.
   
   
Nature( const Nature & ) = default;
   
   
   
Nature( string name, float radius )
        :
GameObject( name, 0, 0, radius )
   
{
       
this->texture = getTexture( name );
       
//sprite = new sf::Sprite();
       
sprite.setTexture( * texture->texture );
       
sprite.setOrigin( texture->cx, texture->cy );
   
}
   
   
Nature( Nature * object, float x, float y )
        :
Nature( * object ) // delegacja do kons. kopiującego
   
{
       
sprite.setPosition( x, y ); // Cokolwiek GameObject robiło z x,y
   
}
}
;
P-181013
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-05 22:58:03
nic z tego nie rozumiem. Obecnie mam zrobione coś takiego, że mogę tworzyć GameObject na podstawie prefabrykatu.

C/C++
void loadPrefabs() {
   
   
// trees
   
prefabs.push_back( new Nature( "tree1", 32 ) );
   
prefabs.push_back( new Nature( "tree2", 32 ) );
   
prefabs.push_back( new Nature( "tree3", 26 ) );
}

void createGameObjects() {
   
   
// trees
   
gameObjects.push_back( new Nature( getPrefab( "tree1" ), 100, 50 ) );
   
gameObjects.push_back( new Nature( getPrefab( "tree2" ), 260, 170 ) );
   
gameObjects.push_back( new Nature( getPrefab( "tree3" ), 100, 400 ) );
}
P-181017
DejaVu
» 2024-05-05 22:59:01
Tworzenie obiektów jest mega proste. Problemy zaczną Ci się, gdy będziesz musiał te obiekty usuwać lub wywoływać jakieś akcje na nich :)
P-181018
« 1 » 2
  Strona 1 z 2 Następna strona