lenrokskate Temat założony przez niniejszego użytkownika |
Problem z klasami + Allegro » 2010-08-05 14:09:13 Zainspirowany wyczynami naszych użytkowników, postanowiłem również napisać edytor map do allegro. Jednak chcę go napisać obiektowo i porządnie. I mam kolejny błąd - nie wiem co jest źle. Kod: main.cpp #include <allegro.h> #include "inits.h" #include "buttons.h"
BITMAP * bufor = NULL;
int main() { ALLEGRO_init all_object( 32, 800, 600, true, true, true, true ); bufor = create_bitmap( 800, 600 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka 1 !" ); allegro_exit(); return 0; } clear_to_color( bufor, makecol( 255, 255, 255 ) ); my_button przycisk( "click", 100, 100, 200, 100 ); if( !przycisk.bit_button_source ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka 1 !" ); allegro_exit(); return 0; } if( !przycisk.image ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka 1 !" ); allegro_exit(); return 0; } while( !key[ KEY_ESC ] ) { if( przycisk.show( & bufor ) ) break; blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } return 0; } END_OF_MAIN()
buttons.cpp #include "buttons.h"
my_button::my_button( std::string p_text, int p_posx, int p_posy, int p_sizex, int p_sizey ) : text( p_text ) , posx( p_posx ) , posy( p_posy ) , sizex( p_sizex ) , sizey( p_sizey ) , bit_button_source( NULL ) { bit_button_source = load_bitmap( "button.bmp", default_palette ); image = create_bitmap( sizex, sizey ); stretch_sprite( bit_button_source, image, 0, 0, sizex, sizey ); }
my_button::~my_button() { }
bool my_button::show( BITMAP ** where ) { masked_blit( image, * where, 0, 0, posx, posy, sizex, sizey ); if( mouse_x > posx && mouse_x <( posx + sizex ) ) if( mouse_y > posy && mouse_y >( posy + sizey ) ) return true; return false; }
inits.cpp #include <allegro.h> #include "inits.h"
ALLEGRO_init::ALLEGRO_init( int p_color_depth, int p_window_x, int p_window_y, bool p_windowed, bool p_timer, bool p_keyboard, bool p_mouse ) : color_depth( p_color_depth ) , window_x( p_window_x ) , window_y( p_window_y ) , windowed( p_windowed ) , timer( p_timer ) , keyboard( p_keyboard ) , mouse( p_mouse ) { allegro_init(); set_color_depth( color_depth ); if( windowed ) set_gfx_mode( GFX_AUTODETECT_WINDOWED, window_x, window_y, 0, 0 ); else set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, window_x, window_y, 0, 0 ); if( timer ) install_timer(); if( keyboard ) install_keyboard(); if( mouse ) install_mouse(); }
ALLEGRO_init::~ALLEGRO_init() { }
buttons.h #ifndef BUTTONS_H_INCLUDED #define BUTTONS_H_INCLUDED
#include <iostream> #include <allegro.h>
class my_button { public: my_button( std::string p_text, int p_posx, int p_posy, int p_sizex, int p_sizey ); ~my_button(); std::string text; const int posx, posy, sizex, sizey; BITMAP * image; BITMAP * bit_button_source; bool show( BITMAP ** where ); };
#endif
inits.h #ifndef INITS_H_INCLUDED #define INITS_H_INCLUDED
class ALLEGRO_init { public: ALLEGRO_init( int p_color_depth = 32, int p_window_x = 800, int p_window_y = 600, bool p_windowed = true, bool p_timer = true, bool p_keyboard = true, bool p_mouse = true ); ~ALLEGRO_init(); const short color_depth; const int window_x, window_y; const bool windowed, timer, keyboard, mouse; };
#endif
Kompiluje się prawidłowo, lecz po włączeniu programu jest error "Wysyłaj/Nie wysyłaj". Problem leży gdzieś w klasie przycisków. Jeśli zakomentuję (w main.cpp) tworzenie obiektu "przycisk" i funkcję pokazującą go to nic nie wywala. |
|
lenrokskate Temat założony przez niniejszego użytkownika |
» 2010-08-05 14:22:05 allegro.log: al-main INFO: Allegro initialised (instance 1) al-gfx INFO: Called set_gfx_mode(2, 800, 600, 0, 0). al-gfx INFO: First call, remembering console state. al-gfx INFO: Autodetecting graphic driver. al-gfx INFO: The driver will wait for vsync. al-gfx INFO: set_gfx_card success for 800x600x32.
|
|
lenrokskate Temat założony przez niniejszego użytkownika |
» 2010-08-05 17:53:37 #refresh |
|
malan |
» 2010-08-05 19:05:32 1. Jeżeli kod podzieliłeś sobie na pliki i jest ich więcej niż 3 to spakuj to WinRARem i wrzuć na forum, a nie ;p. Myślisz, że komuś się będzie chciało kopiować? 2. Nie "podbijaj" tematu. Jeżeli ktoś będzie znał odpowiedź na Twój problem to na pewno temat zauważy i odpowie. 3. Nie denerwuj mnie ;p. 4. bit_button_source = load_bmp( "button.bmp", default_palette ); image = create_bitmap( sizex, sizey ); stretch_sprite( bit_button_source, image, 0, 0, sizex, sizey );
Ładujesz button.bmp i robisz coś z nim ( stretch_sprite), ale nie sprawdzasz, czy poprawnie go wczytano. Tzn. robisz to, ale zbyt późno. Do bitmapy podałeś pewnie złą ścieżkę i tu leży problem. |
|
lenrokskate Temat założony przez niniejszego użytkownika |
» 2010-08-05 19:25:54 Rzeczywiście, problem polega na tym, że nie wczytuje bit_button_source, tyle że to nie ścieżka, tylko format - plik był w formacie png (mimo rozszerzenia bmp) teraz już działa, odpowiada na kliknięcie, tyle, że nie wyświetla buttona (nawet jak wyświetlam go z zewnątrz (main.cpp)) #include <allegro.h> #include "inits.h" #include "buttons.h"
BITMAP * bufor = NULL;
int main() { ALLEGRO_init all_object( 32, 800, 600, true, true, true, true ); show_mouse( screen ); bufor = create_bitmap( 800, 600 ); clear_to_color( bufor, makecol( 255, 255, 255 ) ); my_button przycisk( "click", 100, 100, 200, 100 ); while( !key[ KEY_ESC ] ) { clear_to_color( bufor, makecol( 255, 255, 255 ) ); if( przycisk.show( & bufor ) ) break; stretch_sprite( przycisk.bit_button_source, bufor, przycisk.posx, przycisk.posy, przycisk.sizex, przycisk.sizey ); masked_blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); rest( 50 ); } return 0; } END_OF_MAIN()
|
|
MAKONDE |
» 2010-08-19 23:30:50 mhm...jak wczytujesz pliki to zapewne mają jakiś format... jaki ma "click" ? :P |
|
malan |
» 2010-08-19 23:48:56 @MAKONDE: Popatrz w kod zanim coś napiszesz... |
|
« 1 » |