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

[C++][Allegro] Postać spada mimo kolizji.

Ostatnio zmodyfikowano 2012-12-22 00:17
Autor Wiadomość
polkom21
Temat założony przez niniejszego użytkownika
[C++][Allegro] Postać spada mimo kolizji.
» 2012-12-21 22:55:40
Wcześniej pisałem, że mam problem z kolizjami. Jest to moja pierwsza gra i to dla tego nie wiem jeszcze tylu rzeczy. Teraz mam taki problem, że postać mi spada z obiektu mimo kolizji. podejrzewam, że nie przeszkadzało by to zbytnio bo nie zamierzam, żeby na mapie było coś takiego ale na zaś lepiej żeby było wszystko ok. Jest jeszcze taki mały problem, że można bardzo łatwo zawiesić się na ścianie mapy i nie wiem jak to wyeliminować. Gra do sprawdzenia jak to działa: http://rapidgator.net/file/64660088/platformówka.zip.html


main.cpp
C/C++
#include <allegro.h>
#include "global.h"
#include "graphic.h"

#define gravitation 2

volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );


int main()
{
    allegro_init();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_keyboard();
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 200 ) );
    BITMAP * buffor = NULL;
    buffor = create_bitmap( 800, 600 );
   
    // grafiki
    DATAFILE * date = NULL;
    date = load_datafile( "graphic.dat" );
    if( !date )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Blad ladowania grafik." );
        allegro_exit();
        return 0;
    }
    // end grafiki
   
    //START_postać
    BITMAP * person = NULL;
    person = create_bitmap( 40, 40 );
    clear_to_color( person, makecol( 0, 0, 0 ) );
    int person_x = 100, person_y = 100;
    //END_postać
   
    int rozmiar_x = 0, rozmiar_y = 0;
    const char * filemap = "map.txt";
    int map[ 100 ][ 100 ];
    LoadMap( filemap, map, rozmiar_x, rozmiar_y );
    cout << "map X: " << rozmiar_x << " map Y: " << rozmiar_y << endl;
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            int posX = person_x / 40, posY = person_y / 40;
            if( map[ posX ][ posY + 1 ] == 0 )
            {
                person_y = person_y + gravitation;
            }
            if( key[ KEY_RIGHT ] && map[ posX + 1 ][ posY ] == 0 ) person_x++;
           
            if( key[ KEY_LEFT ] && map[ posX-- ][ posY ] == 0 ) person_x--;
           
            speed--;
        }
        show_position( person_x, person_y );
        clear_to_color( buffor, makecol( 255, 255, 255 ) );
        DrawMap( map, rozmiar_x, rozmiar_y, buffor, date );
        masked_blit(( BITMAP * ) date[ 3 ].dat, buffor, 0, 0, person_x, person_y, person->w, person->h );
        blit( buffor, screen, 0, 0, 0, 0, 800, 600 );
    }
    remove_int( increment_speed );
    unload_datafile( date );
    destroy_bitmap( person );
    destroy_bitmap( buffor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
Wiem wiem jest tu kilka zbędnych rzeczy takich jak bitmapa person ale to nie przeszkadza w obecnej chwili a usunę to zaraz. Jest jeszcze takie pytanie. Czy da się zrobić tak, żeby postać miała mniejszą szerokość i kolizja działała jak postać będzie się stykać z obiektem obok a nie tak jak teraz?
P-71609
DejaVu
» 2012-12-21 22:58:05
Eh... temat kolizji to temat rzeka. Dokładnych kolizji nie zrobisz małym nakładem pracy (chyba, że użyjesz gotowej biblioteki typu Box2D). Pisanie prostych kolizji było wielokrotnie omawiane na forum, ostatnio nawet bardziej rozbudowane wątki się pojawiały, więc może warto je poczytać...?

Frazy, które należy wpisać w wyszukiwarkę google:

/edit:
Google mówi tym samym, że ponad 400 stron na naszym forum zostało poświęconych temu problemowi...
P-71610
polkom21
Temat założony przez niniejszego użytkownika
» 2012-12-21 23:14:38
No dobra pogrzebał bym z box2D ale to chyba raczej na SFML bym musiał przejść. Też ciężko jest cokolwiek znaleźć po polsku na temat box2D co z czym się je żeby to działało tak jak się chce.
P-71611
DejaVu
» 2012-12-22 00:17:51
Box2D jest biblioteką niezależną więc nie ma znaczenia czy to będzie SFML czy Allegro. Po prostu integrujesz z jedną z nich. Co do kursu - weź oficjalnego tutoriala w języku angielskim.

PS. Wiedz, że będziesz musiał poświęcić sporo czasu na czytanie i na eksperymenty zanim uda Ci się zrobić pierwszą działającą scenę zgodnie z Twoimi oczekiwaniami.
P-71613
« 1 »
  Strona 1 z 1