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

[Allegro] Problem wczytywanie bitmap

Ostatnio zmodyfikowano 2012-12-17 13:34
Autor Wiadomość
polkom21
Temat założony przez niniejszego użytkownika
[Allegro] Problem wczytywanie bitmap
» 2012-12-15 23:49:37
Witajcie. Otóż zapaliłem się na stworzenie gry i piszę sobie wszystko powoli i mam problem z wyświetlaniem bitmap oznaczonych w mapie. Otóż problem mam z deklaracją bitmap.

main.cpp
C/C++
#include <allegro.h>
#include "global.h"

volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

int main()
{
    allegro_init();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_keyboard();
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 200 ) );
    BITMAP * buffor = NULL;
    buffor = create_bitmap( 800, 600 );
    //START_postać
    BITMAP * person = NULL;
    person = create_bitmap( 40, 40 );
    clear_to_color( person, makecol( 0, 0, 0 ) );
   
    //objekty do wczytywania
   
    BITMAP * object1 = NULL;
    object1 = create_bitmap( 40, 40 );
    clear_to_color( object1, makecol( 0, 0, 255 ) );
   
    BITMAP * object2 = NULL;
    object2 = create_bitmap( 40, 40 );
    clear_to_color( object2, makecol( 255, 0, 0 ) );
    //koniec
   
    int person_x = 100, person_y = 100;
    //END_postać
   
    int rozmiar_x = 0, rozmiar_y = 0;
    const char * filemap = "map.txt";
    int map[ 100 ][ 100 ];
    LoadMap( filemap, map );
    DrowMap( map, rozmiar_x, rozmiar_y );
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] ) person_x--;
           
            if( key[ KEY_RIGHT ] ) person_x++;
           
            if( key[ KEY_UP ] ) person_y--;
           
            if( key[ KEY_DOWN ] ) person_y++;
           
            speed--;
        }
        show_position( person_x, person_y );
        clear_to_color( buffor, makecol( 255, 255, 255 ) );
        masked_blit( person, buffor, 0, 0, person_x, person_y, person->w, person->h );
        blit( buffor, screen, 0, 0, 0, 0, 800, 600 );
    }
    remove_int( increment_speed );
   
    destroy_bitmap( object1 );
    destroy_bitmap( object2 );
   
    destroy_bitmap( person );
    destroy_bitmap( buffor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

global.h
C/C++
#ifndef GLOBAL_H_INCLUDED
#define GLOBAL_H_INCLUDED

//include
#include "console.h"
#include <fstream>
//end_include
using namespace std;

int loadCounterX = 0, loadCounterY = 0, mapSizeX, mapSizeY;

void LoadMap( const char * filename, int map[ 100 ][ 100 ] )
{
    fstream plik;
    plik.open( filename, ios::in );
    int rozmiar_x, rozmiar_y;
    plik >> rozmiar_x >> rozmiar_y;
    for( int x = 0; x < rozmiar_x; x++ )
    {
        for( int y = 0; y < rozmiar_y; y++ )
        {
            plik >> map[ x ][ y ];
        }
    }
    plik.close();
}

void DrowMap( int map[ 100 ][ 100 ], int sizeMapX, int sizeMapY )
{
    for( int x = 0; x < sizeMapX; x++ )
    {
        for( int y = 0; y < sizeMapY; y++ )
        {
            if( map[ x ][ y ] == 0 )
            {
                blit( obrazek1, buffor, x * 40, y * 40, 40, 40, 40, 40 );
            }
            else if( map[ x ][ y ] == 1 )
            {
                blit( obrazek2, buffor, x * 40, y * 40, 40, 40, 40, 40 );
            }
        }
    }
}


#endif // GLOBAL_H_INCLUDED

Jak by ktoś mi poradził jak to zrobić to bym był wdzięczny.
P-71143
SeaMonster131
» 2012-12-16 11:54:08
Mapę powinieneś wyświetlać w pętli głównej gry, a co do bitmap, to w funkcji DrowMap() masz zmienne
obrazek1
 oraz
obrazek2
, które nie są nigdzie zadeklarowane.

PS. Co do nazwy funkcji, to nie powinna się ona nazywać DrawMap()? ;)
P-71168
polkom21
Temat założony przez niniejszego użytkownika
» 2012-12-16 12:41:14
No dobra zrobiłem tak tą funkcje:
C/C++
void DrawMap( int map[ 100 ][ 100 ], int sizeMapX, int sizeMapY, BITMAP * buffor, BITMAP * obrazek1, BITMAP * obrazek2 )
{
    for( int x = 0; x < sizeMapX; x++ )
    {
        for( int y = 0; y < sizeMapY; y++ )
        {
            if( map[ x ][ y ] == 0 )
            {
                blit( obrazek1, buffor, x * 40, y * 40, 40, 40, 40, 40 );
            }
            else if( map[ x ][ y ] == 1 )
            {
                blit( obrazek2, buffor, x * 40, y * 40, 40, 40, 40, 40 );
            }
        }
    }
}

i przeniosłem ją do pętli gry i błędów żadnych nie wyrzuca ale problem jest taki, że nie wyświetla mi nic z mapy tak jak powinno być :/
P-71172
polkom21
Temat założony przez niniejszego użytkownika
» 2012-12-17 01:29:41
Chyba znalazłem błąd. Tylko nie wiem jak go rozwiązać. Otóż mapa wygląda w ten sposób:
20 15
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
i funkcja wczytywania mapy wygląda tak:
C/C++
void LoadMap( const char * filename, int map[ 100 ][ 100 ], int rozmiar_x, int rozmiar_y )
{
    fstream plik;
    plik.open( filename, ios::in );
    plik >> rozmiar_x >> rozmiar_y;
    for( int x = 0; x < rozmiar_x; x++ )
    {
        for( int y = 0; y < rozmiar_y; y++ )
        {
            plik >> map[ x ][ y ];
        }
    }
    plik.close();
}
i otóż mam dylemat w jaki sposób zwrócić zmienne rozmiar_x i rozmiar_y do głównego kodu gry bo sprawdziłem i wynoszą one po 0 a powinien x=20 a y=15
W logach żadnych błędów nie mam i w tym największy problem bo tak to wiedział bym co robić a tak to muszę zwracać się do Was o pomoc.
P-71258
DejaVu
» 2012-12-17 02:03:20
Poczytaj o referencjach (» Kurs C++ » Poziom 3Przekazywanie argumentów funkcji przez referencję lekcja).
P-71259
polkom21
Temat założony przez niniejszego użytkownika
» 2012-12-17 13:06:33
No dobra w chwili obecnej wygląda to tak:
main.cpp
C/C++
#include <allegro.h>
#include "global.h"

volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );


int main()
{
    allegro_init();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    install_keyboard();
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 200 ) );
    BITMAP * buffor = NULL;
    buffor = create_bitmap( 800, 600 );
    //START_postać
    BITMAP * person = NULL;
    person = create_bitmap( 40, 40 );
    clear_to_color( person, makecol( 0, 0, 0 ) );
    int person_x = 100, person_y = 100;
    //END_postać
   
    int rozmiar_x = 0, rozmiar_y = 0;
    const char * filemap = "map.txt";
    int map[ 100 ][ 100 ];
    LoadMap( filemap, map, rozmiar_x, rozmiar_y );
    cout << "map X: " << rozmiar_x << " map Y: " << rozmiar_y << endl;
    DrawMap( map, rozmiar_x, rozmiar_y, buffor );
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] ) person_x--;
           
            if( key[ KEY_RIGHT ] ) person_x++;
           
            if( key[ KEY_UP ] ) person_y--;
           
            if( key[ KEY_DOWN ] ) person_y++;
           
            speed--;
        }
        show_position( person_x, person_y );
        clear_to_color( buffor, makecol( 255, 255, 255 ) );
        masked_blit( person, buffor, 0, 0, person_x, person_y, person->w, person->h );
        blit( buffor, screen, 0, 0, 0, 0, 800, 600 );
    }
    remove_int( increment_speed );
   
    destroy_bitmap( person );
    destroy_bitmap( buffor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
global.h
C/C++
#ifndef GLOBAL_H_INCLUDED
#define GLOBAL_H_INCLUDED

//include
#include "console.h"
#include <fstream>
//end_include
using namespace std;

int loadCounterX = 0, loadCounterY = 0, mapSizeX, mapSizeY;

void LoadMap( const char * filename, int map[ 100 ][ 100 ], int & rozmiar_x, int & rozmiar_y )
{
    fstream plik;
    plik.open( filename, ios::in );
    plik >> rozmiar_x >> rozmiar_y;
    for( int x = 0; x < rozmiar_x; x++ )
    {
        for( int y = 0; y < rozmiar_y; y++ )
        {
            plik >> map[ x ][ y ];
        }
    }
    plik.close();
}

void DrawMap( int map[ 100 ][ 100 ], int sizeMapX, int sizeMapY, BITMAP * buffor )
{
    for( int x = 0; x < sizeMapX; x++ )
    {
        for( int y = 0; y < sizeMapY; y++ )
        {
            int positionX = x * 40, positionY = y * 40;
            if( map[ x ][ y ] == 0 )
            {
                //blit(obrazek1, buffor, 0, 0, positionX, positionY, 40, 40);
            }
            else if( map[ x ][ y ] == 1 )
            {
                line( buffor, 400, 200, 600, 400, makecol( 255, 128, 64 ) );
            }
        }
    }
}


#endif // GLOBAL_H_INCLUDED

i problem jest teraz taki, że nie wyświetla mi tej linii i nie mam pojęcia czemu.
P-71276
DejaVu
» 2012-12-17 13:18:52
Hm... może dlatego, że najpierw wyświetlasz mapę, później czyścisz ekran i wyświetlasz bufor? :P

PS. jeden temat = jeden problem :)
P-71278
polkom21
Temat założony przez niniejszego użytkownika
» 2012-12-17 13:34:30
Dobra jak na razie wszystko działa. Dzięki bardzo za pomoc :)
P-71279
« 1 »
  Strona 1 z 1