I am implementing the simple game “Connect Four” and want to detect the presence of a stationary disc immediately below a falling disc as criteria for the falling disc to stop.
I am using the presence of a CircleShape with radius != 0 (the default constructor value) directly below the dropping disc as the collision criteria. I expected the dropping disc to stop directly over the stationary disc. Instead, the criteria is ignored and the dropping disc continues past the stationary disc and stops at the bottom of the window as would be expected if there had been no stationary disc in its path.
#include <iostream>
#include <SFML/Graphics.hpp>
#include <vector>
#include <windows.h>
const int ROWS = 4;
const int COLUMNS = 4;
const float DISC_RADIUS = 50.0f;
const sf::Color CIRCLE_COLOR = sf::Color::Red;
const float DISC_SPEED = 1.0f;
const int WINDOW_WIDTH = 2 * DISC_RADIUS * COLUMNS;
const int WINDOW_HEIGHT = 2 * DISC_RADIUS * ROWS;
sf::CircleShape droppingDisc(DISC_RADIUS);
int selectedColumn;
std::vector<std::vector<sf::CircleShape>> discs(ROWS, std::vector<sf::CircleShape>(COLUMNS));
int main()
{
//std::cout << "Column?";
//std::cin >> selectedColumn;
selectedColumn = 1;
discs[1][2].setRadius(DISC_RADIUS);
discs[1][2].setFillColor(sf::Color::Blue);
discs[1][2].setPosition(100, 200);
sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Connect Four");
window.setFramerateLimit(60);
droppingDisc.setFillColor(sf::Color::Red);
droppingDisc.setPosition((2 * DISC_RADIUS * (selectedColumn)), 0);
bool droppingDiscStopped = false;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();// initiates built-in SFML memory cleanup
}
if (!droppingDiscStopped)
{
if (droppingDisc.getPosition().y < WINDOW_HEIGHT - 2 * DISC_RADIUS) //test for hitting bottom
{
droppingDisc.move(0, DISC_SPEED); //move arguments are x and y offsets per frame
}
else
{
int rowBelowDroppingDisc = static_cast<int>((droppingDisc.getPosition().y + DISC_RADIUS) / (2 * DISC_RADIUS));
std::cout << "row below dropping disc = " << rowBelowDroppingDisc;
if (rowBelowDroppingDisc < ROWS &&
discs[selectedColumn][rowBelowDroppingDisc].getRadius() != 0)
{
std::cout << " directly above stationary disc " << 'n';
sf::CircleShape newStationaryDisc;
newStationaryDisc.setRadius(DISC_RADIUS);
newStationaryDisc.setFillColor(droppingDisc.getFillColor());
newStationaryDisc.setPosition(droppingDisc.getPosition());
discs[selectedColumn][rowBelowDroppingDisc] = newStationaryDisc;
}
droppingDiscStopped = true;
}
// Draw
window.clear();
window.draw(droppingDisc);
for (int i = 0; i < ROWS; ++i)
{
for (int j = 0; j < COLUMNS; ++j)
{
window.draw(discs[i][j]);
}
}
window.display();
}
}
return 0;
}