• 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
95 wizyt
pytanie zadane 6 sierpnia 2017 w C i C++ przez CPP_Newbie Użytkownik (780 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,270 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 (11,070 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 166 wizyt
pytanie zadane 15 września 2017 w C i C++ przez Artur Koniec Bywalec (2,170 p.)
0 głosów
1 odpowiedź 122 wizyt
pytanie zadane 13 października 2016 w C i C++ przez 10kw10 Pasjonat (23,020 p.)
0 głosów
1 odpowiedź 134 wizyt
pytanie zadane 2 września 2017 w JavaScript, jQuery, AJAX przez DODO Bywalec (2,960 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

64,023 zapytań

110,396 odpowiedzi

231,162 komentarzy

47,800 pasjonatów

Przeglądających: 140
Pasjonatów: 1 Gości: 139

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.

...