potrzebna instrukcja podskakującej piłki

0

witam serdecznie wszystkich.
mam taki mały problem. potrzebuje instrukcję podskakującej piłki.
chodzi mi o to że ma podskakiwać z coraz mniejszą siłą. szukałem wszędzie i nie umiem nic takiego znaleźć.
z góry dzięki za pomoc :)

0

h*=2/3

0

Nie chcę się czepiać, ale

AdamPL napisał(a)

h*=2/3

jest tożsame z
h=0

Miałeś raczej na myśli
h*=2./3.

0

Co dają te kropki?

0

'2.' jest interpretowane tak samo jak '2.0' - jako liczba rzeczywista, stąd nie zachodzi dzielenie całkowitoliczbowe.

0

miałem nadzieje że sobie poradzę ale widzę że nie dam rady.
nie będę owijał w bawełnę. chodzi mi o takie coś. mam taką instrukcje dla piłki:

public void move(Rectangle2D bounds)
{
x += dx;
y += dy;
if (x < bounds.getMinX())
{
x = bounds.getMinX();
dx = -dx;
}
if (x + XSIZE >= bounds.getMaxX())
{
x = bounds.getMaxX() - XSIZE;
dx = -dx;
}
if (y < bounds.getMinY())
{
y = bounds.getMinY();
dy = -dy;
}
if (y + YSIZE >= bounds.getMaxY())
{
y = bounds.getMaxY() - YSIZE;
dy = -dy;
}
}

jest to instrukcja odbijającej się od krawędzi piłki. chce przerobić ten fragment żeby piłka nie odbijała się od krawędzi, tylko podskakiwała z coraz mniejszą siłą aż stanie na samym dole.
proszę o pomoc :(
pozdrawiam

0

Nie zrobisz rumu z rumaka.

0

@__krzysiek85
a co jelsi h jest double / float? Kod zadziala.
Bez sensu takie dywagacje odbiegajace og tematu, dlatego coraz rzadziej wiara tutaj zaglada.

0

macie jakieś pomysły jak rozgryźć tego orzeszka :)

0

macie jakieś pomysły jak rozgryźć tego orzeszka :)

0

Bardzo istotne jest czy metoda move jest wywoływana regularnie. w zmiennych dx i dy masz wektor kierunku poruszającej się piłeczki zmienia się on odpowiednio (jeżeli odpowiednio) przy krawędziach powodując "odbicie" piłeczki. Nie będę teraz wnikał, ale odbicia powinny zachowywać prawidłowe kąty - czyli piłeczka nie powinna wracać w stronę z której leciała za wyjątkiem kąta 90 st.

To co jest Ci potrzebne, to symulacja efektu grawitacji. A grawitacja to nic innego jak czynnik, który zmienia wektor kierunku stale w "dół". Na dodatek zmienia z przyspieszeniem o charakterystyce takiej jak przyspieszenie ziemskie (czyli ~9.81 m/s2). Jedyne co więc musisz robić to okresowo zmieniać dy tak je zmniejszać zgodnie z przyspieszeniem ziemskim. Istotna jest regularność move ponieważ wtedy można kod "grawitacyjny" umieścić bezpośrednio w niej. A jeżeli nie, to w innej metodzie zapewniającej regularność wywołań w stosunku do jednostki upływającego czasu.

Krótko mówiąc w składowej wektora dy zapisana jest bieżąca składowa prędkości pionowej. Wzór na przyspieszenie jest znany z fizyki: a = ΔV/Δt dający V1 = V0 + a * Δt, gdzie t - to jednostka czasu (t1 - t0), a - to przyspieszenia, V0, to poprzednia wartość prędkości, a V1 - to nowa prędkość uwzględniająca przyspieszenie.
W tym wypadku poprzednia dy - to V0, nowa dy - to V1, a - to Twoje ustawione na sztywno przyspieszenie, a Δt - to różnica czasu między poprzednim obliczeniem prędkości, a bieżącym. W wypadku liniowo regularnych wywołań move można uznać to za 1. Tak więc trzeba by na końcu lub początku move dopisać takie linijki:

dy = poprzednieDY + PRZYSPIESZENIE;
poprzednieDY = dy;

PRZYSPIESZENIE powinno być ujemne jeżeli piłka ma spadać w kierunku coraz mniejszych wartości y. Dobrać je sobie musisz albo eksperymentalnie, albo określając w sekundach odstęp czasu między wywołaniami move, a w metrach rozmiar ekranu. Wtedy można zastosować wartość przyspieszenia ziemskiego.

Dzięki takiemu wykonaniu będziesz miał zarówno odbicia od ścian jak i ciążenie piłki w dół.

Pamiętaj, że przyspieszenie nie zależy od wagi obiektu. Ale jest to prawda dla piłki próżni bez oporu powietrza. Jeżeli chciałbyś uwzględnić ciężar piłki, to musiałbyś również dołożyć opór aerodynamiczny. W próżni tak samo szybko spada zarówno piórko, kula armatnia oraz lotnia.

0

wielkie dzięki Olamagato :) po małych przeróbkach programik działa super :)
mam jeszcze jedną sprawę. po przeróbce kod wygląda tak:

public class Pilka
{
public void move(Rectangle2D bounds)
{
x = 100;
dy = (dy + a);
dy = dy;
y += dy;

  if (y + YSIZE >= bounds.getMaxY())
  {
     y = bounds.getMaxY() - YSIZE;
     dy = -dy;
  }

}

 public Ellipse2D getShape()

{
return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
}
private static final int XSIZE = 15;
private static final int YSIZE = 15;
private double a = 1;
private double x = 0;
private double y = 0;
private double dy = 1;
}

klasa pilka wywoływana jest poprzez kliknięcie przycisku start. jak zrobić żeby nowa piłeczka pojawiała się troszkę przesunięta w prawo? żeby nie nakładały się na siebie ?
pozdrawiam :)

0

dy = (dy + a);
dy = dy;

zamień na jedną: dy += a;

jak zrobić żeby nowa piłeczka pojawiała się troszkę przesunięta w prawo? żeby nie nakładały się na siebie?

  1. Przesunąć x o średnicę piłeczki
  2. Musiałbyś dodać obsługę kolizji piłeczek między sobą. Czyli, żeby musiały się od siebie odbijać i nie mogły nachodzić. To trochę bardziej skomplikowane od odbicia od ścian. Wymaga nieco geometrii.
    Jeżeli musiałbyś mieć więcej niż jedna piłeczka, to takie kolizje są konieczne. Rozwiązanie to nic innego jak potraktowanie innej piłeczki jak ściany. A konkretnie stycznej między piłeczkami. Wtedy obie piłki odbijają się od siebie. Ale rozwiązanie zrobisz sam o ile samodzielnie zrozumiesz odbijanie się pojedynczej piłeczki od ściany, a potem będziesz wykombinujesz jak odbijać piłeczkę od ściany pochyłej. Dopiero wtedy możesz pokusić się o obliczenie wzoru na styczną między piłeczkami i poprawne wyliczenie wektora odbicia. Tutaj wchodzi już trochę zabawy z podręcznikiem do geometrii. Albo koniec gimnazjum, albo początek szkoły średniej. Jeżeli nie osiągnąłeś tego wieku, to musiałbyś wyprzedzić wiedzę podawaną w szkole. Jeżeli dawno osiągnąłeś, to zrobisz to samodzielnie.
0
eciepecie napisał(a)

@__krzysiek85
a co jelsi h jest double / float? Kod zadziala.
Bez sensu takie dywagacje odbiegajace og tematu, dlatego coraz rzadziej wiara tutaj zaglada.

Właśnie, że nie.
Najpierw wykona się prawa strona (2/3) co da 0 nawet jeżeli h będzie doublem.
Nie wierzysz? Sprawdź.
A za dywagacje przeprasza. Po prostu nie mogłem się powstrzymać widząc taki błąd.

0

W jaki sposob wywolywac f-cje move zeby pilka przesuwala sie w sposob plynny?
Jakie sa na to metody?
Prosze o przyklad

1 użytkowników online, w tym zalogowanych: 0, gości: 1