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

[Allegro] - Kolizje okręgów

Ostatnio zmodyfikowano 2008-04-11 15:48
Autor Wiadomość
maciek1316
Temat założony przez niniejszego użytkownika
[Allegro] - Kolizje okręgów
» 2008-04-10 20:56:59
Chciał bym zrobic tak tutaj okrąg(wogule jaka kolwiek figura czy obrazek) wchodząc na drugi powodował zakończenie programu i wyświetlenie wiadomości"xxx". Chciałem zrobić małą gre (moją pierwsza :D) alemi nei wychodzi... próbowalem z różnymi pętlami i nici. Mógł by ktoś coś takiego napisać?


Tu jest jedna z prób.Tylko ze jak okrąg wchodzi na okrąg to nic sie nie dzieje... dopiero jak wyjdzie poza ekran..

C/C++
#include <allegro.h>
#include <iostream>
#include <conio.h>
using namespace std;
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( 46, 54, 140 ) );
    int ludek_x = 50, ludek_y = 100;
    int ludek1_x = 150, ludek1_y = 150;
    circle( screen, ludek_x, ludek_y, 50, makecol( 43, 0, 255 ) );
    do
    {
        if( key[ KEY_A ] )
        {
            ludek1_x--;
        }
        if( key[ KEY_D ] )
        {
            ludek1_x++;
        }
        if( key[ KEY_W ] )
        {
            ludek1_y--;
        }
        if( key[ KEY_S ] )
        {
            ludek1_y++;
        }
        rest( 1 );
       
        circle( screen, ludek1_x, ludek1_y, 50, makecol( 255, 111, 64 ) );
    } while(( ludek_x = ludek1_x ) &&( ludek_y = ludek1_y ) );
   
    textout_ex( screen, font, "xxx", 20, 20, makecol( 255, 0, 255 ), - 1 );
    while( !key[ KEY_ESC ] );
   
    readkey();
    allegro_exit();
    return( 0 );
}
END_OF_MAIN();
P-473
dudek
» 2008-04-10 22:31:39
Nie dziala, gdyz kolizje nie sa takie proste:) ciezka figure se wybrales jak na pierwsze proby:) podstawowy blad to warunki sprawdza sie za pomoca "==" a nie "=" (to jest przyisanie wartosci:))
O to bardzo niedokladna i przykladowa petla, podczas ktorej sprawdzana jest kolizja tych dwoch okregow:

C/C++
bool kolizja = false;
do
{
    if( key[ KEY_A ] )
    {
        ludek1_x--;
    }
    if( key[ KEY_D ] )
    {
        ludek1_x++;
    }
    if( key[ KEY_W ] )
    {
        ludek1_y--;
    }
    if( key[ KEY_S ] )
    {
        ludek1_y++;
    }
    rest( 1 );
   
    if(( ludek1_x - 50 <= ludek_x + 40 ) &&( ludek1_x + 50 >= ludek_x - 40 ) &&( ludek1_y - 50 <= ludek_y + 40 ) &&( ludek1_y + 50 >= ludek_y - 40 ) ) kolizja = true;
   
    circle( screen, ludek1_x, ludek1_y, 50, makecol( 255, 111, 64 ) );
} while( kolizja == false );


Kolizje najprosciej liczyc na prostokatach, tzn. trzeba wyobrazic sobie niewidzialny prostokat otaczajacy okrag i na jego wspolrzednych obliczac kolizje. Kolizje dwoch prostokatow nastepuja gdy jeden z wierzcholkow prostokata znajdzie sie wewnatrz drugiego (albo na jego boku) :)

To co Ci naskrobalem na kolanie to tylko prosty przyklad.
Generalnie z okregami jest ciezej bo prostokat bardzo zmniejsza dokladnosc takich kolizji gdyz przy jego wierzcholkach jest sporo miejsca, ktory nie nalezy do okregu a bedzie liczony jako "jego czesc" przy takiej metodzie sprawdzania.

Z kolizjami w grach zawsze trzeba pokombinowac i zawsze wszystko mozna zrobic lepiej:P
P-475
DejaVu
Kolizje okręgów
» 2008-04-10 22:48:38
Kolizje dwóch okręgów są banalne :) Liczysz odległość między środkami dwóch okręgów i porównujesz z sumą promieni obu tych okręgów. Jeśli odległość punktów jest mniejsza niż suma promieni tych okręgów, to okręgi kolidują ze sobą.
P-476
dudek
» 2008-04-10 23:25:16
No to prawda ale jednak mysle, ze lepiej zaczac od prostokatow. Moze dlatego, ze sam napoczatku tylko prostokatami sie bawilem? W kazdym razie masz racje:)

// No to niech w kodzie, ktory wyslalem mu wczesniej zamieni linijke sprawdzajaca kolizje na prostokatach na:
C/C++
if(( sqrt( pow( ludek1_x - ludek_x, 2 ) + pow( ludek1_y - ludek_y, 2 ) ) ) < 100 ) kolizja = true;

P-477
DejaVu
Pierwiastek a moc obliczeniowa
» 2008-04-11 12:57:03
Unikaj używania pierwiastka bez potrzeby. Operacja pierwiastkowania zużywa znacznie więcej mocy obliczeniowej procesora niż mnożenie. Lepiej więc podnieść prawą stronę równania do potęgi drugiej, niż wyciągać pierwiastek z lewej strony równania.
P-478
maciek1316
Temat założony przez niniejszego użytkownika
» 2008-04-11 15:48:58
Dzięki Wielkie
P-481
« 1 »
  Strona 1 z 1