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

Zderzenie 2 kulek w jednej płaszczyźnie (oś współrzędnych x)

Ostatnio zmodyfikowano 2011-06-05 22:44
Autor Wiadomość
lucky44
Temat założony przez niniejszego użytkownika
Zderzenie 2 kulek w jednej płaszczyźnie (oś współrzędnych x)
» 2011-06-05 20:46:16
Witam mam pytanie, mam 2 kulki startują z określonego punktu x i wysokości y. Jedna zmierza z lewej strony do prawej, a druga z prawej do lewej. Aż w końcu się spotykają. Odbijają się od ścianek okienka programu (prawa i lewa strona) i teraz moje pytanie jak zrobić żeby zamiast nakładać się i swobodnie przelatywać przez siebie, one się odbiły. Pomyślałem o jednym zrobiłem warunek if -

if(x==a+40)
{
--x;
++a
}
x- współrzędna osi x kuli 1
a- współrzędna osi x kuli 2

dałem x==a+40 dlatego że kolizja występuje w momencie tylko zetknięcia się ze sobą, a nie nałożenia 40 to promień mojej kuli.
Podany kod, warunek jednak robi się tak że kule stają zetknięte ze sobą a nie jak powinno wynikać z kodu że kule mają efekt odbicia. Proszę o pomoc, dziękuje z góry za odpowiedź i pozdrawiam forumowiczów.

Dodam, że korzystam z biblioteki Allegro.  
P-33889
npHard
» 2011-06-05 21:33:48
Robiąc --x i a++ zmieniasz tylko pozycję kulek, nie zmieniasz kierunku w którym się poruszają. Nie znam całego kodu ale pewnie masz jakieś zmienne, które decydują o kierunku poruszania się kulek. W tym ifie musisz zmodyfikować te zmienne.
P-33891
lucky44
Temat założony przez niniejszego użytkownika
» 2011-06-05 21:48:35

#include <allegro.h>
#include <cstdlib>
int x=590;
int y=250;

int tempX=450;
int tempY=100;

int dir=1;

void movecircle()

{ tempX = x;
  tempY = y;
 
  if(dir == 1 && x !=20 && y !=20)
  {
         --x;
       
         }
         else if(dir == 2 && x!=620 && y!= 20 )
        { ++x;
        
         }
       
 else
 { dir = rand() % 4 + 1;
}

acquire_screen();
circlefill(screen,tempX,tempY,20,makecol(0,0,0));
circlefill(screen,x,y,20,makecol(128,225,0));
release_screen();

rest(10);
}
// 2 kulka

int a=40;
int b=250;

int tempa=200;
int tempb=100;

int dirb=1;

void moveCircle()

{ tempa = a;
  tempb = b;
 
  if(dirb == 1 && a !=620 && b !=20)
  {
         ++a;
        
         }
       
         else if(dirb == 2 && a!=20 && b!=20 )
        { --a;
        
         }
          else

 { dirb = rand() % 4 + 1;
}

acquire_screen();
circlefill(screen,tempa,tempb,20,makecol(0,0,0));
circlefill(screen,a,b,20,makecol(0,0,255));
release_screen();

rest(10);

if(x==a+40)
{++x;
--a;
}
}

int main() {
    allegro_init();
    install_keyboard();
    set_color_depth(16);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED,640,480,0,0);
   
      while( !key[KEY_ESC])
      { movecircle();
        moveCircle();
       
      }
      return 0;
      }
      END_OF_MAIN()
Zamieszczam cały kod, przepraszam że nie zrobiłem tego od razu. Dziękuje za odpowiedź będę cały czas kombinował. Jeżeli ktoś ma pomysł żeby zmodyfikować to proszę mi napisać, ale nie wiem bo narazie jak zaczarowane stoją w miejscu. :(
P-33892
szyx_yankez
» 2011-06-05 22:20:58
Zainteresuj się jakąś biblioteką do obsługi fizyki np. Box2D.
P-33894
lucky44
Temat założony przez niniejszego użytkownika
» 2011-06-05 22:24:06
A czy można zrobić to bez użycia takiej biblioteki? Czy jest konieczne?
P-33896
szyx_yankez
» 2011-06-05 22:44:05
Oczywiście, wykorzystując wiedzę z fizyki z klasy 1 gimnazjum.
Lub na "chama" np. tak:
C/C++
int x1 = 0; //okrąg 1 pozycja x
int x2 = 800; //okrąg 2 pozycja x
int d = 15; //srednica okregu
int center =( x1 + x2 ) / 2;
bool Dir = true;

//while
if( Dir )
{
    x1++;
    x2--;
    if( x1 == center - d )
         Dir = false;
   
} else //(!dir)
{
    x1--;
    x2++;
    if( x1 == 0 )
         Dir = true;
   
}
P-33898
« 1 »
  Strona 1 z 1