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

[Allegro] Celownik

Ostatnio zmodyfikowano 2009-12-10 17:45
Autor Wiadomość
PhonniX
Temat założony przez niniejszego użytkownika
[Allegro] Celownik
» 2009-12-09 21:25:40
Witam.
Chcę zrobić celownik taki jak w worms'ach, czyli pokazuje kąt z jakim zostanie wystrzelony pocisk, mam kąt pocisku ale nie wiem jak zrobić celownik. Proszę o pomoc.
P-12019
DejaVu
» 2009-12-10 16:46:12
nie wiem jak wygląda celownik w wormsach ;) Domyślam się, że chodzi Ci o narysowanie linii narysowanej pod odpowiednim kątem. To będzie szło mniej więcej tak:
C/C++
double x = 100 * sin( kat * 180.0 / M_PI );
double y = 100 * cos( kat * 180.0 / M_PI );
line( 123, 123, 123 + x, 123 + y );

/edit:
A tak nawiasem mówiąc gdzieś to już było na forum (chyba w temacie związanym z obracaniem samochodu, ale nie pamiętam teraz dokładnie).
P-12029
PhonniX
Temat założony przez niniejszego użytkownika
» 2009-12-10 17:33:47
Mam jeszcze jedno pytanie, dlaczego celownik pokazuje jedno, a pocisk leci w drugie?
C/C++
#include <allegro.h>
#include <vector>
#include <cmath>
#include <math.h>
#define PI 3.14159265       //definiowanie PI


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

class Pocisk
{
public:
    int x, y;
    int speed;
    int size;
    bool leci;
   
};

std::vector < Pocisk > Pociski;
Pocisk Bomba;
Pocisk Pistolet;

int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
    install_timer();
    install_mouse();
    show_mouse( screen );
    unscare_mouse();
    install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) );
   
   
    BITMAP * bufor = NULL;
    BITMAP * ludek = NULL;
    BITMAP * plansza = NULL;
    BITMAP * bomba = NULL;
   
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
   
    ludek = load_bmp( "ludek.bmp", default_palette );
    plansza = load_bmp( "plansza.bmp", default_palette );
    bomba = load_bmp( "panbomba.bmp", default_palette );
   
    int ludek_x = 100, ludek_y = 100;
    int czekaj = 0;
    int bron = 1;
    double kat = 0;
   
   
   
    Bomba.speed = 5;
    Bomba.size = 30;
    Pistolet.speed = 30;
    Pistolet.size = 10;
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        { myszka();
            // Sterowanie naszą postacią
            if(( key[ KEY_RIGHT ] ) &&( ludek_x < 800 ) ) { ludek_x += 3; } else
            if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) ) { ludek_x -= 3; } else
            //if((key[KEY_DOWN]) && (mapa_y < 5)){ mapa_y = mapa_y + 1; } else
            if(( key[ KEY_UP ] ) &&( ludek_y > 40 ) ) { ludek_y -= 10; }
            if( key[ KEY_SPACE ] && czekaj <= 0 ) {
                if( bron == 1 ) { Bomba.x = ludek_x; Bomba.y = ludek_y; Bomba.leci = true; Pociski.push_back( Bomba ); czekaj = 100; }
                if( bron == 2 ) { Pistolet.x = ludek_x; Pistolet.y = ludek_y; Pistolet.leci = true; Pociski.push_back( Pistolet ); czekaj = 30; }
            }
            if( key[ KEY_Z ] ) { if( bron == 1 ) { bron = 2; } else { bron = 1; } }
           
            if( key[ KEY_Q ] ) { kat += 0.001; }
            if( key[ KEY_W ] ) { kat -= 0.001; }
            // Jeśli ludek wisi w powietrzu to powinien spadać:
            if( getpixel( plansza, ludek_x, ludek_y ) != makecol( 255, 0, 255 ) &&
            getpixel( plansza, ludek_x, ludek_y - 3 ) != makecol( 255, 0, 255 ) &&
            ludek_y > 40 ) ludek_y -= 3;
           
            if( getpixel( plansza, ludek_x, ludek_y ) == makecol( 255, 0, 255 ) ) ludek_y += 3;
           
            for( int i = 0; i < Pociski.size(); i++ )
            {
                // Pociski[i].y+=Pociski[i].speed;
                Pociski[ i ].x += sin( kat ) * Pociski[ i ].speed;
                Pociski[ i ].y += cos( kat ) * Pociski[ i ].speed;
            }
           
           
            czekaj--;
            speed--;
        }
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
        masked_blit( ludek, bufor, 0, 0, ludek_x - 20, ludek_y - 40, ludek->w, ludek->h );
        masked_blit( plansza, bufor, 0, 0, 0, 0, plansza->w, plansza->h );
        for( int i = 0; i < Pociski.size(); i++ )
        {
            if( Pociski[ i ].leci ) { masked_blit( bomba, bufor, 0, 0, Pociski[ i ].x, Pociski[ i ].y, bomba->w, bomba->h );
                if( getpixel( plansza, Pociski[ i ].x, Pociski[ i ].y ) != makecol( 255, 0, 255 ) ||
                getpixel( plansza, Pociski[ i ].x + 32, Pociski[ i ].y ) != makecol( 255, 0, 255 ) ||
                getpixel( plansza, Pociski[ i ].x, Pociski[ i ].y + 32 ) != makecol( 255, 0, 255 ) ||
                getpixel( plansza, Pociski[ i ].x + 32, Pociski[ i ].y + 32 ) != makecol( 255, 0, 255 ) )
                {
                    circlefill( plansza, Pociski[ i ].x + 20, Pociski[ i ].y + 20, Pociski[ i ].size, makecol( 255, 0, 255 ) );
                    Pociski[ i ].leci = false;
                } }
        }
        double xx = 100 * sin( kat * 180.0 / M_PI );
        double yy = 100 * cos( kat * 180.0 / M_PI );
        line( bufor, ludek_x, ludek_y - 20, xx + ludek_x, yy + ludek_y, makecol( 255, 128, 64 ) );
        textprintf_ex( bufor, font, 10, 10, makecol( 0, 0, 0 ), - 1, "Bron:%d", bron, 7, 8 );
        textprintf_ex( bufor, font, 10, 30, makecol( 0, 0, 0 ), - 1, "Kąt:%d", kat, 7, 8 );
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
   
    remove_int( increment_speed );
    destroy_bitmap( ludek );
   
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-12031
DejaVu
» 2009-12-10 17:45:20
C/C++
Pociski[ i ].x += sin( kat * 180.0 / M_PI ) * Pociski[ i ].speed;
Pociski[ i ].y += cos( kat * 180.0 / M_PI ) * Pociski[ i ].speed;
P-12032
« 1 »
  Strona 1 z 1