Napisalem juz wszystko odnosnie mojej gry w ponga ale nie mam pomyslu jak zrobic ruch pileczki, przejrzalem troche projektow na github'ie ale tamte rozwiazania troche nie pasuja do mojego kodu, nie wiem jak zaczac, nie mam pomyslu, moglby mnie ktos naprowadzic troche ?
tu kod: https://bpaste.net/show/e041338798cd
Zrobilem juz tam strukture dla pozycji pileczki i ogolnych danych z gry pilka + gracz, tylko nie mam pomyslu na funkcje ktora bedzie ta pilka poruszac...
W najprostszym przypadku wykorzystaj ruch jednostajny prostoliniowy.
Nie rozumiem... No jednostajny prostoliniowy oczywiscie, ale jak to napisac nie mam pojecia, jaki algorytm do tego wymyslic, w tym jest problem.
Ot, wektor prędkości, któremu należy odpowiednio modyfikować zwrot i kierunek przy uderzeniu
Jaki wektor ? Ja chce zeby program byl napisany w C, jak to zrobic w tym jezyku ?
Wektor jako pojęcie fizyczne
No okej ale jak to stworzyc w c i od czego zaczac, no nie rozumiem, mozecie mi rzucac jakimis slowami typu "jednostajnie prostoliniowo" albo "wektor" ale nie mam pojecia jak to zaimplementowac, jak zaczac pisac chociaz jedna linijke w tym kierunku
google: podręcznik do fizyki, klasa 1 gimnazjum.
Ewentualnie zacznij od:
http://wms.mat.agh.edu.pl/~msekowsk/przestrzen_wektorowa.pdf
http://wms.mat.agh.edu.pl/~msekowsk/euklidesowa_przestrzen.pdf
http://wms.mat.agh.edu.pl/~msekowsk/euklidesowa_przestrzen_cd.pdf
masz 4 zmienne:
int x, y; <--- pozycja piłeczki
int v_x, v_y; <--- prędkość piłeczki (może być ujemna)
co iteracje zwiększasz x+=v_x i y+=v_y;
jeżeli piłeczka odbija się od czegoś musisz tylko zmienić zwrot prędkości np
v_x=-v_x;
v_y=v_y; <--- dlatego że tylko jedna składowa zostanie zmieniona;
musisz tylko rozważyć sytuacje kiedy piłeczka odbija się od konkretnej ścianki.
Nie wiem czy Ci to pomoże ale ruch piłeczki odbijającej się od ścianek w 2D masz poniżej (w Delphi) oraz w załączniku cały projekt. Na studiach miałem kiedyś coś podobnego jaki ćwiczenie i gdzieś mi się ten kod uchował.
procedure TForm1.Timer1Timer(Sender: TObject);
const x:integer=6;
y:integer=6;
krokx:integer=6;
kroky:integer=6;
begin
with PaintBox1.Canvas do
begin
//czyszczenie prostok╣ta
Brush.Color:=clWhite;
Rectangle(0,0,200,200);
//obliczenie wspˇ│rzŕdnych
x:=x+krokx;
y:=y+kroky;
//rysowanie ko│a w kwadracie o boku
// rˇwnym 6 pikseli
Brush.Color:=clBlue;
Ellipse(x-6, y-6, x+6, y+6);
if (x>Paintbox1.Width-6) then
begin
krokx:=6+Random(5);
krokx:=-krokx;
end;
if (y>Paintbox1.Height-6) then
begin
kroky:=6+Random(5);
kroky:=-kroky;
end;
if (x<=6) then krokx:=-krokx;
if (y<=6) then kroky:=-kroky;
end; //with
end;
Dobra dzieki wszystkim, szczegolnie za podpowiedz o tych predkosciach, teraz mam juz pewien zamysl, usiade nad tym troche i dam znac jak wyszlo, dzis wieczorem albo jutro.