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

Problem ze strzelaniem.

Ostatnio zmodyfikowano 2013-08-28 10:08
Autor Wiadomość
Ageus
Temat założony przez niniejszego użytkownika
Problem ze strzelaniem.
» 2013-08-27 23:49:22
Witam.

Mam tu kilka problemów, ale podam tu najważniejszy.

Wystrzelony z czołgu pocisk po dotarciu do krawędzi bufora miał wrócić na pozycję w pobliżu lufy. Zamiast tego wraca na pozycję jaką miał zaraz po włączeniu gry. Powstał z tego stacjonarny laser, a nie oto mi chodziło.

Tu jest mój kod:

C/C++
#include <allegro.h>
#include <cmath>
#include <ctime>
#include <cstdlib>
BITMAP * bufor;
BITMAP * czolg;
BITMAP * lufa;
BITMAP * pocisk;
struct tank
{
    double x;
    double y;
    double v;
    double kat;
    double katlufy;
    double xlufy;
    double ylufy;
    double xpocisku;
    double ypocisku;
    double katpocisku;
};
inline void init()
{
    allegro_init();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    clear_to_color( screen, makecol( 0, 255, 0 ) );
    install_timer();
    install_keyboard();
    install_mouse();
}

inline void deinit()
{
    clear_keybuf();
    allegro_exit();
}

int main()
{
    init();
    tank czolgi[ 2 ] = { 100, 400, 0, 0, 0, czolgi[ 0 ].x + 5, czolgi[ 0 ].y + 3, czolgi[ 0 ].xlufy, czolgi[ 0 ].ylufy + 2, 0,
        400, 100, 0, 0, 0, czolgi[ 1 ].x + 5, czolgi[ 1 ].y + 3, czolgi[ 1 ].xlufy, czolgi[ 1 ].ylufy + 2, 0 };
    bufor = create_bitmap( 800, 600 );
    czolg = load_bmp( "czolg.bmp", 0 );
    lufa = load_bmp( "lufa.bmp", 0 );
    pocisk = create_bitmap( 2, 2 );
    draw_sprite( bufor, czolg, czolgi[ 0 ].x, czolgi[ 0 ].y );
    draw_sprite( bufor, lufa, czolgi[ 0 ].xlufy, czolgi[ 0 ].ylufy );
    draw_sprite( bufor, czolg, czolgi[ 1 ].x, czolgi[ 1 ].y );
    draw_sprite( bufor, lufa, czolgi[ 1 ].xlufy, czolgi[ 1 ].ylufy );
    while( !key[ KEY_ESC ] )
    {
       
        draw_sprite( screen, bufor, 0, 0 );
        clear_to_color( bufor, makecol( 0, 255, 0 ) );
        if( key[ KEY_W ] )
        {
            while( czolgi[ 0 ].v < 1 )
            {
                czolgi[ 0 ].v += 0.1;
                czolgi[ 0 ].y -= czolgi[ 0 ].v * cos(( czolgi[ 0 ].kat * M_PI ) / 180 );
                czolgi[ 0 ].x -= czolgi[ 0 ].v * sin(( czolgi[ 0 ].kat * M_PI ) / 180 );
            }
        }
        else
        {
            while( czolgi[ 0 ].v > 0 )
            {
                czolgi[ 0 ].v--;
            }
        }
        if( key[ KEY_S ] )
        {
            while( czolgi[ 0 ].v > - 0.5 )
            {
                czolgi[ 0 ].v -= 0.1;
                czolgi[ 0 ].y -= czolgi[ 1 ].v * cos(( czolgi[ 0 ].kat * M_PI ) / 180 );
                czolgi[ 0 ].x -= czolgi[ 1 ].v * sin(( czolgi[ 0 ].kat * M_PI ) / 180 );
            }
        }
        else
        {
            while( czolgi[ 0 ].v < 0 )
            {
                czolgi[ 0 ].v++;
            }
        }
        if( key[ KEY_A ] )
        {
            czolgi[ 0 ].kat++;
        }
        if( key[ KEY_D ] )
        {
            czolgi[ 0 ].kat--;
        }
        if( key[ KEY_SPACE ] )
        {
            czolgi[ 0 ].katpocisku = - czolgi[ 0 ].katlufy;
            clear_to_color( pocisk, makecol( 255, 0, 0 ) );
            draw_sprite( bufor, pocisk, czolgi[ 0 ].xpocisku, czolgi[ 0 ].ypocisku );
            while( czolgi[ 0 ].ypocisku < 600 && czolgi[ 0 ].ypocisku > 0 && czolgi[ 0 ].xpocisku < 800 && czolgi[ 0 ].xpocisku > 0 )
            {
                czolgi[ 0 ].ypocisku -= 1 * cos(( czolgi[ 0 ].katpocisku * M_PI ) / 180 );
                czolgi[ 0 ].xpocisku -= 1 * sin(( czolgi[ 0 ].katpocisku * M_PI ) / 180 );
                draw_sprite( bufor, pocisk, czolgi[ 0 ].xpocisku, czolgi[ 0 ].ypocisku );
            }
            czolgi[ 0 ].ypocisku = czolgi[ 0 ].ylufy + 2;
            czolgi[ 0 ].xpocisku = czolgi[ 0 ].xlufy;
        }
        if( key[ KEY_Q ] )
        {
            czolgi[ 0 ].katlufy--;
        }
        if( key[ KEY_E ] )
        {
            czolgi[ 0 ].katlufy++;
        }
        if( czolgi[ 0 ].katlufy == 360 )
        {
            czolgi[ 0 ].katlufy = 0;
        }
        czolgi[ 0 ].v *= 0.99;
        rotate_sprite( bufor, czolg, czolgi[ 0 ].x, czolgi[ 0 ].y, ftofix( - czolgi[ 0 ].kat * 256.0 / 360.0 ) );
        rotate_sprite( bufor, lufa, czolgi[ 0 ].x + 5, czolgi[ 0 ].y + 3, ftofix( czolgi[ 0 ].katlufy * 256 / 360 ) );
    }
    destroy_bitmap( lufa );
    destroy_bitmap( czolg );
    destroy_bitmap( bufor );
    destroy_bitmap( pocisk );
    deinit();
    return 0;
}
END_OF_MAIN()

P-91086
akwes
» 2013-08-28 02:50:05
C/C++
czolgi[ 0 ].ypocisku = czolgi[ 0 ].ylufy + 2;
czolgi[ 0 ].xpocisku = czolgi[ 0 ].xlufy;

używasz xlufy oraz ylufy, które nigdy się nie zmieniają. Pozycja czołgu się zmienia bo zmieniasz
C/C++
czolgi[ 0 ].y
czolgi[ 0 ].x

ale xlufy i ylufy same się nie zmienią. Albo korzystaj z czolgi[ 0 ].x/y albo ustawiaj poprawnie pozycję xlufy i ylufy.

Aczkolwiek warto by było abyś przyswoił sobie klasy, bo bez nich Twój kod jest namieszany, mało zrozumiały, pełny zmiennych globalnych oraz programowania na pamięć.
P-91096
Ageus
Temat założony przez niniejszego użytkownika
» 2013-08-28 10:08:48
dziękuje serdecznie. Teraz wszystko działa. Co do klas to myślę że rzeczywiście zacznę się ich uczyć.
P-91104
« 1 »
  Strona 1 z 1