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

[SFML] Błędne działanie kolizji

Ostatnio zmodyfikowano 2012-11-13 15:38
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[SFML] Błędne działanie kolizji
» 2012-11-12 16:00:28
Wiem ze ten temat pojawiał się już wielokrotnie ale nie mam innego wyjścia... Dlatego proszę o wyrozumiałość i odpowiedzenie na pytanie dotyczące kolizji. Pytanie jest następujące: Dlaczego kolizja w tym programie nie działa, co jest źle? Proszę o wskazówki dotyczące rozwiązania tego problemu. Dziękuję!
C/C++
#include <SFML\Graphics.hpp>
#include "Gracz.h"
#include <iostream>
struct Poz
{
    float x, y;
    float w, h;
   
};
bool Kolizja( Poz & A, Poz & B )
{
    /* A1 i A3 */ /*   B2  i B4 */
    if( A.x >=( B.x + B.w ) )
         return false;
   
    /*  A2 i A4  */ /* B1 i B3 */
    if(( A.x + A.w ) <= B.x )
         return false;
   
    /* A1 i A2 */ /*  B3  i  B4 */
    if( A.y >=( B.y + B.h ) )
         return false;
   
    /* A3 i  A4 */ /*  B1 i  B2 */
    if(( A.y + A.h ) <= B.y )
         return false;
   
    return true;
}
int main()
{
    sf::RenderWindow App( sf::VideoMode( SZER_EKR, WYSO_EKR, 32 ), "AnimScroll" );
    sf::Texture back, back1, anim, lancuch, lancuch1, statek;
    back.loadFromFile( "Grafika/Background.png" );
    back1.loadFromFile( "Grafika/Background.png" );
    anim.loadFromFile( "Grafika/Animacja_1.png" );
    lancuch.loadFromFile( "Grafika/lancuch.png" );
    lancuch1.loadFromFile( "Grafika/lancuch.png" );
    statek.loadFromFile( "Grafika/statek.png" );
    sf::Sprite Back( back ), Anim( anim );
    sf::Sprite Back1( back1 );
    sf::Sprite Lancuch( lancuch );
    sf::Sprite Lancuch1( lancuch1 );
    sf::Sprite Statek( statek );
   
    float x = 0, y = 0, x1 = 0; //Scroll Animacje
    float bx = 0, by = 0, bx1 = 0, by1 =- WYSO_EKR; //Scroll Background
    float lancx = 185, lancy = 450; //Lañcuch 1 lewa
    float lancx1 = 610, lancy1 = 450; //Lañcuch 2 prawa
    float statx = 400, staty = 520;
   
   
    Poz lan, statek_1;
    lan.x = 610;
    lan.y = 450;
    lan.w = 128;
    lan.h = 60;
   
    statek_1.x = 400;
    statek_1.y = 520;
    statek_1.w = 60;
    statek_1.h = 60;
   
    while( App.isOpen() )
    {
        App.clear();
        sf::Event Event;
        while( App.pollEvent( Event ) )
        {
            if(( Event.type == sf::Event::Closed ) || sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) )
            {
                App.close();
            }
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
            {
                statek_1.x -= 15.0;
               
            }
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
            {
                statek_1.x += 15.0;
               
            }
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) )
            {
               
            }
           
        }
        Gracz gra;
        gra.back_scrolowanie_y( Back, Back1, bx, by, bx1, by1 );
        gra.anim_scrollowanie( Anim, x, y, x1 );
       
       
        if( Kolizja( lan, statek_1 ) )
        {
            std::cout << "Kolizja" << std::endl;
            statek_1.y = 0;
        }
       
        Lancuch.rotate( 0.05 );
        Lancuch1.rotate( 0.05 );
        Lancuch.setPosition( lancx, lancy );
        Lancuch1.setPosition( lan.x, lan.y );
        Statek.setPosition( statek_1.x, statek_1.y );
       
        //App.clear();
        App.draw( Back );
        App.draw( Back1 );
        App.draw( Anim );
        App.draw( Lancuch );
        App.draw( Lancuch1 );
        App.draw( Statek );
        App.display();
    }
    return EXIT_SUCCESS;
}
P-69039
Mrovqa
» 2012-11-12 20:43:03
C/C++
Gracz gra;
gra.back_scrolowanie_y( Back, Back1, bx, by, bx1, by1 );
gra.anim_scrollowanie( Anim, x, y, x1 );
Tworzysz grę w głównej pętli. Nie lepszym rozwiązaniem byłoby stworzyć go raz, przed główną pętlą? Co do kolizji - spróbuj przedebuggować kod.
P-69067
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-11-12 20:56:16
Co do tworzenia kodu w głównej pętli masz zupełną rację a ja kolejny problem który nie wiem jak rozwiązać! Mógłbyś napisać o tym tworzeniu nieco obszerniej? Byłbym Ci bardzo wdzięczny!
P-69070
Mrovqa
» 2012-11-12 22:13:17
Nie znam kodu Twojej klasy, ale samo przeniesienie
Gracz gra;
 przed główną pętle
while( App.isOpen() )
 powinno przyspieszyć działanie aplikacji, ale w każdym razie nie zaszkodzi :)
P-69089
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-11-13 10:14:27
Wygrzebałem w internecie kod kolizji który ku memu zdziwieniu działa jak na razie wyśmienicie. Tak że temat kolizji częściowo - rozwiązany. Jak by co to dam znać:) Kolizja ma sie tak:
C/C++
bool kolizja( float x, float y, float x2, float y2 ) {
    if( abs( x2 - x ) > 20 || abs( y2 - y ) > 20 )
         return false;
    else
         return true;
   
}
P-69104
kubawal
» 2012-11-13 15:11:19
Ciekawy algorytm. Skąd go wziąłeś?
P-69111
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-11-13 15:38:33
P-69112
« 1 »
  Strona 1 z 1