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

[Allegro] Ukrywanie mapy - kafelka

Ostatnio zmodyfikowano 2009-08-25 17:38
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[Allegro] Ukrywanie mapy - kafelka
» 2009-08-24 14:56:29
Witam. Jestem w trakcie pisania gierki do której z mapy wczytuję kafelki, które to kafelki przewijają się u góry ekranu z prawej do lewej. Następnie strzelam do tych kafelków bitmapą pocisk i wszystko jest niby ok. Kiedy pociskiem trafiam w kafelek to ten powinien zniknąć i tu mam problem bo nie wiem jak to zrobić zeby własnie ten trafiony kafelek zniknął a pozostałe pozostały na swoich miejscach. Chodzi mi głownie o rozwiazanie problemu ze znikaniem. Poniżej prezentuję moje wypociny:

C/C++
#include <allegro.h>

BITMAP * bufor = NULL;
BITMAP * statek = NULL;
BITMAP * puszka = NULL;
BITMAP * chmury = NULL;
BITMAP * pocisk = NULL;
SAMPLE * strzal = NULL;
SAMPLE * kolizja = NULL;

class bohater
{
public:
    short int x, y, s, w;
};
bohater pocisk1, puszka1[ 4 ][ 18 ];

// Zmienne potrzebne do poruszania
int pozc_x = 0, pozc_y = 0;
int statek_x = 320, statek_y = 420;
// Zmienne potrzebne do mapy
int mapa_x = 0, mapa_y = 0, wx = 0;
// DEFINICJA MAPY
short int map[ 4 ][ 18 ] =
{
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   
};
bool kolizja1( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
   
    return( false );
};
// Funkcja wyświetlająca mapę:
void wys_mape( int num )
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 18; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 4; licznik_y++ )
        {
            if( map[ licznik_y ][ licznik_x ] == num )
            {
                masked_blit( puszka, bufor, 0, 0,( licznik_x * 40 ) - wx, licznik_y * 40, 40, 40 );
                masked_blit( puszka, bufor, 0, 0,(( licznik_x * 40 ) + screen->w ) - wx, licznik_y * 40, 40, 40 );
            }
           
        }
    }
    wx++;
    if( wx >= screen->w )
         wx = 0;
   
};

volatile long speed = 0;

void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

int main()
{
   
    allegro_init();
    install_keyboard();
    install_timer();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
    install_sound( DIGI_AUTODETECT, MIDI_AUTODETECT, " " );
    bufor = create_bitmap( 640, 480 );
    puszka = load_bmp( "puszka.bmp", default_palette );
    chmury = load_bmp( "chmury.bmp", default_palette );
    statek = load_bmp( "statek.bmp", default_palette );
    pocisk = load_bmp( "pocisk.bmp", default_palette );
    strzal = load_sample( "strzal.wav" );
    kolizja = load_sample( "kolizja.wav" );
    //Zmienne potrzebne do kolizji
    pocisk1.x = 320; pocisk1.y = 420; pocisk1.s = 40; pocisk1.w = 40;
    puszka1[ 4 ][ 18 ].x = 40; puszka1[ 4 ][ 18 ].y = 40; puszka1[ 4 ][ 18 ].s = 40; puszka1[ 4 ][ 18 ].w = 40;
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            if( key[ KEY_RIGHT ] ) { statek_x += 3; pocisk1.x += 3; }
            if( key[ KEY_LEFT ] ) { statek_x -= 3; pocisk1.x -= 3; }
            if( key[ KEY_SPACE ] ) {
                // play_sample(strzal,120,127,1000,0);               
                masked_blit( pocisk, bufor, 0, 0, pocisk1.x, pocisk1.y, pocisk1.s, pocisk1.w );
                pocisk1.y -= 2;
                if( pocisk1.y < 0 )
                     pocisk1.y = 400;
               
            }
            mapa_x--;
            if(( mapa_x +( puszka->h ) ) == 0 )
                 mapa_x = 0;
           
            speed--;
        }
        clear_to_color( bufor, makecol( 0, 0, 0 ) );
        masked_blit( chmury, bufor, 0, 0, pozc_x, pozc_y, chmury->w, chmury->h );
        masked_blit( statek, bufor, 0, 0, statek_x, statek_y, statek->w, statek->h );
        masked_blit( pocisk, bufor, 0, 0, pocisk1.x, pocisk1.y -= 3, pocisk1.s, pocisk1.w );
       
        // Wyświetlanie mapy
        wys_mape( 0 );
       
        masked_blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
        for( int i = 0; i <= 4; i++ )
        for( int j = 0; j <= 18; j++ )
        if( kolizja1( pocisk1.x, pocisk1.y, pocisk1.s, pocisk1.w, puszka1[ i ][ j ].x, puszka1[ i ][ j ].y, puszka1[ i ][ j ].s, puszka1[ i ][ j ].w ) == true )
        {
            map[ i ][ j ] = 2;
            play_sample( kolizja, 60, 255, 1000, 0 );
        }
    }
   
   
    destroy_bitmap( bufor );
    destroy_bitmap( statek );
    destroy_bitmap( pocisk );
    destroy_bitmap( chmury );
    remove_int( increment_speed );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Najwięcej problemu sprawia mi poniższy kod z którym niepotrafię sobie jak narazie samemu poradzić. Proszę o pomoc w rozwiazaniu tego problemu.

C/C++
for( int i = 0; i <= 4; i++ )
for( int j = 0; j <= 18; j++ )
if( kolizja1( pocisk1.x, pocisk1.y, pocisk1.s, pocisk1.w, puszka1[ i ][ j ].x, puszka1[ i ][ j ].y, puszka1[ i ][ j ].s, puszka1[ i ][ j ].w ) == true )
{
    map[ i ][ j ] = 2;
    play_sample( kolizja, 60, 255, 1000, 0 );
}
P-9801
DejaVu
» 2009-08-24 21:13:18
Każdy kafelek/klocek powinien mieć stan czy jest zapalony czy nie.
P-9817
wojownik266
Temat założony przez niniejszego użytkownika
» 2009-08-25 08:14:58
A tak bardziej dokładniej i powazniej?
P-9828
programista12
» 2009-08-25 12:14:37
Użyj typów wyliczeniowych:
C/C++
enum STANKLOCKA { SK_ZNISZCZONY, SK_WIDOCZNY };

Potem tworzysz zmienną:
C/C++
STANKLOCKA stan = SK_WIDOCZNY;

Potem, gdy następuje kolizja zmieniasz wartość zmiennej stan na SK_ZNISZCZONY i robisz if-a co ma się dziać, jak klocek jest zniszczony.
P-9830
wojownik266
Temat założony przez niniejszego użytkownika
» 2009-08-25 12:48:14
Dzieki za odpowiedź. Mogę prosić o kawałek działajacego kodu (kolizja  + enum) ilustrujacego to rozwiazanie? Bo ja taki niebiesko zielony jeszcze jestem. Z góry dziekuję!
P-9833
Aithne
» 2009-08-25 13:12:53
Prosić to możesz, gorzej z tym, czy ktoś ci pieprzonego gotowca da (tak, gotowca - to jest perfidna prośba o gotowca)... Twój program, to sam napisz. Zawsze google (w którym możesz znaleźć tutoriale) służy pomocą. Chyba, że masz problem z czymś konkretnym ("nie potrafię [=nie chce mi się i szukam frajera, który zrobi to za mnie] tego napisać" takie nie jest), wtedy możesz pisać. Ale gotowcom mówię (i pewnie nie tylko ja) stanowcze NIE. A teraz słucham, z czym konkretnie masz problem?
P-9834
malan
» 2009-08-25 13:35:44
Możesz jeszcze spróbować tak:
1. Stwórz sobie bitmapę (nazwijmy ją 'tło') o wielkości klocka (zakładam, że wszystkie są takiej samej wielkości) i nanieś na nią kolor tła, po którym przewijają się klocki;
2. Jeśli występuje kolizja (klocek został trafiony) to podmień bitmapę trafiony_klocek z bitmapą tło - będzie wyglądało jak by klocek zniknął.
Nie sprawdzałem tej metody jeszcze, ale może zadziała... ;p.
P-9837
DejaVu
» 2009-08-25 17:38:25
Nynaeve - ostro pojechałeś z tematem :P no ale w sumie masz rację. Dostał wystarczająco dobre opisowe rozwiązanie problemu :) Staraj się używać łagodniejszych sformułowań w przyszłości jeśli Twoja klawiatura od tego nie ucierpi :P
P-9843
« 1 »
  Strona 1 z 1