• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Implementacja systemu kolizji w SFML - OOP

VPS Starter Arubacloud
0 głosów
217 wizyt
pytanie zadane 6 sierpnia 2017 w C i C++ przez CPP_Newbie Użytkownik (770 p.)

Witam,

Bawię się SFML i piszę, a raczej próbuję napisać prostego Arkanoida. Na chwilę obecną działa ruch piłki i odbijanie się od krawędzi ekranu oraz sterowanie paletką. Piszę OOP i mam dylemat jak zaimplementować system kolizji dla piłka-paletka oraz piłka-blok/klocek? Posiadam klasę Game (główna klasa), Paddle oraz Ball.

Gdzie powinienem umieścić kod odpowiedzialny za sprawdzanie kolizji? W klasie Game i w niej sprawdzać obiekt Paddle i Ball? A może powinienem utworzyć nową klasę, przesłać do niej obiekty Paddle i Ball? Być może głupie pytanie, ale nie mogę tego ogarnąć...

Pytanie nr 2. Do blokowania piłki i paletki w obszarze ekranu potrzebuję zmiennej WIDTH, która znajduje się w Game.hpp W chwili obecnej uczyniłem ją statyczną przez co mogę się odwołać do niej w klasach paletki i piłki, ale muszę dołączać plik nagłówkowy Game.hpp do po tych klas. Czy można ten problem rozwiązać inaczej?

 

Zamieszczam kod, dla zobrazowania jak to wygląda w tej chwili.

#include "Ball.hpp"
#include "Game.hpp"


Ball::Ball(float posX, float posY, float radius)
	:position(posX, posY)
{
	ballVelocity = 8.f;
	velocity = { -ballVelocity, -ballVelocity };
	
	shape.setRadius(radius);
	shape.setPosition(posX, posY);
	shape.setFillColor(Color::Red);
	shape.setOrigin(radius, radius);
}


Ball::~Ball()
{
}

void Ball::update()
{
	shape.move(velocity);

	// Left side of ball
	if (shape.getPosition().x - shape.getOrigin().x < 0)
		velocity.x = ballVelocity;
	// Right side of ball
	if (shape.getPosition().x + shape.getOrigin().x > WIDTH)
		velocity.x = -ballVelocity;
	// Top side of ball
	if (shape.getPosition().y - shape.getOrigin().y < 0)
		velocity.y = ballVelocity;
	// Bottom side of ball
	if (shape.getPosition().y + shape.getOrigin().y > HEIGHT)
		velocity.y = -ballVelocity;
}

void Ball::draw(RenderWindow & window)
{
	window.draw(shape);
}
#include "Paddle.hpp"
#include "Game.hpp"



Paddle::Paddle(float posX, float posY, Vector2f size)
{
	paddleVelocity = 6.f;
	
	shape.setSize(size);
	shape.setPosition(posX, posY);
	shape.setFillColor(Color::Red);
	shape.setOrigin(size.x / 2, size.y / 2);
}

void Paddle::update()
{
	shape.move(velocity);
	
	if (Keyboard::isKeyPressed(Keyboard::Left) && shape.getPosition().x - shape.getOrigin().x > 0)
		velocity.x = -paddleVelocity;

	else if (Keyboard::isKeyPressed(Keyboard::Right) && shape.getPosition().x + shape.getOrigin().x < WIDTH)
		velocity.x = paddleVelocity;
	else
		velocity.x = 0;
}

void Paddle::draw(RenderWindow & windows)
{
	windows.draw(shape);
}

 

komentarz 6 sierpnia 2017 przez Munvik Dyskutant (9,350 p.)

Zrób może precompiledHeader i wrzuć do niego Game.hpp i zrób funkcję

sf::Vector2f getScreenSize()
{
  return Game::ScreenSize;
}

albo możesz na sztywno ustawić dyrektywę 

#define WIDTH 1920
#define HEIGHT 1080

1 odpowiedź

0 głosów
odpowiedź 6 sierpnia 2017 przez PoetaKodu Stary wyjadacz (10,990 p.)
Do fizyki tworzy się silniki fizyczne - w Twoim przypadku może być to zwykła klasa, może być singleton, np. "PhysicsWorld" do którego dodasz wskaźniki na odpowiednie elementy fizyczne. Potem metodą update odpowiednio będziesz aktualizował pozycję oraz prędkość danych elementów.

Podobne pytania

0 głosów
0 odpowiedzi 215 wizyt
pytanie zadane 28 listopada 2020 w C i C++ przez Mateusz1223 Bywalec (2,440 p.)
–1 głos
2 odpowiedzi 357 wizyt
pytanie zadane 15 września 2017 w C i C++ przez Artur Koniec Gaduła (3,670 p.)
0 głosów
1 odpowiedź 380 wizyt
pytanie zadane 13 października 2016 w C i C++ przez 10kw10 Pasjonat (22,880 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...