• 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

0 głosów
100 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 (8,450 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,950 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

–1 głos
2 odpowiedzi 168 wizyt
pytanie zadane 15 września 2017 w C i C++ przez Artur Koniec Bywalec (2,180 p.)
0 głosów
1 odpowiedź 126 wizyt
pytanie zadane 13 października 2016 w C i C++ przez 10kw10 Pasjonat (22,750 p.)
0 głosów
1 odpowiedź 135 wizyt
pytanie zadane 2 września 2017 w JavaScript, jQuery, AJAX przez DODO Bywalec (2,930 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

66,367 zapytań

113,109 odpowiedzi

239,403 komentarzy

46,622 pasjonatów

Przeglądających: 297
Pasjonatów: 8 Gości: 289

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...