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

Allegro 5 budowa gier

Ostatnio zmodyfikowano 2013-04-12 22:16
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
Allegro 5 budowa gier
» 2013-04-05 08:21:03
Witam napisałem już drugą grę w allegro, teraz chciałem zrobić coś w stylu arkanoida lub galazy z pegazusa. Chciałem się dowiedzieć jak najlepiej zaprogramować te gry, nie chce żebyście mi tłumaczyli całą grę. Np jak mam kilkadziesiąt klocków do rozwalenia to czy wszystkie współrzędne trzeba trzymać w jakiejś tablicy i potem sprawdzać w pętli kolizję z piłką czy lepiej użyć listy itp. Dzięki za pomoc .       
P-79968
RazzorFlame
» 2013-04-05 08:45:28
Przeczytaj kurs "Wytwarzanie Gier 2D" który znajduje się na tej stronie. Teraz stwórz sobie klase przeciwnika to np tak:
C/C++
class Przeciwnik
{
public:
    Przeciwnik();
    Przeciwnik( int _maxhp, int _hp, int _x, int _y );
    int maxhp, hp;
    int x, y;
    void Logika(); //"chodzenie" lub przesuwanie sie obiektu
   
};
Teraz za pomocą vectora stl'owego (#include <vector>) tworzysz sobie tablice tych przeciwników:
C/C++
vector < Przeciwnik > vPrzeciwnicy;
Przeczytaj (jeśli tego nie przeczytaleś jeszcze) kurs na tej stronie "Kurs STL" o vectorze (o innych kontenerach też by się przydało) i tym sposobem masz sobie tablice danych przeciwników. W logice możesz też umieścić kolizje itp. Tak samo zrób z pociskami (w Galaxy) tyle że w klasie umieść dane dot. np prędkości, obrażeń itp.
P-79969
aaadam
Temat założony przez niniejszego użytkownika
» 2013-04-06 13:40:00
witam poczytałem trochę i nawet coś mi wyszło ale mam pewien problem jak strzelam. Gdy współrzędna pocisku dojdzie do wartości y=0 uruchamiam funkcje pop.back() usuwającą ostatni element z wektora i waśnie w tym momencie  zacina się gra.Drugi problem to kolizja dałem ją w komentarzu ponieważ od razu się wyłącza debugowanie, jeżeli mam jeszcze jakieś rażące błędy tez proszę powiedzieć jakie a o to kod:

C/C++
#include <allegro5\allegro5.h>
#include <allegro5\allegro_native_dialog.h>
#include <allegro5\allegro_image.h>
#include <allegro5\allegro_font.h>
#include <allegro5\allegro_ttf.h>
#include <allegro5\allegro_acodec.h>
#include <allegro5\allegro_audio.h>
#include <allegro5\allegro_primitives.h>
#include <iostream>
#include <vector>
using namespace std;
#define ScreenWidth 800
#define ScreenHeight 600
#define FPS 60

bool kolizja( int x1, int y1, int x2, int y2 )
{
    if( x2 <= x1 + 30 && x2 > x1 && y2 >= y1 && y2 <= y1 + 30 ) return true; else
    if( x2 <= x1 + 30 && x2 > x1 && y2 + 20 >= y1 && y2 + 30 <= y1 + 30 ) return true; else
    if( x2 + 30 <= x1 + 30 && x2 + 30 > x1 && y2 >= y1 && y2 <= y1 + 30 ) return true; else
    if( x2 + 30 <= x1 + 30 && x2 + 30 > x1 && y2 + 30 >= y1 && y2 + 30 <= y1 + 30 ) return true;
    else return false;
   
};

class Player
{
private:
    int x, y;
public:
    Player( int x, int y );
    Player( void );
    int getX() { return x; } //pozycja x
    int getY() { return y; } //pozycja y
    void addX( int xx )
    {
        x += xx;
    }
    void linia( int xx )
    {
        x = xx;
    }
};
Player::Player( int xx, int yy )
    : x( xx )
    , y( yy )
{
   
}
class Pocisk
{
public:
    int x, y;
   
    Pocisk( int x, int y );
    Pocisk( void );
    int getX() { return x; } //pozycja x
    int getY() { return y; } //pozycja y
    void addX( int xx )
    {
        x += xx;
    }
    void addY( int yy )
    {
        y += yy;
    }
    void strzal()
    {
        y++;
    }
};
Pocisk::Pocisk( int xx, int yy )
    : x( xx )
    , y( yy )
{
   
}
class Robak
{
public:
    int x, y;
   
    Robak( int x, int y );
    Robak( void );
    int getX() { return x; } //pozycja x
    int getY() { return y; } //pozycja y
    void addX( int xx )
    {
        x += xx;
    }
    void addY( int yy )
    {
        y += yy;
    }
};
Robak::Robak( int xx, int yy )
    : x( xx )
    , y( yy )
{
   
}
vector < Robak > Robaki;
vector < Robak >::iterator itR;
vector < Pocisk > Pociski;
vector < Pocisk >::iterator itP;

int main()
{
    int ilosc_robakow = 64;
    int x = 0;
    int punkty = 0;
    for( int i = 0, j = 10, k = 0; i < ilosc_robakow; i++, k++ ) {
        if( i % 16 == 0 )
        {
            j += 30; k = 0;
        }
        Robaki.push_back( Robak( j, k * 35 ) );
    }
    bool done = false, strzal = true;
    Player player( 20, 550 );
    //Pocisk pocisk(600,550);
   
    ALLEGRO_DISPLAY * display;
    if( !al_init() )
    {
        al_show_native_message_box( NULL, NULL, NULL, "blad", NULL, NULL );
    }
    display = al_create_display( ScreenWidth, ScreenHeight );
    al_set_window_position( display, 150, 50 );
    if( !display )
    {
        al_show_native_message_box( NULL, NULL, NULL, "blad", NULL, NULL );
    }
   
    al_init_primitives_addon();
    al_install_keyboard();
    al_init_font_addon();
    al_init_ttf_addon();
    al_init_image_addon();
    al_install_audio();
    al_init_acodec_addon();
   
    ALLEGRO_BITMAP * player1 = al_load_bitmap( "sprite/playerImage1.png" );
    ALLEGRO_BITMAP * pociskbmp = al_load_bitmap( "sprite/pocisk.png" );
    ALLEGRO_BITMAP * robak1 = al_load_bitmap( "sprite/robak.png" );
    ALLEGRO_BITMAP * background = al_load_bitmap( "sprite/background.png" );
   
   
    al_convert_mask_to_alpha( robak1, al_map_rgb( 255, 255, 255 ) );
    al_convert_mask_to_alpha( player1, al_map_rgb( 255, 255, 255 ) );
    al_convert_mask_to_alpha( pociskbmp, al_map_rgb( 255, 255, 255 ) );
   
    ALLEGRO_SAMPLE * pociskSample = al_load_sample( "sprite/pocisk.wav" );
   
    ALLEGRO_FONT * font = al_load_font( "sprite/Orbitron.ttf", 36, NULL );
   
    ALLEGRO_TIMER * timer = al_create_timer( 1.0 / FPS / 2 );
   
    ALLEGRO_KEYBOARD_STATE keyState;
    ALLEGRO_EVENT_QUEUE * event_queue = al_create_event_queue();
   
    al_reserve_samples( 1 );
   
    al_register_event_source( event_queue, al_get_timer_event_source( timer ) );
    al_register_event_source( event_queue, al_get_display_event_source( display ) );
    al_register_event_source( event_queue, al_get_keyboard_event_source() );
    al_start_timer( timer );
    int t = 0;
    while( !done )
    {
        ALLEGRO_EVENT events;
        al_wait_for_event( event_queue, & events );
        al_get_keyboard_state( & keyState );
        if( events.type == ALLEGRO_EVENT_DISPLAY_CLOSE )
        {
            done = true;
        }
        else if( events.type == ALLEGRO_EVENT_TIMER )
        {
            if( events.timer.source == timer )
            {
               
               
                if( al_key_down( & keyState, ALLEGRO_KEY_RIGHT ) )
                {
                    player.addX( 4 );
                }
                if( al_key_down( & keyState, ALLEGRO_KEY_LEFT ) )
                {
                    player.addX( - 4 );
                }
                if( al_key_down( & keyState, ALLEGRO_KEY_Z ) ) //strzelanie
                {
                    if( strzal == true )
                    {
                        al_play_sample( pociskSample, 1.0, 0.0f, 1.0, ALLEGRO_PLAYMODE_ONCE, 0 );
                       
                        Pociski.push_back( Pocisk( player.getX(), 550 ) );
                        strzal = false;
                    }
                }
            }
           
        }
       
        if( player.getX() >= 555 ) player.linia( 555 );
       
        if( player.getX() <=- 10 ) player.linia( - 10 );
       
        al_draw_bitmap( background, 0, 0, NULL );
        al_draw_line( 575, 600, 575, 0, al_map_rgb( 100, 100, 100 ), 5 );
       
        for( itR = Robaki.begin(); itR != Robaki.end(); itR++ )
        {
           
            al_draw_bitmap( robak1, itR->x, itR->y, NULL );
        }
        al_draw_bitmap( player1, player.getX(), player.getY(), NULL );
       
        for( itP = Pociski.begin(); itP != Pociski.end(); itP++ )
        {
            al_draw_bitmap( pociskbmp, x + 7, itP->y, NULL );
            itP->y -= 1;
            cout << itP->y << endl;
            if( itP->y <= 0 )
            {
                Pociski.pop_back();
            }
           
        }
        //if(kolizja(itR->x,itR->y,itP->x,itP->y))cout<<"trafiles "<<endl;
        al_flip_display();
        al_clear_to_color( al_map_rgb( 0, 0, 0 ) );
       
    }
    al_destroy_bitmap( pociskbmp );
    al_destroy_bitmap( background );
    al_destroy_bitmap( player1 );
    al_destroy_bitmap( robak1 );
    al_destroy_font( font );
    al_destroy_sample( pociskSample );
    al_destroy_timer( timer );
    return 0;
}
P-80051
hincu
» 2013-04-06 15:04:08
przejedz debugerem, jak dla mnie blad lezy przy usuwaniu pociskow, dlaczego usuwasz ostatni obiekt, zamiast ten, ktory jest sprawdzany? to sie robi jakos tak obj.pop_back( iterator );

chodzi o to ze usuwasz ostatni obiekt sprawdzajac np 3 z 10 elementowego kontenera
gdy petla dochodzi do ostatniego to jest wyciek i appcrash bo nie ma tego elementu w kontenerze fail
P-80065
pekfos
» 2013-04-06 15:15:38
C/C++
obj.pop_back( iterator );
C/C++
obj.erase( iterator );
P-80071
hincu
» 2013-04-06 18:33:55
dzieki za poprawe, wlasnie jak przysiadlem do swojego projektu to przypomnial mi sie ten temat xD
P-80081
aaadam
Temat założony przez niniejszego użytkownika
» 2013-04-06 18:36:46
tylko że mi coś i tak nie działa

C/C++
for( itP = Pociski.begin(); itP != Pociski.end(); itP++ )
{
    al_draw_bitmap( pociskbmp,( Pociski.begin() )->getX(), itP->y, NULL );
    itP->y -= 5;
    cout << itP->y << endl;
    if(( itP->y <= 0 ) &&( Pociski.size() != 0 ) )
    {
       
        Pociski.erase( itP );
       
    }
}
P-80082
pekfos
» 2013-04-06 18:45:58
tylko że mi coś i tak nie działa
A konkretnie?
P-80087
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona