inny1997 Temat założony przez niniejszego użytkownika |
» 2010-09-07 21:27:22 zmeinłem kod teraz znowu używam new ,ale w zupełnie innej formie.
niestety jak zawsze program nie chce się skomilować
wyrzyca błąd
main.cpp: In function `int _mangled_main()':
main.cpp:230: error: request for member `ste' in `graw', which is of non-class type `grawitacja ()()'
main.cpp:230: error: request for member `ste' in `graw', which is of non-class type `grawitacja ()()'
main.cpp:233: error: request for member `ste' in `graw', which is of non-class type `grawitacja ()()'
main.cpp:234: error: request for member `ste' in `graw', which is of non-class type `grawitacja ()()'
main.cpp:236: error: request for member `grawituj' in `graw', which is of non-class type `grawitacja ()()'
oto kod
#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 { public: kolizjie * kol; 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 == 0 ) { lewo = true; kol->x += 1; kol->x_2 += 1; lewo = false; } if( key[ KEY_RIGHT ] && kol->czy_kol_prawo == 0 ) { prawo = true; kol->x += 1; kol->x_2 += 1; prawo = false; } if( key[ KEY_UP ] && kol->czy_kol_dol == 1 ) { skok = true; } }
class grawitacja { private: public: float a; float t0; float t1; float roznica; float przed; bool czy_skok; sterowanie * ste; 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; ste = new sterowanie; } ~grawitacja() { } };
void grawitacja::grawituj() { if( ste->skok && !czy_skok ) { v0 = v1; czy_skok = true; } if( !ste->skok && !czy_skok && !ste->kol->czy_kol_dol ) { v0 = 0; czy_skok = true; } if( czy_skok ) { roznica =( v0 * t0 -( a *( t0 * t0 ) ) / 2 ) - przed; ste->kol->y = ste->kol->y + static_cast < int >( round( roznica ) ); ste->kol->y_2 = ste->kol->y_2 + static_cast < int >( round( roznica ) ); przed =( v0 * t0 -( a *( t0 * t0 ) ) / 2 ); t0 = t0 + t1; if( ste->kol->czy_kol_dol && roznica < 0 ) { while( roznica < 0 ) { roznica++; ste->kol->y--; if( !ste->kol->czy_kol_dol ) { ste->kol->y++; czy_skok = false; t0 = 0; break; } } } } }; volatile long pre = 0; void inc_pre() { pre++; } END_OF_FUNCTION( inc_pre );
LOCK_VARIABLE( pre ); LOCK_FUNCTION( inc_pre ); int main() { allegro_init(); install_timer(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); int t2 = 10; int x; 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 ); grawitacja graw(); while( !key[ KEY_A ] ) { blit( tlo, bufor, 0, 0, 0, 0, tlo->w, tlo->h ); blit( ziemia, bufor, 0, 0, 0, 600 -( ziemia->h ), ziemia->w, ziemia->h ); masked_blit( trawa, bufor, 0, 0, 0, 600 -( ziemia->h + trawa->h ), ziemia->w, trawa->h ); graw.ste->kol->masked_blit( kula, bufor, 0, 0, graw.ste->kol->x, graw.ste->kol->y, kula->w, kula->h ); blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h ); graw.ste->spr_ste(); rest( 100 ); graw.ste->kol->spr_kol(); 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()
komunikacjia wygląda następująco
grawitacja(tworzy obiekt i wskźnik na sterowanie)->
sterowanie(tworzy kolejny obiekt i wskaźnik na kolizje)->
kolizje(ten obiekt jest wykorzystywany przez grawitacje i sterowanie) |
ison |
» 2010-09-07 23:15:56 zamień na ta linijka: graw.ste->kol->masked_blit( kula, bufor, 0, 0, graw.ste->kol->x, graw.ste->kol->y, kula->w, kula->h );
po pierwsze: funkcja masked_blit nie jest przecież w klasie kolizje po drugie: bitmapa o nazwie "kula" jest w klasie kolizje ;) tak powinna wyglądać ta linijka: masked_blit( kula, bufor, 0, 0, graw.ste->kol->x, graw.ste->kol->y, graw.ste->kol->kula->w, graw.ste->kol->kula->h );
nie zapomnij również o upublicznieniu bitmap w klasie kolizje, jeśli chcesz tego uniknąć to zamiast wywoływać wyżej wymienioną funkcję masked_blit w main() możesz stworzyć metodę klasy kolizje, która będzie odpowiedzialna za rysowanie p.s. w żadnym wypadku się nie poddawaj, pamiętaj że zadając tego typu pytania czegoś się uczysz; więc łatwo się nie zniechęcaj ;) |