Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Sfml]Kolizja okrąg okrąg

Ostatnio zmodyfikowano 2013-01-03 21:04
Autor Wiadomość
DanielSC
Temat założony przez niniejszego użytkownika
» 2013-01-03 09:27:47
Dzieki wam za wszellką pomoc kolizja zachodzi kod:


C/C++
#include <iostream>
#include <math.h>
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;
int main()
{
   
    RenderWindow Aplikacja( VideoMode( 600, 800, 32 ), "Kolizje" );
    Shape kolo1 = Shape::Circle( 10, 10, 10, Color::Red ); //Gracz
    Shape kolo2 = Shape::Circle( 100, 100, 50, Color::Green ); //
   
   
   
   
   
    float pozycja1X = 10;
    float pozycja1Y = 10;
   
    float pozycja2X = 100;
    float pozycja2Y = 100;
   
   
    while( Aplikacja.IsOpened() )
    {
        Event zdarzenie;
        while( Aplikacja.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == Event::Closed )
                 Aplikacja.Close();
           
        }
        kolo1.GetPosition();
        kolo2.GetPosition();
        cout << "Roznica " << sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) << endl;
       
        const Input & sterowanie = Aplikacja.GetInput();
        //------------------------------------------------------------------
        if( sterowanie.IsKeyDown( sf::Key::Left ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= 60 ) //chodzi mi o te linie
        {
            kolo1.Move( - 0.2, 0 );
            pozycja1X -= 0.2;
        }
       
       
        else kolo1.Move( 0, 0 );
       
        //------------------------------------------------------------------------
       
        if( sterowanie.IsKeyDown( sf::Key::Right ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= 60 ) //chodzi mi glownie o te linie
        {
            kolo1.Move( + 0.2, 0 );
            pozycja1X += 0.2;
        }
       
        else kolo1.Move( 0, 0 );
        //---------------------------------------------------------------------
       
        if( sterowanie.IsKeyDown( sf::Key::Up ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= 60 )
        {
            kolo1.Move( 0, - 0.2 );
            pozycja1Y -= 0.2;
        }
       
        else kolo1.Move( 0, 0 );
        //--------------------------------------------------------------------------
       
        if( sterowanie.IsKeyDown( sf::Key::Down ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= 60 )
        {
            kolo1.Move( 0, + 0.2 );
            pozycja1Y += 0.2;
        }
       
        else kolo1.Move( 0, 0 );
       
       
       
        //--------------------------------------------------------------------------------
       
       
        Aplikacja.Clear( Color( 0, 0, 255 ) );
        Aplikacja.Draw( kolo1 );
        Aplikacja.Draw( kolo2 );
        Aplikacja.Display();
       
       
       
    }
   
    return 0;
}
P-72807
Mrovqa
» 2013-01-03 10:58:00
Kod umieszczaj w znacznikach [cpp][/cpp].
P-72808
DanielSC
Temat założony przez niniejszego użytkownika
» 2013-01-03 17:09:33
Co to znaczy w znacznikach
i
?

Nasunął mi się jeszcze jeden problem otóż po wykryciu kolizji kolo1 zatrzymuje się w miejsu (bo tak wynika z kodu aplikacji)A ja chciałbym aby można bylo po wykryciu dalej poruszsac kolo1 tylko nie na kolo2 tak jagby tam była sciana przez którą nie da rady przejść.
P-72826
DejaVu
» 2013-01-03 18:32:32
Przed przesunięciem obiektu sprawdź czy wystąpi kolizja gdybyś przesunął obiekt na daną pozycję. Jeżeli kolizja nie zachodzi zaktualizuj pozycję.
P-72835
DanielSC
Temat założony przez niniejszego użytkownika
» 2013-01-03 19:29:00
Aha mniej więcej rozumiem i sprubuje zgodnie z twoimi wskazówkami rozwiącać mój problem .Dzięki

P-72851
DanielSC
Temat założony przez niniejszego użytkownika
» 2013-01-03 21:04:11
Mniej więcej idąc za twoją wskazówką wyskrobałem taki kod.Działa ale z małymi błedami (kolo1 czasami przeskakuje jak nacisne
jeden po drugim w małym odstępie czasu klawisz up-down lub right-left przez kolo2) :


C/C++
#include <iostream>
#include <math.h>
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;



int main()
{
   
    int promienk1 = 10;
    int promienk2 = 50;
   
    RenderWindow Aplikacja( VideoMode( 600, 800, 32 ), "Kolizje" );
    Shape kolo1 = Shape::Circle( 10, 10, promienk1, Color::Red ); //Gracz
    Shape kolo2 = Shape::Circle( 100, 100, promienk2, Color::Green ); //przeszkoda
   
   
   
   
   
    float pozycja1X = 10;
    float pozycja1Y = 10;
    float pozycja2X = 100;
    float pozycja2Y = 100;
   
   
    float warX = 10;
    float warY = 10;
   
   
    bool CzyWarunekSpelniony;
   
   
    while( Aplikacja.IsOpened() )
    {
        Event zdarzenie;
        while( Aplikacja.GetEvent( zdarzenie ) )
        {
            if( zdarzenie.Type == Event::Closed )
                 Aplikacja.Close();
           
        }
       
       
        //rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
        if( sqrt((( warX - pozycja2X ) *( warX - pozycja2X ) +( warY - pozycja2Y ) *( warY - pozycja2Y ) ) ) <= promienk1 + promienk2 )
             CzyWarunekSpelniony = false;
        else CzyWarunekSpelniony = true;
        //rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
        kolo1.GetPosition();
        kolo2.GetPosition();
        cout << "czy" << pozycja1X << endl;
       
       
        const Input & sterowanie = Aplikacja.GetInput();
        if( CzyWarunekSpelniony == false )
        {
            //------------------------------------------------------------------
            if( sterowanie.IsKeyDown( sf::Key::Left ) )
            {
                kolo1.Move( + 0.5, 0 );
                pozycja1X += 0.5;
                warX += 0.5; //zamiana z minusa na plus
            }
           
           
           
           
           
            //------------------------------------------------------------------------
           
            if( sterowanie.IsKeyDown( sf::Key::Right ) )
            {
                kolo1.Move( - 0.5, 0 );
                pozycja1X -= 0.5;
                warX -= 0.5; //zamiana z plusa na minus
            }
           
           
            //---------------------------------------------------------------------
           
            if( sterowanie.IsKeyDown( sf::Key::Up ) )
            {
                kolo1.Move( 0, 0.5 );
                pozycja1Y += 0.5;
                warY += 0.5; //z minusa na plus
            }
           
           
            //--------------------------------------------------------------------------
           
            if( sterowanie.IsKeyDown( sf::Key::Down ) )
            {
                kolo1.Move( 0, - 0.5 );
                pozycja1Y -= 0.5;
                warY -= 0.5; //z plusa  na minus
            }
           
        } //if czywystapila kolizja
        //------------------------------------------------------------------co innego domysl:: mozliwe ze if cza dac czy..
        if( sterowanie.IsKeyDown( sf::Key::Left ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= promienk1 + promienk2 )
        {
            kolo1.Move( - 0.1, 0 );
            pozycja1X -= 0.1;
            warX -= 0.1;
        }
       
       
       
       
       
        //------------------------------------------------------------------------
       
        if( sterowanie.IsKeyDown( sf::Key::Right ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= promienk1 + promienk2 )
        {
            kolo1.Move( + 0.1, 0 );
            pozycja1X += 0.1;
            warX += 0.1;
        }
       
       
        //---------------------------------------------------------------------
       
        if( sterowanie.IsKeyDown( sf::Key::Up ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= promienk1 + promienk2 )
        {
            kolo1.Move( 0, - 0.1 );
            pozycja1Y -= 0.1;
            warY -= 0.1;
        }
       
       
        //--------------------------------------------------------------------------
       
        if( sterowanie.IsKeyDown( sf::Key::Down ) && sqrt(( pozycja1X - pozycja2X ) *( pozycja1X - pozycja2X ) +( pozycja1Y - pozycja2Y ) *( pozycja1Y - pozycja2Y ) ) >= promienk1 + promienk2 )
        {
            kolo1.Move( 0, + 0.1 );
            pozycja1Y += 0.1;
            warY += 0.1;
        }
       
       
       
       
       
        //--------------------------------------------------------------------------------
       
       
        Aplikacja.Clear( Color( 0, 0, 255 ) );
        Aplikacja.Draw( kolo1 );
        Aplikacja.Draw( kolo2 );
        Aplikacja.Display();
       
       
       
    }
   
    return 0;
}
P-72875
1 « 2 »
Poprzednia strona Strona 2 z 2