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

[ALLEGRO 5] Deklaracja i definicja ALLEGRO_EVENT i ALLEGRO_EVENT_QUEUE w klasie

Ostatnio zmodyfikowano 2012-08-30 08:31
Autor Wiadomość
MrNyna77
Temat założony przez niniejszego użytkownika
[ALLEGRO 5] Deklaracja i definicja ALLEGRO_EVENT i ALLEGRO_EVENT_QUEUE w klasie
» 2012-08-28 18:43:57
Witam. Mam taką klasę

nagłówek:
C/C++
#ifndef LUDZIK_H
#define LUDZIK_H
#include <allegro5/allegro.h>


class ludzik
{
public:
    ludzik();
    void chodzenie();
    void strzal( int x, int y );
private:
    bool bron;
    bool zyje;
    int x;
    int y;
    enum ruch { UP, DOWN, LEFT, RIGHT };
    bool ruch[ 4 ];
    ALLEGRO_EVENT_QUEUE * akcje;
    ALLEGRO_EVENT ak;
};

#endif // LUDZIK_H
konstruktor:
C/C++
ludzik::ludzik()
{
    zyje = true;
    bron = true;
    x = 320;
    y = 240;
    bool ruch[ 4 ] = { false, false, false, false };
    ALLEGRO_EVENT_QUEUE * akcje = NULL;
    akcje = al_create_event_queue();
    al_register_event_source( akcje, al_get_keyboard_event_source() );
    al_clear_to_color( al_map_rgb( 0, 0, 0 ) );
}
Później jak funkcją składową wywołuje al_wait_for_event(akcje, &ak) wyrzuca mi taki błąd "~/allegro-5.0.7/src/misc/vector.c:86: _al_vector_ref:ASSertion 'idx < vec->_size' failed."

Ma ktoś pomysł co robię źle?

Z góry dzięki. Pozdrawiam.

PS. Jak oznaczyć kod?
P-63905
SeaMonster131
» 2012-08-28 19:17:06
W klasie masz:
C/C++
ALLEGRO_EVENT_QUEUE * akcje;
A w konstruktorze jeszcze raz to samo:
C/C++
ALLEGRO_EVENT_QUEUE * akcje = NULL
Nie wiem tylko czy o to chodzi.

PS. Jak oznaczyć kod?
[cpp] kod [/cpp]
P-63907
MrNyna77
Temat założony przez niniejszego użytkownika
» 2012-08-28 20:06:38
Po usunięciu  tej linijki z konstruktora
ALLEGRO_EVENT_QUEUE * akcje = NULL;
Działa. Dzięki za pomoc

teraz nie wiem czemu funkcja nie "widzi" tej tablicy
C/C++
bool ruch[ 4 ] = { false, false, false, false };
treść funkcji:
C/C++
void ludzik::chodzenie()
{
    al_wait_for_event( akcje, & ak );
   
    if( ak.type == ALLEGRO_EVENT_KEY_DOWN )
    {
        switch( ak.keyboard.keycode )
        {
        case ALLEGRO_KEY_UP:
            ruch[ UP ] = true;
            break;
        case ALLEGRO_KEY_DOWN:
            ruch[ DOWN ] = true;
            break;
        case ALLEGRO_KEY_LEFT:
            ruch[ LEFT ] = true;
            break;
        case ALLEGRO_KEY_RIGHT:
            ruch[ RIGHT ] = true;
            break;
        }
    }
    else if( ak.type == ALLEGRO_EVENT_KEY_UP )
    {
        switch( ak.keyboard.keycode )
        {
        case ALLEGRO_KEY_UP:
            ruch[ UP ] = false;
            break;
        case ALLEGRO_KEY_DOWN:
            ruch[ DOWN ] = false;
            break;
        case ALLEGRO_KEY_LEFT:
            ruch[ LEFT ] = false;
            break;
        case ALLEGRO_KEY_RIGHT:
            ruch[ RIGHT ] = false;
            break;
        }
    }
    y -= ruch[ UP ] * 10;
    y += ruch[ DOWN ] * 10;
    x -= ruch[ LEFT ] * 10;
    x += ruch[ RIGHT ] * 10;
    al_clear_to_color( al_map_rgb( 0, 0, 0 ) );
    al_draw_filled_circle( x, y, 20, al_map_rgb( 200, 200, 40 ) );
    al_flip_display();
}

Jak umieszczę deklarację w funkcji to działa, ale wtedy funkcja nie spełnia swojej roli...
P-63910
SeaMonster131
» 2012-08-28 20:08:40
To masz w klasie:
C/C++
bool ruch[ 4 ];
A to masz w konstruktorze:
C/C++
bool ruch[ 4 ] = { false, false, false, false };
P-63911
MrNyna77
Temat założony przez niniejszego użytkownika
» 2012-08-28 20:15:32
Jak mam to zrobić żeby działało? Wyjście jakie ja widzę, to wysłanie w argumencie tej tablicy zdefiniowanej w main do funkcji. Może jest sposób, żeby zrobić to przy pomocy tylko klasy?

EDIT: Czemu jeżeli w konstruktorze określam x i y to funkcja wie jakie one mają wartości?
P-63913
Maxius
» 2012-08-29 15:21:20
Ostatnio robiłem coś podobnego. Powinieneś w metodzie umieścić blok
switch( ev.keyboard.keycode )
 a metoda powinna wyglądać tak:
ludzik::chodzenie( allegro_event ev )
. Wtedy w funkcji main umieszczasz
if( ev.type == allegro_event_key_down ) ludzik.chodzenie( ev );
P-63959
MrNyna77
Temat założony przez niniejszego użytkownika
» 2012-08-29 21:00:59
Co do tablicy ruch, to wystarczyło dla każdego elementu określić wartość... (że też wcześniej na to nie wpadłem...)

Do Maxius- twoja uwaga była przydatna, ale nie można było "przesuwać się" przez przytrzymanie przycisku, trzeba było cały czas naciskać, ale sobie z tym poradziłem. Dzięki!

Jeszcze nie wiem jak zrobić to, że jak trzymamy np. "lewo"i"góra", żeby przesuwać się po skosie, a jak się puści w lewo żeby przesuwać się tylko do góry... Jeżeli ktoś zna rozwiązanie będę wdzięczny ;)

Dzięki za pomoc. Pozdrawiam.
P-63989
Maxius
» 2012-08-30 08:31:24
W timerze powinieneś dodać taki warunek:
C/C++
if( key[ LEFT ] && key[ UP ] )
{
    ludzik.poruszaj_do_gory();
    ludzik.poruszaj_w_lewo();
}

Wydaję mi się, że lepiej by było gdybyś zrobił 4 metody odpowiedzialne za ruch w góre, w dół, w lewo i w prawo, a potem nimi odpowiednio manipulować.
A ten kod
if( ev.type == ALLEGRO_EVENT_KEY_DOWN )
 umieścił w funkcji void w main'ie.
P-64002
« 1 »
  Strona 1 z 1