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

Problem z kodem, mini - gierka 2d

Ostatnio zmodyfikowano 2013-04-27 15:58
Autor Wiadomość
kubek3898
Temat założony przez niniejszego użytkownika
Problem z kodem, mini - gierka 2d
» 2013-04-26 16:55:50
C/C++
#include <allegro.h>

BITMAP * man_1 = NULL;
BITMAP * man_2 = NULL;
BITMAP * bufor = NULL;
BITMAP * bg = NULL;
BITMAP * all_1 = NULL;
BITMAP * all_2 = NULL;
SAMPLE * misc = NULL;

volatile long speed = 0;

void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );

class Human
{
public:
    short int x, y;
    short int s, w;
};

bool czy_strzela_1 = false;
bool czy_strzela_2 = false;

bool collision( int x_1, int y_1, int s_1, int w_1, int x_2, int y_2, int s_2, int w_2 )
{
    if( x_2 <= x_1 + s_1 && x_2 > x_1 && y_2 >= y_1 && y_2 <= y_1 + w_1 ) return true;
    else if( x_2 <= x_1 + s_1 && x_2 > x_1 && y_2 + w_2 >= y_1 && y_2 + w_2 <= y_1 + w_1 ) return true;
    else if( x_2 + s_2 <= x_1 + s_1 && x_2 + s_2 > x_1 && y_2 >= y_1 && y_2 <= y_1 + w_1 ) return true;
    else if( x_2 + s_2 <= x_1 + s_1 && x_2 + s_2 > x_1 && y_2 + w_2 >= y_1 && y_2 + w_2 <= y_1 + w_1 ) return true;
    else return false;
   
};
END_OF_FUNCTION( collision );

Human human_1, human_2, ball_1, ball_2;

void load_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();
    }
}
END_OF_FUNCTION( load_bufor );

void load_sound()
{
    misc = load_sample( "sounds/start.wav" );
   
    if( !misc )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę załadować dźwięku!" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_sound );

void load_human()
{
    man_1 = load_bmp( "images/human_1.bmp", default_palette );
   
    if( !man_1 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Grafika nie została wczytana!" );
        allegro_exit();
    }
   
    man_2 = load_bmp( "images/human_2.bmp", default_palette );
   
    if( !man_2 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Grafika nie została wczytana!" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_human );

void load_bg()
{
    bg = load_bmp( "images/bg.png", default_palette );
   
    if( !bg )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Tło nie zostało wczytane" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_bg );

void load_ball()
{
    all_1 = load_bmp( "images/ball_1.bmp", default_palette );
   
    if( !all_1 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Kulka nie została wczytana!" );
        allegro_exit();
    }
   
    all_2 = load_bmp( "images/ball_2.bmp", default_palette );
   
    if( !all_2 )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Kulka nie została wczytana!" );
        allegro_exit();
    }
}
END_OF_FUNCTION( load_ball );

LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

int main()
{
    allegro_init();
   
    install_keyboard();
   
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 );
   
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 300 ) );
   
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, "" );
    set_volume( 255, 255 );
    load_sound();
    play_sample( misc, 255, 127, 1000, 1 );
   
    load_bufor();
    load_human();
    load_ball();
   
    int bg_x = 0, bg_y = 0;
   
    human_1.x = 100, human_1.y = 100, human_1.s = 40, human_1.w = 40;
    human_2.x = 100, human_2.y = 400, human_1.s = 40, human_1.w = 40;
   
    ball_1.x = human_1.x;
    ball_1.y = human_1.y;
    ball_1.s = 5;
    ball_1.w = 5;
   
    ball_2.x = human_2.x;
    ball_2.y = human_2.y;
    ball_2.s = 5;
    ball_2.w = 5;
   
    int czy_1 = false;
    int czy_2 = false;
   
    while( !key[ KEY_ESC ] )
    {
        if( czy_strzela_1 == true )
        {
            ball_2.y = ball_2.y + 3;
           
            if( collision( human_2.x, human_2.y, human_2.s, human_2.w, ball_2.x, ball_2.y, ball_2.s, ball_2.w ) == true )
            {
                czy_1 = true;
               
                ball_2.x = human_1.x;
                ball_2.y = human_1.y;
               
                czy_strzela_2 = false;
            }
           
            if( ball_2.y > human_2.y + 70 )
            {
                ball_2.x = human_1.x;
                ball_2.y = human_1.y;
                ball_2.y--;
               
                czy_strzela_2 = false;
               
                ball_2.y = human_1.y;
            }
        }
       
        if( czy_strzela_2 == true )
        {
            ball_1.y = ball_1.y - 3;
           
            if( collision( human_1.x, human_1.y, human_1.s, human_1.w, ball_1.x, ball_1.y, ball_1.s, ball_1.w ) == true )
            {
                czy_1 = true;
               
                ball_1.x = human_2.x;
                ball_1.y = human_2.y;
               
                czy_strzela_1 = false;
            }
           
            if( ball_1.y < human_1.y - 70 )
            {
                ball_1.x = human_2.x;
                ball_1.y = human_2.y;
                ball_1.y--;
               
                czy_strzela_2 = false;
               
                ball_2.y = human_1.y;
            }
        }
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] )
            {
                human_1.x--;
               
                if( ball_2.y == human_1.y )
                {
                    ball_2.x++;
                }
            }
            if( key[ KEY_RIGHT ] )
            {
                human_1.x++;
               
                if( ball_2.y == human_1.y )
                {
                    ball_2.x++;
                }
            }
            if( key[ KEY_UP ] )
            {
                czy_strzela_1 = true;
            }
            if( key[ KEY_A ] )
            {
                human_2.x--;
               
                if( ball_1.y == human_2.y )
                {
                    ball_1.x++;
                }
            }
            if( key[ KEY_D ] )
            {
                human_2.x++;
               
                if( ball_1.y == human_2.y )
                {
                    ball_1.x++;
                }
            }
            if( key[ KEY_W ] )
            {
                czy_strzela_2 = true;
            }
            if( human_1.x == - 32 ) human_1.x = 608;
           
            if( human_1.x == 610 ) human_1.x = - 30;
           
            if( human_2.x == - 32 ) human_2.x = 608;
           
            if( human_2.x == 610 ) human_2.x = - 30;
           
            speed--;
        }
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
       
        masked_blit( bg, bufor, 0, 0, bg_y, bg_y, bg->w, bg->h );
       
        masked_blit( man_1, bufor, 0, 0, human_1.x, human_1.y, human_1.s, human_1.w );
        masked_blit( man_2, bufor, 0, 0, human_2.x, human_2.y, human_1.s, human_2.w );
        masked_blit( all_1, bufor, 0, 0, ball_1.x, ball_1.y, ball_1.s, ball_1.w );
        masked_blit( all_2, bufor, 0, 0, ball_2.x, ball_2.y, ball_2.s, ball_2.w );
       
        if( czy_1 == true )
        {
            textprintf_ex( bufor, font, 300, 300, makecol( 100, 255, 199 ), - 1, "Wygrywa gracz na dole" );
        }
        if( czy_2 == true )
        {
            textprintf_ex( bufor, font, 30, 70, makecol( 100, 255, 199 ), - 1, "Wygrywa gracz na górze" );
        }
    }
   
    textprintf( bufor, font, 20, 20, makecol( 255, 255, 128 ), "Pozycja X ludzika (I): %d", human_1.x );
    textprintf( bufor, font, 20, 40, makecol( 255, 255, 128 ), "Pozycja Y ludzika (I): %d", human_1.y );
    textprintf( bufor, font, 420, 20, makecol( 255, 255, 128 ), "Pozycja X ludzika (II): %d", human_2.x );
    textprintf( bufor, font, 420, 40, makecol( 255, 255, 128 ), "Pozycja Y ludzika (II): %d", human_2.y );
   
    blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
   
    rest( 10 );
   
    clear_keybuf();
   
    remove_int( increment_speed );
   
    stop_sample( misc );
    destroy_bitmap( man_1 );
    destroy_bitmap( man_2 );
    destroy_bitmap( bufor );
    destroy_bitmap( bg );
    destroy_bitmap( all_1 );
    destroy_bitmap( all_2 );
    destroy_sample( misc );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Może mi ktoś powiedzieć, dlaczego zaraz po uruchomieniu programu, gierka zawiesza się, wywalając - program Test.exe przestał działać? Nie ma żadnych errorów (pełne logi włączone). Podejrzewam, że to coś z bitmapami, jednak nie jestem pewien, bo allegro uczę się dopiero od tygodnia ;p.

P-81197
MrPoxipol
» 2013-04-26 21:04:39
Sprawdź może Debuggerem, gdzie się wywala.
P-81238
kubek3898
Temat założony przez niniejszego użytkownika
» 2013-04-27 09:04:00
Po uruchomieniu Debuggera, gra również się zawiesza, co gorsza muszę zamykać proces całego Code Block'a, by przywrócić komputer do normalnego stanu.


Zdążyłem jednak zauważyć coś w tym stylu:

SIGSEV SEGMENTATION FAILED - czyżby naruszenie ochrony pamięci?

Oraz jeszcze kod błędu, lecz jego nie mogę w żaden sposób nawet skopiować (komputer przy odpaleniu się zwiesza, muszę wyłączać przez Menadżer.
P-81258
Gabes
» 2013-04-27 11:35:38
C/C++
load_bg(); //brak
bg = load_bmp( "images/bg.png", default_palette ); //png ?
P-81269
kubek3898
Temat założony przez niniejszego użytkownika
» 2013-04-27 15:58:26
@up

Dzięki wielkie za pomoc! Faktycznie, przez moją nieuwagę dałem rozszerzenie .png i zapomniałem wywołać funkcji :)

/cl
P-81282
« 1 »
  Strona 1 z 1