W jaki sposób powiązać klasy?

0

Cześć! Zastanawia mnie w jaki sposób mógłbym powiązać klasy tak, że mam klasy: Body, World, Player, GamplayScreen

class Body{
public:
Vector2D position;
Vector2D velocity;

void SetVelocityX(float vel)
{
	velocity.x = vel;
}
};
class World{
public:
World(float gravity){
	this->gravity = gravity;
}
void Update()
{
	body.velocity += gravity;
	body.position += velocity;
}
float gravity;
Body body;
};
class Player {
public:
void Update(){
	if(keyPressed(A)){
		body.SetVelocityX(-10.0f);
	} else if(keyPressed(D)){
		body.SetVelocityX(10.0f);
	}

}
void Draw(renderer)
{
	Rect rect;
	rect,x = body.position.x;
	rect.y = body.position.y;
	rect.w = 50; // tutaj przykładowa liczba
	rect.h = 50; // tu też
	renderer.Draw(rect);
}
Body body;
};
class GameplayScreen{
public:
GameplayScreen(){
	world = new World(gravity);
}
void Update(){
	world->Update();
}
const float gravity = 9.81f;

World * world;
};

Także, co tutaj się dzieje to, mamy 2 klasy Body i World, które są częścią silnika i 2 klasy które są częścią projektu. Klasa body odpowiada za kształt oraz fizykę i możemy dodać ją do każdego obiektu, do przeciwników, do skrzynki która spada skądś itd., a klasa World odpowiada za świat, czyli za update fizyki, grawitację itd, itd.

W jaki sposób stworzyć takie połączenie między nimi żeby działało mniej więcej w taki sposób jak pokazałem w kodzie wyżej?

0

Tak na szybko zastanówmy się:

  • Klasa player czy jaki kol wiek inny element świata może mieć body.
  • Klasa world musi na każdym z obiektów(np. o ile mają ustawione body) wykonać jakieś tam operacje.
    To teraz może tak na początek:
  • Gdzieś tam musi być klasa co trzyma instancje tych że obiektów
  • Klasa world musi się do tych obiektów dostać i jak rozumiem ma wykonać jakieś operacje, czyli powiedzmy pobrać i wykonać co się da.
  • To powiedzmy tak, miejmy jakiś rodzaj modelu w którym będziemy trzymać te nasze elementy(player z body).
  • Klasa body woła model i mówi tak, daj mnie obiekty które maja ustawione parametry body a ja na nich wywołam odpowiednie operacje. Czyli powiedzmy:
    std::vector<Object> objectsWithBody = model->getObjectsWithBody();
    world->runUpdate(objectsWithBody);

Tylko ogólnie zastanawia mnie cała twoja koncepcja programu. Lata temu czytałem https://gamebanana.com/tuts/11229 o podstawach silników.
Poczytaj też o wzorcu:
MVC,
-mediator może się przydać gdzieś.

  • Wzorzec fabryka na pewno się przyda
  • Poczytaj też o systemie eventów czy może nawet boost:::conect
  • Maszyna stanu
    to się może przydać do gier/silników.
0

Bo ogólnie to patrzyłem sobie jak jakiś koleś robił grę z silnikiem box2D i właśnie tam było coś podobnego i chciałem samemu coś takiego zrobić. Teraz możemy sobie zadać pytanie: "Ale po co, skoro sam przed chwilą powiedziałeś, że jest silnik box2D?". Właśnie po to by się nauczyć, spróbować czegoś nowego i mieć frajdę zamiast korzystać z gotowych rozwiązań. Sprawdzę wszystko co mi wysłałeś. Dzięki wielkie za odpowiedź

0

"W jaki sposób stworzyć takie połączenie między nimi żeby działało mniej więcej w taki sposób jak pokazałem w kodzie wyżej?" - czyli jak rozbić na klasy, jak tworzyć nowe obiekty?

Podział na początek może być, nie kombinuj od razu ze skomplikowanymi sprawami, poprawiaj w miarę wzrastania wymagań.

Tutaj istnieje ryzyko że możesz kilkakrotnie wczytywać tą samą teksturę w związku z czym pamięć zajmowana przez program może być duża, taką teksturę może wczytać raz jakiś obiekt klasy przechowującej zasoby i przekazywać ją do obiektów klasy body (jako wskaźnik oczywiście).

Obiekt klasy zasobów i obiekty typu skrzynka i inne takie tam (które zawierają body) na początek twórz w klasie World, oczywiście istnieje ryzyko że jakieś obiekty możesz wykorzystać w innym worldzie, ale na tym stopniu nie zaprzątałbym sobie tym głowy.

Jak chcesz możesz pokusić się o stworzenie między obiektami relacji na zasadzie czterowęzłowej listy (nie wiem jak to fachowo się nazywa), którą widziałem opisaną w tej książce: "https://helion.pl/ksiazki/opengl-programowanie-gier-kevin-hawkins-dave-astle,prgrop.htm#format/d" (stare wydanie, nie wiem jak teraz wygląda). Stworzyli tam klasę Node która posiadała wskaźnik do rodzica, dziecka, następnika, poprzednika a każda klasa po niej dziedziczyła.

0

Znaczy, ja wiem jak tworzyć klasy, zrobiłem sobie np. entity manager, screen manager, które polegają na właśnie obiektowości i polimorfiźmie (nie wiem cyz dobrze napisałem), więc nie jestem aż takim bobem w tych sprawach, tylko chciałbym stworzyć właśnie takie połączenie jak jest w box2D (chyba, że źle mi się wydaje, że w box2D jest mniej więcej tak jak pokazałem na początku, do kodu patrzyłem ale jest tam dużo tego i nie chce mi się szczerze przerabiać wszystkiego, bo zająłbym się sprawami, które aktualnie nie są mi potrzebne). Tzn. koleś tworzy pointer World i ta klasa Updateuje, dodaje grawitacje itd itd. wszystkim klasą które korzystają z klasy Body. Nie wiem czy dobrze to przedstawiłem.

0

Nie wiem o co chodzi z tym połączeniem i jak ono wygląda w box2D, w zasadzie przedstawiłeś mniej więcej podział na klasy i która w której się zawiera, może być.
Przetestuj sobie to rozwiązanie, stwórz jakąś prostą scenerię np drzewo z jabłkami gdzie po wciśnięciu spacji jabłka spadają, albo dodaj playera który podchodzi do drzewka i (uwaga brutalne!) kopie je po czym jabłka spadają, albo co tam sobie chcesz wymyślić, zobacz jak działa, zobacz co można poprawić (program zajmuje za dużo miejsca? wczytuj jednokrotnie teksturę, program się muli? zobacz czy nie da rady obliczeń uprościć do granic zdrowego rozsądku itp).

1 użytkowników online, w tym zalogowanych: 0, gości: 1