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: #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;
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( 0 ); }
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; } 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 = 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 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++ ) { if( bullets[ i ].alive == 1 ) { blit( pocisk, bufor, 0, 0, bullets[ i ].x, bullets[ i ].y, 4, 4 ); } } if( gora == true ) { for( i = 0; i < MAX_BULLETS; i++ ) { if( bullets[ i ].alive ) { bullets[ i ].y--; } } } if( dol == true ) { for( i = 0; i < MAX_BULLETS; i++ ) { if( bullets[ i ].alive ) { bullets[ i ].y++; } } } if( prawo == true ) { for( i = 0; i < MAX_BULLETS; i++ ) { if( bullets[ i ].alive ) { bullets[ i ].x--; } } } if( lewo == true ) { for( i = 0; i < MAX_BULLETS; i++ ) { if( bullets[ i ].alive ) { bullets[ i ].x++; } } } if( key[ KEY_SPACE ] ) { if( shot == 0 ) { temp = add_bullet( ludek_x, ludek_y + 70 ); shot = 1; bullets[ temp ].alive = 1; } } if( !key[ KEY_SPACE ] ) { if( shot == 1 ) { shot = 0; } } while( speed > 0 ) { obrazek_x += kierunek; if( obrazek_x > 600 ) { kierunek = - 1; } else if( obrazek_x < 0 ) { kierunek = 1; } 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--; } 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 ); 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()
|
|
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: 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++ ) { }
A po drugie, co tutaj: 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? |
|
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. |
|
SeaMonster131 |
» 2012-06-03 22:50:42 To tylko przykład. vectorNajważniejsze to: Nadawaj każdemu pocisku z osoba kąt (kierunek) strzelania, i tylko przy strzale. |
|
|
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 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 ? |
|
SeaMonster131 |
» 2012-06-05 20:35:58 [cpp] kod [/cpp] Hm.. masz zmienną "prawo" itd.. Dodaj to do klasy pocisku i wtedy rób: for( int i = 0; i < MAX_BULLETS; i++ ) { if( bullets[ i ].prawo ) { } if( bullets[ i ].lewo ) { } }
A wszystko będzie działać. |
|
matiasz Temat założony przez niniejszego użytkownika |
» 2012-06-05 20:37:32 Ok dzięki wielkie. |
|
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ść.
|
|
« 1 » 2 |