Witam, robię grę która polega na skakaniu w górę po platformach w momencie spadnięcia na ziemię gracz przegrywa. Domyślnie mam 5 platform i mam problem z napisaniem kodu, który wykryje minimalny dystans między platformami. Na razie napisałem coś takiego, jak poniżej ale po odpaleniu programu w okienku gry wyświetla się biały ekran i nic się dzieje. Kiedy usunę linię dodającą platform do wektora gra się odpala, lecz z wiadomych względów widać tylko jedną platformę. Gdzie mam tutaj błąd?
Kod który odpowiada z generowanie platform i dodawanie ich do wektora:
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);
if(i == 0)
vect_of_platforms.push_back(platform);
else
{
for (int z = 0; z < vect_of_platforms.size(); z++)
{
float distance = platform.getPosition().y - vect_of_platforms[z].getPosition().y;
if (distance <= 100.0f)
{
platform.move(0.0f, -100.0f);
vect_of_platforms.push_back(platform);
}
}
}
}
Cały kod:
#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_down = false, cant_jump = 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);
if(i == 0)
vect_of_platforms.push_back(platform);
else
{
for (int z = 0; z < vect_of_platforms.size(); z++)
{
float distance = platform.getPosition().y - vect_of_platforms[z].getPosition().y;
if (distance <= 100.0f)
{
platform.move(0.0f, -100.0f);
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 || is_colliding))
{
if (cant_jump);
else
{
space_pressed = true;
player_velocityY = -2.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()))
{
is_colliding = true;
if (player.getPosition().y - player.getRadius() < vect_of_platforms[i].getPosition().y + vect_of_platforms[i].getSize().y
&& player.getPosition().y - player.getRadius() > vect_of_platforms[i].getPosition().y - vect_of_platforms[i].getSize().y)
{
//when hit botom
player.setPosition(player.getPosition().x, vect_of_platforms[i].getPosition().y + vect_of_platforms[i].getSize().y);
touched_platform_down = true;
cant_jump = true;
}
else if (player.getPosition().y + player.getRadius() > vect_of_platforms[i].getPosition().y - vect_of_platforms[i].getSize().y)
{
// when hit up
cant_jump = false;
player.move(platforms_velocity[i] * deltaTime, 0.0f);
player.setPosition(player.getPosition().x, vect_of_platforms[i].getPosition().y - vect_of_platforms[i].getSize().y * 2);
}
else
cant_jump = false;
break;
}
else
{
is_colliding = false;
}
}
if (player.getPosition().y < 600.0f)
{
if (!is_colliding)
{
is_on_ground = false;
player_velocityY += GRAVITY;
}
else
{
if (touched_platform_down)
{
player_velocityY += GRAVITY;
touched_platform_down = false;
}
}
}
else if (player.getPosition().y > 600.0f)
{
is_on_ground = true;
player.setPosition(player.getPosition().x, 600.0f);
player_velocityY = 0.0f;
cant_jump = false;
}
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;
}