• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego kolizja wykrywana jest tylko dla jednego obiektu ?

Mały hosting, OGROMNE możliwości
0 głosów
340 wizyt
pytanie zadane 11 sierpnia 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)

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;
}

 

1 odpowiedź

0 głosów
odpowiedź 11 sierpnia 2021 przez dziablo Użytkownik (940 p.)
kolizja sie dobrze sprawdza, ale sprawdzasz kolizje ze wszystkimi obiektami w ten sposob, ze kolizja moze byc z obiektem od id 0, ustawisz is_colliding = true;

ale nie ma kolizji z obiektem 1 i ustawisz spowrotem is_colliding = false;

wychodz z petli jak natrafisz na kolizje

Podobne pytania

0 głosów
1 odpowiedź 268 wizyt
pytanie zadane 15 listopada 2015 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
1 odpowiedź 243 wizyt
0 głosów
1 odpowiedź 438 wizyt
pytanie zadane 31 marca 2017 w C i C++ przez Kodeman Gaduła (4,480 p.)

93,715 zapytań

142,629 odpowiedzi

323,259 komentarzy

63,255 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...