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

[Allegro 4] Szachy - przemieszczanie i bicie

Ostatnio zmodyfikowano 2012-01-25 15:16
Autor Wiadomość
squadron
Temat założony przez niniejszego użytkownika
[Allegro 4] Szachy - przemieszczanie i bicie
» 2012-01-25 12:02:08
Witam ! Jestem w trakcie tworzenia szachów przy pomocy allegro i mam problem z przesuwaniem się pojedynczych bitmap w momencie przesuwanie jednej np wierzy przesuwam również pion zapętliłem się już w tym wszystkim proszę o podpowiedź. Nie które elementy kodu są nie potrzebne i jestem tego świadom.


C/C++
#include <allegro.h>
#include<alpng.h>
#define WIDTH 800
#define HEIGHT 800

BITMAP * bufor;
BITMAP * plansza;
BITMAP * bierki;
BITMAP * pionek;
BITMAP * pionekb;
BITMAP * wieza;
BITMAP * wiezab;
BITMAP * skoczek;
BITMAP * skoczekb;
BITMAP * goniec;
BITMAP * goniecb;
BITMAP * hetman;
BITMAP * hetmanb;
BITMAP * krol;
BITMAP * krolb;

int mx = 0, my = 0, mb = 0;
int ticks = 0;
bool wyjscie = false;
bool stan = false;
float x = 0, y = 0;

int wiezab_x = 692, wiezab_y = 692, wiezab_s = 65, wiezab_w = 65;
int pionek_x = 42, pionek_y = 135, pionek_s = 65, pionek_w = 65;

/******************************************************************/
void timerproc()
{
    ticks++;
}
/******************************************************************/
bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 )
{
    if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true;
    else return false; };

/******************************************************************/
void init()
{
   
    allegro_init();
    install_mouse();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, WIDTH, HEIGHT, 0, 0 );
    install_int( timerproc, 30 );
}

int install_int( void( * proc )(), int speed );
/******************************************************************/
void load()
{
    show_mouse( screen );
    unscare_mouse();
    bufor = create_bitmap( WIDTH, HEIGHT );
    plansza = load_bitmap( "plansza.bmp", NULL );
    bierki = create_bitmap( 65, 65 );
    pionek = load_bmp( "pionek.bmp", NULL );
    pionekb = load_bmp( "pionekb.bmp", NULL );
    wieza = load_bmp( "wieza.bmp", NULL );
    wiezab = load_bmp( "wiezab.bmp", NULL );
    skoczek = load_bmp( "skoczek.bmp", NULL );
    skoczekb = load_bmp( "skoczekb.bmp", NULL );
    goniec = load_bmp( "goniec.bmp", NULL );
    goniecb = load_bmp( "goniecb.bmp", NULL );
    hetman = load_bmp( "hetman.bmp", NULL );
    hetmanb = load_bmp( "hetmanb.bmp", NULL );
    krol = load_bmp( "krol.bmp", NULL );
    krolb = load_bmp( "krolb.bmp", NULL );
}
/******************************************************************/
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};
/*******************************************************************/
void draw()
{
    clear_to_color( bufor, makecol( 255, 0, 255 ) );
   
    masked_blit( plansza, bufor, 0, 0, 0, 0, WIDTH, HEIGHT );
   
   
    int w = 42, tmp;
    for( int i = 0; i < 8; i++ )
    {
        masked_blit( pionek, bufor, 0, 0, pionek_x, pionek_y, pionek_s, pionek_w );
        tmp = w + 93;
        w = tmp;
    }
    //w=42;
   
    //clear_to_color(bufor,makecol(255,0,255)); kolor tła
    /*
    draw_sprite(bufor,pionek,65,65);
    blit(pionek,plansza,0,0,42,135,WIDTH,HEIGHT);
    blit(pionek,plansza,0,0,135,135,WIDTH,HEIGHT);
    blit(pionek,plansza,0,0,227,135,WIDTH,HEIGHT);
    blit(pionek,plansza,0,0,320,135,WIDTH,HEIGHT);
    blit(pionek,plansza,0,0,413,135,WIDTH,HEIGHT);
    blit(pionek,plansza,0,0,506,135,WIDTH,HEIGHT);
    blit(pionek,plansza,0,0,599,135,WIDTH,HEIGHT);
    blit(pionek,plansza,0,0,692,135,WIDTH,HEIGHT);*/
    for( int i = 0; i < 8; i++ )
    {
        masked_blit( pionekb, bufor, 0, 0, w - 93, 600, WIDTH, HEIGHT );
        tmp = w - 93;
        w = tmp;
    }
    /*
    blit(pionekbb,plansza,0,0,692,600,WIDTH,HEIGHT);
    blit(pionekbb,plansza,0,0,599,600,WIDTH,HEIGHT);
    blit(pionekbb,plansza,0,0,506,600,WIDTH,HEIGHT);
    blit(pionekbb,plansza,0,0,413,600,WIDTH,HEIGHT);
    blit(pionekbb,plansza,0,0,320,600,WIDTH,HEIGHT);
    blit(pionekbb,plansza,0,0,227,600,WIDTH,HEIGHT);
    blit(pionekbb,plansza,0,0,135,600,WIDTH,HEIGHT);
    blit(pionekbb,plansza,0,0,42,600,WIDTH,HEIGHT); */
   
   
    //Bierki w pierwszej lini czarne
    masked_blit( wieza, bufor, 0, 0, 42, 42, WIDTH, HEIGHT );
    masked_blit( skoczek, bufor, 0, 0, 135, 42, WIDTH, HEIGHT );
    masked_blit( goniec, bufor, 0, 0, 227, 42, WIDTH, HEIGHT );
    masked_blit( hetman, bufor, 0, 0, 320, 42, WIDTH, HEIGHT );
    masked_blit( krol, bufor, 0, 0, 413, 42, WIDTH, HEIGHT );
    masked_blit( goniec, bufor, 0, 0, 506, 42, WIDTH, HEIGHT );
    masked_blit( skoczek, bufor, 0, 0, 599, 42, WIDTH, HEIGHT );
    masked_blit( wieza, bufor, 0, 0, 692, 42, WIDTH, HEIGHT );
    //bierki w ostatniej lini białe
    masked_blit( wiezab, bufor, 0, 0, 42, 692, WIDTH, HEIGHT );
    masked_blit( skoczekb, bufor, 0, 0, 135, 692, WIDTH, HEIGHT );
    masked_blit( goniecb, bufor, 0, 0, 227, 692, WIDTH, HEIGHT );
    masked_blit( hetmanb, bufor, 0, 0, 320, 692, WIDTH, HEIGHT );
    masked_blit( krolb, bufor, 0, 0, 413, 692, WIDTH, HEIGHT );
    masked_blit( goniecb, bufor, 0, 0, 506, 692, WIDTH, HEIGHT );
    masked_blit( skoczekb, bufor, 0, 0, 599, 692, WIDTH, HEIGHT );
    masked_blit( wiezab, bufor, 0, 0, wiezab_x, wiezab_y, wiezab_s, wiezab_w );
   
    blit( bufor, screen, 0, 0, 0, 0, WIDTH, HEIGHT );
}
/*******************************************************************/
void fwieza()
{
   
    if( mx >= wiezab_x && mx <= wiezab_x + 65 &&
    my >= wiezab_y && my <= wiezab_y + 65 &&
    mb & 1 ) stan = true;
   
    if( mb == 0 ) stan = false;
   
    if( stan == true ) wiezab_x = mx - 32, wiezab_y = my - 32;
   
    if( wiezab_x == 692 && wiezab_y == 135 );
   
}
void fpionek()
{
   
    if( mx >= pionek_x && mx <= pionek_x + 65 &&
    my >= pionek_y && my <= pionek_y + 65 &&
    mb & 1 ) stan = true;
   
    if( mb == 0 ) stan = false;
   
    if( stan == true ) pionek_x = mx - 32, pionek_y = my - 32;
   
    if( pionek_x == 42 && pionek_y == 135 );
   
}

/******************************************************************/
void logic()
{
    if( key[ KEY_ESC ] ) wyjscie = true;
   
}
/******************************************************************/
void release()
{
    destroy_bitmap( plansza );
    destroy_bitmap( bufor );
    allegro_exit();
}

/******************************************************************/
int main()
{
    void alpng_init();
    init();
    load();
   
    while( !wyjscie )
    {
        draw();
        myszka();
        fwieza();
        fpionek();
        //fwieza();
        while( ticks > 0 )
        {
            logic();
            ticks--;
        }
    }
    release();
    return 0;
}
END_OF_MAIN();
P-49400
DejaVu
» 2012-01-25 12:49:52
W szachach nie tworzy się takiego algorytmu kolizji jaki masz w kodzie. Sprawdza się tylko 'czy cokolwiek' stoi na danym polu/polach szachownicy.
P-49404
squadron
Temat założony przez niniejszego użytkownika
» 2012-01-25 15:16:16
Bardziej rozchodzi mi się o to jak napisać obsługę myszki dla wielu elementów . Tzn mam różne figury szachowe i tak jak mam ujęte tutaj
C/C++
void fwieza()
{
   
    if( mx >= wiezab_x && mx <= wiezab_x + 65 &&
    my >= wiezab_y && my <= wiezab_y + 65 &&
    mb & 1 ) stan1 = true;
   
    if( mb == 0 ) stan1 = false;
   
    if( stan1 == true ) stan = false;
   
    if( stan1 == true ) wiezab_x = mx - 32, wiezab_y = my - 32;
   
    if( wiezab_x == 692 && wiezab_y == 135 );
   
}
void fpionek()
{
   
    if( mx >= pionek_x && mx <= pionek_x + 65 &&
    my >= pionek_y && my <= pionek_y + 65 &&
    mb & 1 ) stan = true;
   
    if( mb == 0 ) stan = false;
   
    if( stan == true ) pionek_x = mx - 32, pionek_y = my - 32;
   
    if( pionek_x == 42 && pionek_y == 135 );
   
}
czy do każdej figury muszę robić bool stanN-true które będzie odpowiadać za figurę czy można to zrobić jakoś hurtem ?
poza tym pojawia się problem że gdy wartość jest true to najeżdżając już podniesioną figurą na drugą figurę podnoszę ją :/
P-49412
« 1 »
  Strona 1 z 1