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

Problem z klasami + Allegro

Ostatnio zmodyfikowano 2010-08-19 23:48
Autor Wiadomość
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
C/C++
#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
C/C++
#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
C/C++
#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
C/C++
#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 // BUTTONS_H_INCLUDED

inits.h
C/C++
#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 // INITS_H_INCLUDED

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.
P-20445
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.
P-20447
lenrokskate
Temat założony przez niniejszego użytkownika
» 2010-08-05 17:53:37
#refresh
P-20450
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.
C/C++
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.
P-20453
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))
C/C++
#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()
P-20455
MAKONDE
» 2010-08-19 23:30:50
mhm...jak wczytujesz pliki to zapewne mają jakiś format...
jaki ma "click" ? :P
P-21007
malan
» 2010-08-19 23:48:56
@MAKONDE: Popatrz w kod zanim coś napiszesz...
P-21008
« 1 »
  Strona 1 z 1