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

[Allegro] Mam gotowe strzelanie lecz problem..

Ostatnio zmodyfikowano 2012-07-17 12:09
Autor Wiadomość
hakr1921
Temat założony przez niniejszego użytkownika
» 2012-07-16 22:33:42
Zrobilem  to bez tego ifa i również nie działa.
I oto cały dylemat mojego dnia. Nie moje zrobić prostej gierki przez głupie strzelanie..
P-60264
kampar
» 2012-07-16 22:47:22
A czy gdzieś napisałem, że masz wywalić tego ifa? Po prostu musisz krok po kroku przeanalizować działanie swojego kodu i ustalić co nie działa. Pocisk się nie wyświetla? A może ma złą pozycje? Albo jego pozycja się nie zmienia? I wtedy zobacz na odpowiedni fragment i ustal dlaczego on się nie wykonuje właściwie. Musisz do tego dojść sam, nikomu się gotowca pisać nie chce.

Tak na marginesie takie coś nie jest dopuszczalne:
C/C++
// DEFINICJA MAPY
short int map[ 15 ][ 20 ] =
{
   
};

Nie powinno się operować na tablicy, której nie przypisaliśmy wartości
P-60265
hakr1921
Temat założony przez niniejszego użytkownika
» 2012-07-16 23:11:48
Dobra, w miare ogarnąłem już kod tylko są dwa problemy.

1. Pocisk pojawia się na mapie, ja chce żeby leciał od postaci
2. Pocisk leci pod dobrym kątem, tylko przesuwa się on może o 10 pixeli

KOD


#include <allegro.h>
#include <cmath>

class Cpostac
{
      public:
             int x,y;
             short int kierunek, klatka;
};
// Zmienna naszej klasy
Cpostac ludek;

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

// Zmienna
int mapa_x = 0, mapa_y = 0;
BITMAP *bufor = NULL;
BITMAP *ludekb = NULL;
BITMAP *teren = NULL;
FONT * font_pcx = NULL;
BITMAP *kursor = NULL;
BITMAP *x = NULL;
// DEFINICJA MAPY
short int map[20][20] =
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
};
//kursor
int mx = 0, my = 0, mb = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};
//WYsiwetalnie mapy
void  wys_mape()
{
      int licznik_x, licznik_y;
      for (licznik_x = 0; licznik_x < 100 ; licznik_x++)
      {
      for (licznik_y = 0; licznik_y < 100 ; licznik_y++)
      {
           blit(teren,bufor,
           (map[licznik_y + mapa_y][licznik_x + mapa_x]%4) * 32,
           (map[licznik_y + mapa_y][licznik_x + mapa_x]/4) * 32,
           licznik_x * 32,licznik_y * 32,32,32);
      }
      }
};


// Funkcja G³ówna
int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_FULLSCREEN,640,480,0,0);
install_timer();
install_int_ex(increment_speed, BPS_TO_TIMER(80));



// Tworzenie bufora
bufor = create_bitmap(640,480);
// £adowanie grafiki
ludekb = load_bmp("ludek1.bmp",default_palette);
teren = load_bmp("teren.bmp",default_palette);
font_pcx = load_font("arial_16.pcx",default_palette, NULL);
x = load_bmp( "strzal.bmp", default_palette );
kursor = load_bitmap( "kursor.bmp", default_palette);
//opcje myszki
install_mouse();
set_mouse_sprite( kursor );
unscare_mouse();
// Ustalanie pocz¹tkowej pozycji ludzika
int frame = 0;
ludek.x = 100;
ludek.y = 100;
ludek.klatka = 0;
ludek.kierunek = 0;

bool strzalv = false;
double predkosc = 10;
double kat;
double deltaX, deltaY;
double ix = ludek.x, iy = ludek.y;
int celx = ix, cely = iy;
while( !key[KEY_ESC])
{
while( speed > 0)
{
     if( strzalv == false ) { //to podzielilem tak jak uwazalem ale nie dziala
                if( mouse_b == 1 )
                {
                    celx = mx;
                    cely = my;
                    deltaX = ix - celx;
                    deltaY = iy - cely;
                    strzalv = true;
                }
                if( strzalv == true ) {
                    if(( deltaY ) == 0 )
                    {
                        kat = 0;
                    } else
                    {
                        kat = atan(( deltaX ) /( deltaY ) ); //nie wiem co to do konca oznacza
                    } //else

                    if( deltaY >= 0 )
                    {
                        kat += M_PI; //nie wiem co to do konca oznacza
                    } //if

                }


                if( iy != cely || ix != celx )
                {
                    ix += sin( kat ) * predkosc;
                    iy += cos( kat ) * predkosc;
                } }

            if( iy <- 20 ) ( strzalv = false );



ludek.kierunek = 0;

if( key[KEY_LEFT]) { ludek.kierunek = 4; ludek.x-=2; }
if( key[KEY_RIGHT]) { ludek.kierunek = 2; ludek.x+=2; }
if( key[KEY_UP]) { ludek.kierunek = 1; ludek.y-=2; }
if( key[KEY_DOWN]) { ludek.kierunek = 3; ludek.y+=2; }
if( key[KEY_A]) { ludek.kierunek = 4; ludek.x-=2; }
if( key[KEY_D]) { ludek.kierunek = 2; ludek.x+=2; }
if( key[KEY_W]) { ludek.kierunek = 1; ludek.y-=2; }
if( key[KEY_S]) { ludek.kierunek = 3; ludek.y+=2; }


speed--;

frame++;
if( frame > 40) frame=0;
}

// Czyszczenie bufora
clear_to_color(bufor, makecol(150,150,150));

//Wyswietl mape
wys_mape();


// Sterowanie animacj¹
if( frame<20) { ludek.klatka = 0;}
else if( frame>=20 && frame<40) { ludek.klatka = 1; }

//strtzal
myszka();
masked_blit( x, bufor, 0, 0,( int ) ix,( int ) iy, 200, 200 );
textprintf_ex( bufor, font, 10, 10, makecol( 200, 200, 200 ), - 1, "deltaX = %d, deltaY = %d !",( int ) iy - cely,( int ) ix - celx );

//Wyœwietlanie ludzika
masked_blit( ludekb, bufor, ludek.kierunek*32 ,ludek.klatka*32 ,ludek.x, ludek.y, 32,32);

//wyswietlanie kursora

masked_blit( kursor, bufor, 0, 0, mouse_x, mouse_y, kursor->w, kursor->h );
blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
}
// Usuwanie wszystkiego z pamiêci.
remove_int( increment_speed);
destroy_bitmap(ludekb);
destroy_bitmap( bufor );
destroy_bitmap( kursor );
allegro_exit();
return 0;
}
END_OF_MAIN();

P-60266
DejaVu
» 2012-07-17 01:03:35
Jeżeli nie potrafisz rozwiązywać takich prostych problemów to powinieneś wrócić do podstaw programowania. Sklejasz kod z tego co znajdziesz na necie, a nie piszesz go samodzielnie.
P-60271
hakr1921
Temat założony przez niniejszego użytkownika
» 2012-07-17 02:22:27
Ja się uczę z przykładów, nie z tutoriali.

PS.

Dobra wszystko już mam prócz dwóch drobiazgów


1. Możliwość wystrzelenia kilkunastu pocisków  jednocześnie
2. Zrobienie żeby pocisk leciał tylko w kierunku myszki, po następnym kliknięciu ma nie zmieniać toru

Jak to zrobić?

OBECNY KOD


#include <allegro.h>
#include <cmath>

class Cpostac
{
      public:
             int x,y;
             short int kierunek, klatka;
};
Cpostac ludek;

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

// Zmienna
int mapa_x = 0, mapa_y = 0;
BITMAP *bufor = NULL;
BITMAP *ludekb = NULL;
BITMAP *teren = NULL;
FONT * font_pcx = NULL;
BITMAP *kursor = NULL;
BITMAP *x = NULL;
// DEFINICJA MAPY
short int map[20][20] =
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
};
//kursor
int mx = 0, my = 0, mb = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};

//WYsiwetalnie mapy
void  wys_mape()
{
      int licznik_x, licznik_y;
      for (licznik_x = 0; licznik_x < 100 ; licznik_x++)
      {
      for (licznik_y = 0; licznik_y < 100 ; licznik_y++)
      {
           blit(teren,bufor,
           (map[licznik_y + mapa_y][licznik_x + mapa_x]%4) * 32,
           (map[licznik_y + mapa_y][licznik_x + mapa_x]/4) * 32,
           licznik_x * 32,licznik_y * 32,32,32);
      }
      }
};


// Funkcja G³ówna
int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_FULLSCREEN,640,480,0,0);
install_timer();
install_int_ex(increment_speed, BPS_TO_TIMER(80));



// Tworzenie bufora
bufor = create_bitmap(640,480);
// £adowanie grafiki
ludekb = load_bmp("ludek1.bmp",default_palette);
teren = load_bmp("teren.bmp",default_palette);
font_pcx = load_font("arial_16.pcx",default_palette, NULL);
x = load_bmp( "strzal.bmp", default_palette );
kursor = load_bitmap( "kursor.bmp", default_palette);
//opcje myszki
install_mouse();
set_mouse_sprite( kursor );
unscare_mouse();
// Ustalanie pocz¹tkowej pozycji ludzika
int frame = 0;
ludek.x = 200;
ludek.y = 200;
ludek.klatka = 0;
ludek.kierunek = 0;

double predkosc = 5;
double kat;
double ix = ludek.x, iy = ludek.y;
int celx = ix, cely = iy;
while( !key[KEY_ESC])
{
while( speed > 0)
{


     if( mb == 1 )
            {
                celx = mx;
                cely = my;
                double deltaX = ix - celx;
                double deltaY = iy - cely;

                if(( deltaY ) == 0 )
                {
                    kat = 0;
                } else
                {
                    kat = atan(( deltaX ) /( deltaY ) );
                } //else

                if( deltaY >= 0 )
                {
                    kat -= M_PI;
                } //if

            }


            if( iy != cely || ix != celx )
            {
                ix += sin( kat ) * predkosc;
                iy += cos( kat ) * predkosc;
            }


  if( mouse_b == 1)
                    kursor = load_bitmap( "kursor2.bmp", default_palette);
                    else{
                    kursor = load_bitmap( "kursor.bmp", default_palette);
                    }

ludek.kierunek = 0;

if( key[KEY_LEFT]) { ludek.kierunek = 4; ludek.x-=2; }
if( key[KEY_RIGHT]) { ludek.kierunek = 2; ludek.x+=2; }
if( key[KEY_UP]) { ludek.kierunek = 1; ludek.y-=2; }
if( key[KEY_DOWN]) { ludek.kierunek = 3; ludek.y+=2; }
if( key[KEY_A]) { ludek.kierunek = 4; ludek.x-=2; }
if( key[KEY_D]) { ludek.kierunek = 2; ludek.x+=2; }
if( key[KEY_W]) { ludek.kierunek = 1; ludek.y-=2; }
if( key[KEY_S]) { ludek.kierunek = 3; ludek.y+=2; }


speed--;

frame++;
if( frame > 40) frame=0;
}

// Czyszczenie bufora
clear_to_color(bufor, makecol(150,150,150));

//Wyswietl mape
wys_mape();

//strtzal
        myszka();
        masked_blit( x, bufor, 0, 0, ix, iy, 200, 200 );
        textprintf_ex( bufor, font, 40, 40, makecol( 200, 200, 200 ), - 1, "deltaX = %d, deltaY = %d !",( int ) iy - cely,( int ) ix - celx );


// Sterowanie animacj¹
if( frame<20) { ludek.klatka = 0;}
else if( frame>=20 && frame<40) { ludek.klatka = 1; }

//Wyœwietlanie ludzika
masked_blit( ludekb, bufor, ludek.kierunek*32 ,ludek.klatka*32 ,ludek.x, ludek.y, 32,32);

//wyswietlanie kursora

masked_blit( kursor, bufor, 0, 0, mouse_x, mouse_y, kursor->w, kursor->h );
blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h );
clear_keybuf();
}
// Usuwanie wszystkiego z pamiêci.
remove_int( increment_speed);
destroy_bitmap(ludekb);
destroy_bitmap( bufor );
destroy_bitmap( kursor );
allegro_exit();
return 0;
}
END_OF_MAIN();

P-60277
kampar
» 2012-07-17 12:06:19
Ja się uczę z przykładów, nie z tutoriali.
I dlatego nie rozumiesz co piszesz

Ad.1. Należy zrobić tablicę pocisków, najlepiej zeby to była tablica dynamiczna: list, ewentualnie vector » Kurs STL, C++Kontener tablicy (std::vector) lekcja

Ad.2. Kąt pocisku ustalasz tylko przy strzale, a dalej pozostaje stały

P-60305
hakr1921
Temat założony przez niniejszego użytkownika
» 2012-07-17 12:09:24
Okej, dzięki
P-60306
1 « 2 »
Poprzednia strona Strona 2 z 2