Witam, kiedy gracz jest w powietrzy kolizja zostaje powinna być wykryta dla każdego 5 prostokątów które poruszają się raz w prawo raz w lewo. W moim przypadku kolizja wykryta jest tylko dla jednego. Dlaczego? Próbowałem też dodać zmienną "is_colliding" w postaci tablicy, ale z kolei kiedy sprawdzam kolizję dla każdego obiektu w pętli to gracz skaczę na bardzo małą wysokość o praktycznie od razu opada na ziemię.
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <vector>
#include <SFML/Graphics.hpp>
const int WINDOW_WIDTH = 800, WINDOW_HEIGHT = 800;
const float GRAVITY = 0.07f;
int index = 0;
float player_velocityX = 0.0f, player_velocityY = 0.0f;
float player_pos_X = 400.0f, player_pos_Y = 600.0f;
float platform_velocity = 0.1f;
bool is_on_ground = true, space_pressed = false, is_colliding = false;
bool touched_platform[] = {
false, false, false, false, false
};
template <typename T>
void remove_at(std::vector<T>& v, typename std::vector<T>::size_type n)
{
std::swap(v[n], v.back());
v.pop_back();
}
int main()
{
sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Jumping UP");
window.setVerticalSyncEnabled(true);
std::vector<sf::RectangleShape> vect_of_platforms;
std::vector<float> platforms_velocity = {
platform_velocity, platform_velocity, platform_velocity, platform_velocity, platform_velocity,
};
sf::View main_view;
main_view.setSize(800, 800);
main_view.setCenter(400, 400);
sf::CircleShape player(30.0f);
player.setFillColor(sf::Color::Blue);
player.setPosition(player_pos_X, player_pos_Y);
srand(time(NULL));
for (int i = 0; i < 5; i++)
{
sf::RectangleShape platform(sf::Vector2f(100.0f, 30.0f));
platform.setPosition(sf::Vector2f(rand() % 730 + 70, rand() % (int)main_view.getCenter().y + 100));
platform.setFillColor(sf::Color::Red);
vect_of_platforms.push_back(platform);
}
sf::Clock game_clock;
while (window.isOpen())
{
float deltaTime = game_clock.restart().asMilliseconds();
sf::Event event;
while (window.pollEvent(event))
{
switch (event.type)
{
case sf::Event::Closed:
window.close();
break;
case sf::Event::KeyPressed:
if (event.key.code == sf::Keyboard::Escape)
window.close();
else if (event.key.code == sf::Keyboard::Space && !space_pressed && is_on_ground)
{
space_pressed = true;
player_velocityY = -3.5f;
}
break;
case sf::Event::KeyReleased:
if (event.key.code == sf::Keyboard::Space && space_pressed)
{
space_pressed = false;
}
break;
}
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
player_velocityX = -0.5f;
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
player_velocityX = 0.5f;
else
player_velocityX = 0.0f;
for (int i = 0; i < vect_of_platforms.size(); i++)
{
if (player.getGlobalBounds().intersects(vect_of_platforms[i].getGlobalBounds()))
{
//player.setPosition(player.getPosition().x, vect_of_platforms[i].getPosition().y - vect_of_platforms[i].getSize().y * 2);
/*std::cout << "colliison\nindex: " << index << std::endl;
index++;*/
is_colliding = true;
//std::cout << " collision" << std::endl;
}
else
{
is_colliding = false;
//std::cout << "no collision" << std::endl;
}
}
if (player.getPosition().y < 600.0f && !is_colliding)
{
is_on_ground = false;
player_velocityY += GRAVITY;
}
else if (player.getPosition().y < 600.0f && is_colliding)
{
std::cout << " collision\nindex: " << index << std::endl;
index++;
}
else if (player.getPosition().y > 600.0f)
{
is_on_ground = true;
player.setPosition(player.getPosition().x, 600.0f);
player_velocityY = 0.0f;
}
player.move(player_velocityX * deltaTime, player_velocityY * deltaTime);
for (int i = 0; i < vect_of_platforms.size(); i++)
{
if (vect_of_platforms[i].getPosition().x <= 0.0f)
platforms_velocity[i] = platform_velocity;
else if (vect_of_platforms[i].getPosition().x >= (800.0f - vect_of_platforms[i].getSize().x / 2))
platforms_velocity[i] = -platform_velocity;
vect_of_platforms[i].move(platforms_velocity[i] * deltaTime, 0.0f);
}
window.clear();
window.setView(main_view);
window.draw(player);
for (int i = 0; i < vect_of_platforms.size(); i++)
{
window.draw(vect_of_platforms[i]);
}
window.display();
}
return 0;
}