-
1. Data: 2009-07-08 09:02:53
Temat: [Allegro] Kolizja myszki z obiektem
Od: krzysztof posłuszny <w...@w...pl>
W programie mam wczytany obrazek który porusza się losowo po ekranie i jako
kursor myszki wczytany drugi obrazek (celownik). Teraz chciałbym aby po
najechaniu celownikiem na poruszający się obiekt doszło do kolizji i
wyświetlenia napisu np. kolizja. Za cholerę nie mogę sobie dać z tym rady.
Siedzę już nad tym parę dni. Pomoże mi ktoś rozwiązać ten problem? W
załaczeniu przesyłam kod programu.
#include <allegro.h>
#include <cstdlib>
volatile long speed = 0;
void increment_speed()
{
speed++;
}
END_OF_FUNCTION(increment_speed);
LOCK_VARIABLE(speed);
LOCK_FUNCTION(increment_speed);
class Cpostac
{
public:
short int x,y;
short int s,w;
};
Cpostac cel1,kursor1;
bool kolizja(int x1,int y1,int s1,int w1,int x2,int y2,int s2,int w2)
{
if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; else
if( x2<=x1+s1 && x2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; else
if( x2+s2<=x1+s1 && x2+s2>x1 && y2>=y1 && y2<=y1+w1) return true; else
if( x2+s2<=x1+s1 && x2+s2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true;
else return false;
};
BITMAP *kursor;
void laduj_kursor()
{
kursor = load_bitmap("celownik.bmp",NULL);
if (!kursor)
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
allegro_message("Nie moge zaladowac grafiki ( kursor )");
allegro_exit();
}
};
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;
}
};
int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);
clear_to_color(screen, makecol(128,128,128));
install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,"");
install_timer();
install_int_ex(increment_speed, BPS_TO_TIMER(100));
set_volume(255,255);
//Tytuł okienka
set_window_title("GRA DANIELA");
laduj_kursor();
install_mouse();
show_mouse(screen);
set_mouse_sprite(kursor);
unscare_mouse();
SAMPLE *dzwiek = NULL;
BITMAP *daniel = NULL;
BITMAP *celownik=NULL;
BITMAP *bufor = NULL;
BITMAP *cel=NULL;
bufor = create_bitmap(800,600);
// Ładowanie postaci
cel1.x=rand()%500; cel1.y=rand()%500; cel1.s=64; cel1.w=67;
kursor1.x=0; kursor1.y=0; kursor1.s=40; kursor1.w=40;
daniel = load_bmp("daniel.bmp",default_palette);
if (!daniel)
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
allegro_message("nie mogę załadować obrazka Daniel !");
allegro_exit();
return 0;
}
blit( daniel, screen, 0,0, 0,0, daniel->w, daniel->h);
readkey();
dzwiek = load_sample("muzyka.wav");
if (!dzwiek)
{
set_gfx_mode(GFX_TEXT,0,0,0,0);
allegro_message("nie mogę załadować dzwieku !");
allegro_exit();
return 0;
}
play_sample(dzwiek, 255,127,1000,1);
cel = load_bmp("cel.bmp",default_palette);
blit( cel, screen, 0,0, 0,0, cel->w, cel->h);
while (!key[KEY_ESC])
{
//Zdobyte punkty
int licznik=0;
myszka();
while( speed > 0)
{
cel1.x=rand()%500;
cel1.y=rand()%500;
speed--;
}
clear_to_color(bufor, makecol(0,0,0));
masked_blit(cel, bufor, 0,0,cel1.x, cel1.y,cel1.s,cel1.w);
//masked_blit( kursor, bufor, 0,0, kursor1.x, kursor1.y, kursor1.s,
kursor1.w);
// Wyswietlanie napisu jeśli kolizja
if(kolizja( cel1.x,cel1.y,cel1.s, cel1.w, kursor1.x, kursor1.y, kursor1.s,
kursor1.w)==true)
{ textout_ex(bufor,font,"Kolizja !",20,20 ,makecol(255,200,255),-1); }
//Odmierzanie czasu w sekundach
int czas=clock()/1000;
textprintf_ex(bufor,font,20,40,makecol(200,200,200),
-1,"CZAS GRY =
%d",czas,0,0);
textprintf_ex(bufor,font,20,20,makecol(200,200,200),
-1,"ZDOBYTE PUNKTY =
%d",licznik,0,0);
blit( bufor,screen, 0,0,0,0, 800,600);
rest(600);
}
destroy_bitmap(daniel);
destroy_bitmap(bufor);
destroy_bitmap(kursor);
destroy_bitmap(cel);
stop_sample(dzwiek);
allegro_exit();
return 0;
}
END_OF_MAIN();
-
2. Data: 2009-07-08 09:28:17
Temat: Re: [Allegro] Kolizja myszki z obiektem
Od: Michoo <m...@v...pl>
krzysztof posłuszny pisze:
> W programie mam wczytany obrazek który porusza się losowo po ekranie i jako
> kursor myszki wczytany drugi obrazek (celownik). Teraz chciałbym aby po
> najechaniu celownikiem na poruszający się obiekt doszło do kolizji i
> wyświetlenia napisu np. kolizja. Za cholerę nie mogę sobie dać z tym rady.
> Siedzę już nad tym parę dni. Pomoże mi ktoś rozwiązać ten problem? W
> załaczeniu przesyłam kod programu.
Po pierwsze brakuje definicji czym jest kolizja - zetknięciem 2
obiektów, czy umieszczeniem jednego w całości wewnątrz drugiego.
Po drugie - weź sobie kartkę i narysuj na niej prostokąty a potem
podpisz współrzędne wierzchołków - będzie ci łatwiej ogarnąć który bok
musisz porównać z którym.
> if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; else
Przeczytaj co napisałeś w tych warunkach:
jeżeli x2 jest _mniejsze_ od x1+szerokość i _równocześnie_ x2 jest
_większe_ od x1.
--
Pozdrawiam
Michoo
-
3. Data: 2009-07-08 10:01:32
Temat: Re: [Allegro] Kolizja myszki z obiektem
Od: Borafu <b...@g...pl>
krzysztof posłuszny pisze:
> W programie mam wczytany obrazek który porusza się losowo po ekranie i jako
> kursor myszki wczytany drugi obrazek (celownik). Teraz chciałbym aby po
> najechaniu celownikiem na poruszający się obiekt doszło do kolizji i
> wyświetlenia napisu np. kolizja. Za cholerę nie mogę sobie dać z tym rady.
Nie wiem co dokładnie robisz, więc może moja uwaga będzie nietrafiona.
ale kilka razy w życiu wlazłem przez przypadek na stronę gdzie taki
celownik się komuś udał i szczerze mówiąc nie wiem co na tych stronach
jeszcze było.
Wycofałem się natychmiast i nigdy więcej nie wlazłem.
Znam jeszcze kilka osób, które reagują tak samo.
pozdr
--
Borafu
-
4. Data: 2009-07-08 10:14:58
Temat: Re: [Allegro] Kolizja myszki z obiektem
Od: krzysztof posłuszny <w...@w...pl>
Użytkownik "Borafu" napisał
> krzysztof posłuszny pisze:
>> W programie mam wczytany obrazek który porusza się losowo po ekranie i
>> jako
>> kursor myszki wczytany drugi obrazek (celownik). Teraz chciałbym aby po
>> najechaniu celownikiem na poruszający się obiekt doszło do kolizji i
>> wyświetlenia napisu np. kolizja. Za cholerę nie mogę sobie dać z tym
>> rady.
>
> Nie wiem co dokładnie robisz, więc może moja uwaga będzie nietrafiona. ale
> kilka razy w życiu wlazłem przez przypadek na stronę gdzie taki celownik
> się komuś udał i szczerze mówiąc nie wiem co na tych stronach jeszcze
> było.
> Wycofałem się natychmiast i nigdy więcej nie wlazłem.
> Znam jeszcze kilka osób, które reagują tak samo.
>
No i kto by przypuszczał. Taki młody chłopak. A fuj!!!
-
5. Data: 2009-07-08 11:26:32
Temat: Re: [Allegro] Kolizja myszki z obiektem
Od: Michal Kleczek <k...@g...com>
krzysztof posłuszny wrote:
[ciach]
>
http://oakroadsystems.com/genl/unice.htm#xpost
--
Michal
-
6. Data: 2009-07-11 17:54:29
Temat: Re: [Allegro] Kolizja myszki z obiektem
Od: Solaris <s...@b...inspired>
Dnia Wed, 8 Jul 2009 11:02:53 +0200, jakże pięknego
krzysztof posłuszny <w...@w...pl> wystukał co zawarte poniżej:
: Cpostac cel1,kursor1;
: bool kolizja(int x1,int y1,int s1,int w1,int x2,int y2,int s2,int w2)
: {
: if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; else
: if( x2<=x1+s1 && x2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; else
: if( x2+s2<=x1+s1 && x2+s2>x1 && y2>=y1 && y2<=y1+w1) return true; else
: if( x2+s2<=x1+s1 && x2+s2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true;
: else return false;
A nie prościej tak?
if ( mouse.x >= postac.x AND
mouse.y >= postac.y AND
mouse.x <= (postac.x + postac.width) AND
mouse.y <= (postac.y + postac.height)
) return true;
--
Contact: GG#44450, solargrim at gmail.com
19:16:28 -!- Platyna Erroneous Nickname
-
7. Data: 2009-07-12 07:45:27
Temat: Re: [Allegro] Kolizja myszki z obiektem
Od: Piotr Kulinski <p...@w...pl>
Sat, 11 Jul 2009 19:54:29 +0200, na pl.comp.programming, Solaris
napisał(a):
> Dnia Wed, 8 Jul 2009 11:02:53 +0200, jakże pięknego
> krzysztof posłuszny <w...@w...pl> wystukał co zawarte poniżej:
>
>: Cpostac cel1,kursor1;
>: bool kolizja(int x1,int y1,int s1,int w1,int x2,int y2,int s2,int w2)
>: {
>: if( x2<=x1+s1 && x2>x1 && y2>=y1 && y2<=y1+w1) return true; else
>: if( x2<=x1+s1 && x2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true; else
>: if( x2+s2<=x1+s1 && x2+s2>x1 && y2>=y1 && y2<=y1+w1) return true; else
>: if( x2+s2<=x1+s1 && x2+s2>x1 && y2+w2>=y1 && y2+w2<=y1+w1) return true;
>: else return false;
>
> A nie prościej tak?
>
> if ( mouse.x >= postac.x AND
> mouse.y >= postac.y AND
> mouse.x <= (postac.x + postac.width) AND
> mouse.y <= (postac.y + postac.height)
> ) return true;
Skąd zapożyczyłeś 'AND', z SQL-a?
;)
--
pozdrawiam, GG i SkyPe w X-nagłówku posta, e-mail: zmień wpw na wp
piotr
-
8. Data: 2009-07-12 17:14:59
Temat: Re: [Allegro] Kolizja myszki z obiektem
Od: Wojciech Muła <w...@p...null.onet.pl.invalid>
On Sun, 12 Jul 2009 09:45:27 +0200 Piotr Kulinski
<p...@w...pl> wrote:
> > A nie prościej tak?
> >
> > if ( mouse.x >= postac.x AND
> > mouse.y >= postac.y AND
> > mouse.x <= (postac.x + postac.width) AND
> > mouse.y <= (postac.y + postac.height)
> > ) return true;
>
> Skąd zapożyczyłeś 'AND', z SQL-a?
> ;)
Pewnie z C++, bowiem and, or, not (i jeszcze kilka innych)
to legalne operatory, zastępujące potworki pod tytułem
!, && i || (fuj, ohyda). Zawsze też można włączyć iso646.h.
w.
--
Kupię: http://wm.ite.pl/kupie.html