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

[Allegro 4] Problem ze strzelaniem (wracające kule)

Ostatnio zmodyfikowano 2012-06-07 11:00
Autor Wiadomość
matiasz
Temat założony przez niniejszego użytkownika
[Allegro 4] Problem ze strzelaniem (wracające kule)
» 2012-06-03 21:51:07
Witam!
Jestem tu nowy więc mnie nie krytykujcie na wstępie.
Mam problem ze strzelaniem mianowicie z funkcją która odpowiada za strzelanie. Gdy obracam się ludkiem np. w lewo i strzelam ,a później obracam się w prawo to pocisk który wyleciał już poza bitmape wraca i leci w drugą stronę.
Proszę o pomoc

Mój kod:
C/C++
#include <allegro.h>

int x, y, i, shot = 0;
const int MAX_BULLETS = 100;

BITMAP * obrazek = NULL;
BITMAP * ludek = NULL;
BITMAP * ludek01 = NULL;
BITMAP * ludek02 = NULL;
BITMAP * ludek03 = NULL;
BITMAP * ludek04 = NULL;
BITMAP * pocisk = NULL;
BITMAP * bufor = NULL;
//strzelanie /amunicja
typedef struct some_object
{
    int x, y, alive;
} some_object;

some_object bullets[ MAX_BULLETS ];

int add_bullet( int x, int y )
{
   
    int i;
   
    for( i = 0; i < MAX_BULLETS; i++ ) {
        if( bullets[ i ].alive == 0 ) {
            bullets[ i ].x = x;
            bullets[ i ].y = y;
            return i; // Return bullet index
        }
    }
   
    return( 0 ); // Or -1?
}

inline void init()
{
    allegro_init();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
   
    install_timer();
    install_keyboard();
    install_mouse();
}

inline void deinit()
{
    clear_keybuf();
    allegro_exit();
}
bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 )
{
    if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true;
    else return false;
   
};


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

LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

int main()
{
    init();
   
    obrazek = load_bmp( "obrazek.bmp", default_palette );
    if( !obrazek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie moge za³adowaæ obrazka" );
        allegro_exit();
    }
   
    ludek = load_bmp( "ludek.bmp", default_palette );
    if( !ludek )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "nie mogê za³adowaæ ludek !" );
        allegro_exit();
        return 0;
    }
    //ladowanie animacj
    ludek01 = load_bmp( "ludek02.bmp", default_palette );
    ludek02 = load_bmp( "ludek01.bmp", default_palette );
    ludek03 = load_bmp( "ludek03.bmp", default_palette );
    ludek04 = load_bmp( "ludek04.bmp", default_palette );
    pocisk = load_bmp( "pocisk.bmp", default_palette );
    //bufor
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogê utworzyæ bufora !" );
        allegro_exit();
        return 0;
    }
   
   
    char kierunek = 1;
    int obrazek_x = 0;
    int obrazek_y = 400;
    int ludek_x = 300;
    int ludek_y = 200;
    //int pocisk_x = ludek_x + 15;
    //int pocisk_y = ludek_y + 15;
    int frame = 1;
    int shoot = 0;
    int over = 0;
    int temp;
    int gora = false;
    int dol = false;
    int prawo = false;
    int lewo = false;
   
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
   
    for( i = 0; i < MAX_BULLETS; i++ )
    {
        bullets[ i ].alive = 0;
    }
    while( !key[ KEY_ESC ] )
    {
       
        for( i = 0; i < MAX_BULLETS; i++ ) //brought this up from the bottom
        {
            if( bullets[ i ].alive == 1 )
            {
                blit( pocisk, bufor, 0, 0, bullets[ i ].x, bullets[ i ].y, 4, 4 );
            }
        }
        //nabój leci w gore
        if( gora == true )
        {
            for( i = 0; i < MAX_BULLETS; i++ )
            {
                if( bullets[ i ].alive )
                {
                    bullets[ i ].y--;
                }
            }
        }
        //nabój leci w do
        if( dol == true )
        {
            for( i = 0; i < MAX_BULLETS; i++ )
            {
                if( bullets[ i ].alive )
                {
                    bullets[ i ].y++;
                }
            }
        }
        //nabój leci w prawo
        if( prawo == true )
        {
            for( i = 0; i < MAX_BULLETS; i++ )
            {
                if( bullets[ i ].alive )
                {
                    bullets[ i ].x--;
                }
            }
        }
        //nabój leci w lewo
        if( lewo == true )
        {
            for( i = 0; i < MAX_BULLETS; i++ )
            {
                if( bullets[ i ].alive )
                {
                    bullets[ i ].x++;
                }
            }
        }
       
        //strzelanie
        if( key[ KEY_SPACE ] )
        {
            if( shot == 0 )
            {
                temp = add_bullet( ludek_x, ludek_y + 70 );
                shot = 1;
                bullets[ temp ].alive = 1;
            }
        }
       
        //sprawdza amunicje
        if( !key[ KEY_SPACE ] )
        {
            if( shot == 1 )
            {
                shot = 0;
            }
        }
       
       
        while( speed > 0 )
        {
            //bajer
            obrazek_x += kierunek;
            if( obrazek_x > 600 )
            {
                kierunek = - 1;
            }
           
            else if( obrazek_x < 0 )
            {
                kierunek = 1;
            }
            //sterowanie
            if( key[ KEY_UP ] )
            {
                ludek_y--;
                frame = 20;
                if( ludek_y == 0 )
                {
                    ludek_y++;
                }
            }
            if( key[ KEY_DOWN ] )
            {
                ludek_y++;
                frame = 40;
                if( ludek_y == 440 )
                {
                    ludek_y--;
                }
            }
           
            if( key[ KEY_LEFT ] )
            {
                ludek_x--;
                frame = 80;
                if( ludek_x == 0 )
                {
                    ludek_x++;
                }
            }
           
            if( key[ KEY_RIGHT ] )
            {
                ludek_x++;
                frame = 60;
                if( ludek_x == 600 )
                {
                    ludek_x--;
                }
            }
           
           
            speed--;
        }
       
        //if(kolizja(obrazek_x,obrazek_y,obrazek->h,obrazek->w,ludek_x,ludek_y,ludek->w,ludek->h))
        //{
       
        //}
       
        //ladowanie grafiki
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
        masked_blit( obrazek, bufor, 0, 0, obrazek_x, obrazek_y, obrazek->w, obrazek->h );
        //animacja + kierunek ludzika
        if( frame == 20 ) { draw_sprite( bufor, ludek01, ludek_x, ludek_y ), gora = true, dol = false, prawo = false, lewo = false; }
        else if( frame == 40 ) { draw_sprite( bufor, ludek02, ludek_x, ludek_y ), gora = false, dol = true, prawo = false, lewo = false; }
        else if( frame == 60 ) { draw_sprite( bufor, ludek03, ludek_x, ludek_y ), gora = false, dol = false, prawo = false, lewo = true; }
        else if( frame == 80 ) { draw_sprite( bufor, ludek04, ludek_x, ludek_y ), gora = false, dol = false, prawo = true, lewo = false; }
    }
   
    deinit();
    destroy_bitmap( ludek );
    return 0;
}
END_OF_MAIN()
P-57776
SeaMonster131
» 2012-06-03 22:07:12
Nadawaj każdemu pocisku z osoba kąt (kierunek) strzelania, i tylko przy strzale. Najlepiej zrobić coś takiego:

C/C++
class CBullet
{
public:
   
    float x, y, angle;
    CBullet( float x2, float y2, float angle2 )
        : x( x2 )
        , y( y2 )
        , angle( angle2 )
    { }
};
vector < CBullet > bullets;

// ...

if( strzal )
{
    bullets.push_back( CBullet( postac.x, postac.y, postac.angle ) );
}

// ...

for( int i = 0; i < bullets.size(); i++ )
{
    // tutaj obsluga pocisku...
}

A po drugie, co tutaj:
C/C++
if( frame == 20 ) { draw_sprite( bufor, ludek01, ludek_x, ludek_y ), gora = true, dol = false, prawo = false, lewo = false; }
else if( frame == 40 ) { draw_sprite( bufor, ludek02, ludek_x, ludek_y ), gora = false, dol = true, prawo = false, lewo = false; }
else if( frame == 60 ) { draw_sprite( bufor, ludek03, ludek_x, ludek_y ), gora = false, dol = false, prawo = false, lewo = true; }
else if( frame == 80 ) { draw_sprite( bufor, ludek04, ludek_x, ludek_y ), gora = false, dol = false, prawo = true, lewo = false; }
robią przecinki zamiast średników?
P-57777
matiasz
Temat założony przez niniejszego użytkownika
» 2012-06-03 22:46:35
Możesz mi to bardziej wytłumaczyć ten kod który podałeś ,bo coś mi nie działa

C:\Documents and Settings\Karol\Moje dokumenty\New Gra\main.cpp|26|error: expected constructor, destructor, or type conversion before '<' token|
C:\Documents and Settings\Karol\Moje dokumenty\New Gra\main.cpp||In function 'int _mangled_main()':|
C:\Documents and Settings\Karol\Moje dokumenty\New Gra\main.cpp|173|error: request for member 'push_back' in 'bullets', which is of non-class type 'int'|
C:\Documents and Settings\Karol\Moje dokumenty\New Gra\main.cpp|173|error: request for member 'x' in 'ludek', which is of non-class type 'BITMAP*'|
C:\Documents and Settings\Karol\Moje dokumenty\New Gra\main.cpp|173|error: request for member 'y' in 'ludek', which is of non-class type 'BITMAP*'|
C:\Documents and Settings\Karol\Moje dokumenty\New Gra\main.cpp|173|error: request for member 'angle' in 'ludek', which is of non-class type 'BITMAP*'|
C:\Documents and Settings\Karol\Moje dokumenty\New Gra\main.cpp|176|error: request for member 'size' in 'bullets', which is of non-class type 'int'|
||=== Build finished: 6 errors, 0 warnings ===|

Robię męczę się na różne sposoby i ciągle to samo.
P-57781
SeaMonster131
» 2012-06-03 22:50:42
To tylko przykład. » standard C++vector
Najważniejsze to:
Nadawaj każdemu pocisku z osoba kąt (kierunek) strzelania, i tylko przy strzale.
P-57782
matiasz
Temat założony przez niniejszego użytkownika
» 2012-06-05 20:32:53
Robię tak jak pisałeś przynajmniej tak mi się wydaję ,że o to chodzi

       
C/C++
if( prawo == true )
{
    for( i = 0; i < MAX_BULLETS; i++ )
    {
        if( bullets[ i ].alive )
        {
            bullets[ i ].x++;
        }
    }
}

I tak dla każdego kierunku lecz pociski nadal wracają. Ma ktoś jakieś pomysły?

ps.
Jak Wy wstawiacie ten kolorowy kod ?
P-57920
SeaMonster131
» 2012-06-05 20:35:58
[cpp] kod [/cpp]

Hm.. masz zmienną "prawo" itd.. Dodaj to do klasy pocisku i wtedy rób:

C/C++
for( int i = 0; i < MAX_BULLETS; i++ )
{
    if( bullets[ i ].prawo )
    {
        // pocisk leci w prawo
    }
    if( bullets[ i ].lewo )
    {
        // pocisk leci w lewo
    }
}

A wszystko będzie działać.
P-57921
matiasz
Temat założony przez niniejszego użytkownika
» 2012-06-05 20:37:32
Ok dzięki wielkie.
P-57922
matiasz
Temat założony przez niniejszego użytkownika
» 2012-06-06 20:45:03
Zrobiłem tak jak pisałeś ,ale dalej dzieje się to samo. Jakieś inne pomysły ? Może to przez sprawdzanie kierunku ludzika ?

Jestem początkującym w C++ Allegro więc proszę o wyrozumiałość.
P-57964
« 1 » 2
  Strona 1 z 2 Następna strona