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

[sfml] Kolizja bohatera z mapą kafelkową

Ostatnio zmodyfikowano 2015-02-21 16:05
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[sfml] Kolizja bohatera z mapą kafelkową
» 2015-02-21 13:32:19
Zabrałem się z pisanie mojej pierwszej gry w SFML'u 2.x i ten kod który widać poniżej to moje dokonanie z ostatnich paru dnii. Całość, pomijając kolizję bohatera z mapą kafelkową, działa zgodnie z moimi oczekiwaniami. Natomiast problemem jest, jak już wspomniałem, wykrywanie kolizji mapy z ludkiem. Chodzi o to że nie wiem jak się za to zabrać. Czy moglibyście mnie ukierunkować, udzielić kilku wskazówek popartych odpowiednim kodem, tak abym mógł  tą kolizję wymęczyć (tzn. napisać)?



Moja kolizja, która nie działa.
C/C++
for( int i = 0; i < 25; ++i )
for( int j = 0; j < 20; ++j )
{ // KOLIZJA Z MAPĄ KAFELKOWĄ
    if( abs( level[ i - 32 ] ) > 20 || abs( level[ j - 32 ] > 20 ) )
    {
        //????
    }
}



C/C++
#include <SFML/Graphics.hpp>
#include "tilemap.hpp"
#include "fps.hpp"
#include "kolizja.h"

int main()
{
    // create the window
    sf::RenderWindow window( sf::VideoMode( 800, 600 ), "Labirynt" );
    sf::Texture backg;
    sf::Texture kula;
    sf::Texture brick[ 10 ]; // Znikaj¹ce cegie³ki
    backg.loadFromFile( "back.png" );
    sf::Sprite Back( backg );
    kula.loadFromFile( "kula.png" );
    sf::Sprite Kula( kula );
    brick[ 0 ].loadFromFile( "brick.png" );
    brick[ 1 ].loadFromFile( "brick.png" );
    brick[ 2 ].loadFromFile( "brick.png" );
    brick[ 3 ].loadFromFile( "brick.png" );
   
    sf::Sprite Brick_0( brick[ 0 ] );
   
    float brx_0 = 352, bry_0 = 480; // Cegie³ka pierwsza od do³u
   
    float x = 400, y = 540; // Kula bohater
   
    const int level[] =
    {
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };
   
    // create the tilemap from the level definition
    TileMap map;
    if( !map.load( "mapa.png", sf::Vector2u( 32, 32 ), level, 25, 20 ) )
         return - 1;
   
    FPS fp;
    while( window.isOpen() )
    {
        // handle events
        sf::Event event;
        while( window.pollEvent( event ) )
        {
            if( event.type == sf::Event::Closed )
                 window.close();
            else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) )
            {
                window.close();
            }
            else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
            {
                x -= 5;
            }
            else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
            {
                x += 5;
            }
            else if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
            {
                y -= 5;
            }
            if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
            {
                y += 5;
            }
            fp.getFPS();
            fp.update();
           
            if( kolizja( brx_0, bry_0, x, y ) == true )
            {
                //Kolizja kuli z cegie³k¹ pierwsz¹ od do³u
                brx_0 = 123;
               
            }
            for( int i = 0; i < 25; ++i )
            for( int j = 0; j < 20; ++j )
            { // KOLIZJA Z MAPĄ KAFELKOWĄ
                if( abs( level[ i - 32 ] ) > 20 || abs( level[ j - 32 ] > 20 ) )
                {
                    //????
                }
               
               
            }
           
           
        }
       
        Back.setPosition( 0, 0 );
        Kula.setPosition( x, y );
        Brick_0.setPosition( brx_0, bry_0 );
        window.clear();
        window.draw( Back );
        window.draw( Kula );
        window.draw( Brick_0 );
        window.draw( map );
        window.display();
    }
   
    return 0;
}
P-126946
pekfos
» 2015-02-21 13:36:44
C/C++
if( abs( level[ i - 32 ] ) > 20 || abs( level[ j - 32 ] > 20 ) )
{
    //????
}
Jak to miało działać?
P-126947
wojownik266
Temat założony przez niniejszego użytkownika
» 2015-02-21 13:44:22
No i w tym cały problem że nie wiem jak tą kolizję napisać i dlatego zamieściłem powyższy post na tym forum...Z nadzieją że ... zacznie działać. Proszę o wyrozumiałość.
P-126949
wojownik266
Temat założony przez niniejszego użytkownika
» 2015-02-21 13:54:21
Jak można zauważyć w kodzie mapa kafelkowa jest jednowymiarowa. Szerokość i wysokość jednego kafelka to 32 pixele. Wysokość bohatera to 30x28. Chciałbym aby ludek w momencie kolizji z kafelkami pozostał na swoim miejscu... Jak to wszystko połaczyć jakimś zgrabnym kawałkiem kodu (kolizji)?
P-126951
pekfos
» 2015-02-21 14:00:53
C/C++
if( level[ x / 32 ] ) // z lewej
    ;

if( level[( x + 30 ) / 32 ] ) // z prawej
    ;
Może coś w tym stylu?
P-126952
wojownik266
Temat założony przez niniejszego użytkownika
» 2015-02-21 14:13:13
Niestety nie działa. Kompilator wyrzucił:
D:\CodeBlockProjekty\SFML_Labirynt\main.cpp|96|error: invalid types 'const int [500][float]' for array subscript|
P-126955
pekfos
» 2015-02-21 14:13:51
To rzutuj na int..
P-126956
wojownik266
Temat założony przez niniejszego użytkownika
» 2015-02-21 14:26:44
Po dokonaniu rzutowania jak w kodzie ponizej... Widać że jakaś szczątkowa kolizja występuję ale za to są zablokowane klawisze strzałek tak że nie mogę poruszać bohaterem ani w prawo ani w lewo... To jeszcze nie to:(

C/C++
if(( level[(( int ) x + 30 ) / 32 ] ) ) // z prawej
{
    x = 200;
}
if( level[( int ) y / 32 ] ) // z lewej
{
    y = 200;
}

P-126958
« 1 » 2 3
  Strona 1 z 3 Następna strona