ďťż

Ładny brzuch

Witam.
Stworzyłem prostą animację w Dev-C++. Polega ona przesuwaniu koła po lewej stronie ekranu. Chodzi mi o to żeby po "styknięciu" z dołem okrąg wracał do góry. (Dodatkowo żeby to wykonywało się ciągle)

#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main(int argc, char *argv[]) {    initwindow(800,600);    setfillstyle(SOLID_FILL, 0);    bar (0,0,getmaxx(),getmaxy()); for(int i=0;i<=550;i++) {              setcolor(2);        circle(25,25+i,25);        delay(10);        setcolor(0);        circle(25,25+i,25); } setcolor(2); circle(25,575,25);        while(!kbhit());    closegraph();        system("PAUSE");    return EXIT_SUCCESS; }

Z góry dzięki za pomoc... Inne uwagi też mile widziane...



Proszę, pomyśl. Jeśli nie potrafisz wymyśleć czegoś takiego to chyba niewarto byś się brał za programowanie. Chyba że nawet nie próbowałeś pomyśleć i od razu na forum napisałeś.
Sorry za niezbyt miłe słowa, ale przecież możesz chociażby wprowadzić sobie jakąś zmienną krok, która będzie równa 1 lub -1 i dodawać ją do wartości y środka koła (właściwie to rysujesz okrąg, a nie koło) w każdym obejściu pętli. Natomiast wartość tej zmiennej zmieniaj, gdy y będzię się równało r lub ymax - r, gdzie ymax to wysokość ekranu.
Użytkownik Chmurek edytował ten post 23 kwiecień 2006, 22:01

Proszę, pomyśl. Jeśli nie potrafisz wymyśleć czegoś takiego to chyba niewarto byś się brał za programowanie. Chyba że nawet nie próbowałeś pomyśleć i od razu na forum napisałeś.
Sorry za niezbyt miłe słowa, ale przecież możesz chociażby wprowadzić sobie jakąś zmienną krok, która będzie równa 1 lub -1 i dodawać ją do wartości y środka koła (właściwie to rysujesz okrąg, a nie koło) w każdym obejściu pętli. Natomiast wartość tej zmiennej zmieniaj, gdy y będzię się równało r lub ymax - r, gdzie ymax to wysokość ekranu.

Teraz się winny czuję. ;)
Więc może przedstawię przykładowy gotowy kod. Nie mam tej biblioteki u siebie, więc nie sprawdzę czy działa, ale przerobię Twój po prostu.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main(int argc, char *argv[]) {  int xmax = 800;  int ymax = 600;  initwindow(xmax, ymax);  setfillstyle(SOLID_FILL, 0);  bar(0, 0, xmax, ymax);    int r = 25;  int y = r;  int krok = 1;  while()  {    if (y == ymax-r)      krok = -1;    else if (y == r)      krok = 1;    setcolor(2);    circle(r,y,25);    delay(10);    setcolor(0);    circle(r,y,25);    y =+ krok;  }     while(!kbhit());   closegraph();     system("PAUSE");   return EXIT_SUCCESS; }
Uwaga: Jak widać nie ma w tym programie warunku wyjścia z pętli.
Użytkownik Chmurek edytował ten post 24 kwiecień 2006, 00:01


dea takiego ruchu polega na tym, że w pętli okrąg przesuwa się o jakąś wartość. W momencie zderzenia z rogiem ekranu (maksymalną wartością np. 600 na dole ekranu i 0 u góry) wartość przesunięcia zmienia znak. A więc: jeżeli piłka poruszała się o 1 piksel w dół, to po osiągnięciu pozycji y=600 (końca ekranu) wartość przesunięcia wynosi -1, czyli piłka cofa się i leci w kierunku drugiej krawędzi ekranu. Właśnie tą zmianę kierunku ruchu zilustrował kodem Chmurek:
if (y == ymax-r)     krok = -1;   else if (y == r)     krok = 1;

Innym, może fajniejszym, sposobem na ruch piłki jest opisanie współrzędnej y jej środka funkcją sinus. Na przykład w ten sposób:
y = (ymax - r) * sin(kat);
przy czym zmienna kat powinna się zmieniać na przykład od (1.5 * Pi) do (0.5 * Pi) w co najmniej (ymax - r) ruchach, jeśli zależy nam na płynności.
Dzięku temu kulka będzie poruszać się ze zmienną prędkością.

Phisikus i Chmurek dzięki za wyjaśnienia... Bardzo mi pomogły... :thumbsup: Mam nadzieję, że w przyszłości też będę mógł liczyć na pomoc ;)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •