#include <allegro.h>
#include <iostream>
#include <math.h>
class kolizjie
{
private:
BITMAP * kula;
BITMAP * mapa;
public:
int x;
int y;
int x_2;
int y_2;
bool czy_kol_gora;
bool czy_kol_lewo;
bool czy_kol_dol;
bool czy_kol_prawo;
void spr_kol();
kolizjie()
{
kula = load_bmp( "kula.bmp", default_palette );
mapa = load_bmp( "mapa.bmp", default_palette );
x = 100;
x_2 = 100 + kula->h;
y = 100;
y_2 = 100 + kula->w;
czy_kol_dol = false;
czy_kol_gora = false;
czy_kol_lewo = false;
czy_kol_prawo = false;
}
~kolizjie()
{
destroy_bitmap( mapa );
destroy_bitmap( kula );
}
};
void kolizjie::spr_kol()
{
if
( getpixel( mapa, x_2, y - 1 ) != makecol( 255, 0, 255 ) ||
getpixel( mapa, x, y - 1 ) != makecol( 255, 0, 255 ) ||
getpixel( mapa,( x + x_2 ) / 2, y - 1 ) != makecol( 255, 0, 255 ) )
{ czy_kol_gora = true; }
if
( getpixel( mapa, x_2 + 1, y ) != makecol( 255, 0, 255 ) ||
getpixel( mapa, x_2 + 1, y_2 ) != makecol( 255, 0, 255 ) ||
getpixel( mapa, x_2 + 1,( y_2 + y ) / 2 ) != makecol( 255, 0, 255 ) )
{ czy_kol_prawo = true; }
if
( getpixel( mapa, x_2, y_2 - 1 ) != makecol( 255, 0, 255 ) ||
getpixel( mapa, x, y_2 - 1 ) != makecol( 255, 0, 255 ) ||
getpixel( mapa,( x + x_2 ) / 2, y_2 - 1 ) != makecol( 255, 0, 255 ) )
{ czy_kol_dol = true; }
if
( getpixel( mapa, x - 1, y_2 ) != makecol( 255, 0, 255 ) ||
getpixel( mapa, x - 1, y ) != makecol( 255, 0, 255 ) ||
getpixel( mapa, x - 1,( y + y_2 ) / 2 ) != makecol( 255, 0, 255 ) )
{ czy_kol_lewo = true; }
}
class sterowanie
{
private:
kolizjie * kol;
public:
bool prawo;
bool lewo;
bool skok;
void spr_ste();
sterowanie()
{
prawo = false;
lewo = false;
skok = false;
kol = new kolizjie;
}
~sterowanie()
{
delete kol;
}
};
void sterowanie::spr_ste()
{
if( key[ KEY_LEFT ] && !kol->czy_kol_lewo )
{ lewo = true;
kol->x--;
kol->x_2--; }
if( key[ KEY_RIGHT ] && !kol->czy_kol_prawo )
{ prawo = true;
kol->x++;
kol->x_2++; }
if( key[ KEY_UP ] && kol->czy_kol_dol )
{ skok = true; }
}
class grawitacja
{
private:
float a;
float t0; float t1;
float roznica; float przed;
bool czy_skok;
sterowanie * ster;
kolizjie * kol;
public:
float v0; float v1;
void grawituj();
grawitacja()
{
a = 10;
t0 = 0;
t1 = 0.1;
roznica = 0;
przed = 0;
v0 = 0;
v1 = 40;
czy_skok = false;
ster = new sterowanie;
kol = new kolizjie;
}
~grawitacja()
{
delete ster;
delete kol;
}
};
void grawitacja::grawituj()
{
if( ster->skok )
{ v0 = v1;
czy_skok = true; }
if( !ster->skok && !czy_skok && !kol->czy_kol_dol )
{ v0 = 0;
czy_skok = true; }
if( czy_skok )
{
roznica =( v0 * t0 -( a *( t0 * t0 ) ) / 2 ) - przed;
kol->y = kol->y + static_cast < int >( round( roznica ) );
przed =( v0 * t0 -( a *( t0 * t0 ) ) / 2 );
t0 = t0 + t1;
if( kol->czy_kol_dol && roznica < 0 )
{
while( roznica < 0 )
{
roznica++; kol->y--;
if( !kol->czy_kol_dol )
{
kol->y++; break;
}
}
}
}
};
volatile long pre = 0;
void inc_pre()
{
pre++;
}
END_OF_FUNCTION( inc_pre );
LOCK_VARIABLE( pre );
LOCK_FUNCTION( inc_pre );
int main()
{
sterowanie ste;
kolizjie koli;
grawitacja graw;
allegro_init();
install_timer();
install_keyboard();
set_color_depth( 32 );
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
int t2 = 10;
install_int_ex( inc_pre, BPS_TO_TIMER( 100 ) );
BITMAP * ziemia;
BITMAP * trawa;
BITMAP * kula;
BITMAP * tlo;
BITMAP * bufor;
ziemia = load_bmp( "ziemia.bmp", default_palette );
trawa = load_bmp( "trawa.bmp", default_palette );
kula = load_bmp( "kula.bmp", default_palette );
tlo = load_bmp( "tlo.bmp", default_palette );
bufor = create_bitmap( 800, 600 );
while( !key[ KEY_A ] )
{
masked_blit( kula, bufor, 0, 0, koli.x, koli.y, kula->h, kula->w );
blit( tlo, bufor, 0, 0, 0, 0, tlo->h, tlo->w );
blit( ziemia, bufor, 0, 0, 600 -( ziemia->h ), 0, ziemia->h, ziemia->w );
blit( trawa, bufor, 0, 0, 600 -( ziemia->h + trawa->h ), 0, ziemia->h, trawa->w );
blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
koli.spr_kol();
ste.spr_ste();
if( pre % t2 < 6 )
{ graw.grawituj(); }
}
destroy_bitmap( bufor );
destroy_bitmap( tlo );
destroy_bitmap( ziemia );
destroy_bitmap( trawa );
return 0;
allegro_exit();
};
END_OF_MAIN()
niewiem co jest żle możę ktoś podpowie,bo kombinuje i cały czas po uruchomieniu programu się zawiesza.