Symulacja jazdy Auta

0

Witajcie,

Chcę napisać aplikację w której poruszamy się samochodzikiem po ekranie [nic więcej]. Aktualnie mój projekt składa się z klas:

  • Klasa koło
  • klasa karoseria
  • klasa auto
  • klasa płótno

W klasie auto tworze 4 obiekty koło i jeden obiekt karoseria i tutaj zaczyna się 1 problem bo po ekranie muszę przemieszczać 5 obiektów.
Funkcja rysująca jest wywoływana cyklicznie, dysponuję obsługą klawiatury.

każdy element to obrazek o pewnych współrzędnych x,y oraz własnej szerokości i wysokości

aktualnie:

  • Strzałka w górę zmniejszam współrzędną y każdego obiektu o -1 co cykl;
  • Strzałka w dół zwiększam współrzędną y każdego obiektu o 1 co cykl;
  • strzałka lewo/prawo - wykorzystuję ,,AffineTransform" wyznaczam oś obrotu mniej więcej w środku koła i obracam je.

tzn mogę jechać do przodu/ do tyłu i skręcać kołami w prawo i lewo

	 public void Rysuj(Graphics g)
	 {
		 Graphics2D g2d = (Graphics2D) g;
	     g2d.drawImage(karoseria.getImage(), karoseria.x, karoseria.y, null); 
	     
	     if(RotateFlag == 1)
			{
				// transformacja wzgledem dolnych kol
			    AffineTransform at = AffineTransform.getTranslateInstance(LwheelD.x, 55/2+ RwheelD.y-182);
			    AffineTransform at2 = AffineTransform.getTranslateInstance(RwheelD.x , 55/2+ RwheelD.y-182);  
			    at.rotate(Math.toRadians(Rotate), 24/2, 55/2);
			    at2.rotate(Math.toRadians(Rotate), 24/2, 55/2);
			    
			     g2d.drawImage(LwheelU.getImage() , at, null);
			     g2d.drawImage(RwheelU.getImage() , at2, null);
			}
			else
			{
				g2d.drawImage(LwheelU.getImage(), LwheelU.x, LwheelU.y, null);
		        g2d.drawImage(RwheelU.getImage(), RwheelU.x, RwheelU.y, null);
			}
	       			
	        g2d.drawImage(LwheelD.getImage(), LwheelD.x, LwheelD.y, null);
	        g2d.drawImage(RwheelD.getImage(), RwheelD.x, RwheelD.y, null); 	     
	 }
0

A jakie jest pytanie?
Dziwnie wyglądają przednie koła w skręcającym samochodzie, samochód nie ma z przodu osi?

0

Racja nie zadałem konkretnego pytania tak więc oto one:
Proszę o wszelkie wskazówki jak poradzić sobie z poruszaniem pojazdu (skręt auta podczas ruchu). Gdyż z tego co rozumiem żeby wykonać skręt auta musiałbym mieć aktualnie 5 równań dla każdego elementu (4 koła i karoseria) więc na pewno jest to błędne myślenie i powyższe elementy muszę zamknąć? połączyć ze sobą? by tworzyły fizyczną jedność i dopiero ten element przemieszczać.

#UP
Żadnej fizycznej osi tam nie ma. Na ekranie jest 5 obiektów (4 obiekty klasy kolo i 1 obiekt klasy karoseria). Klasy tylko przechowują współrzędne obrazka i zwracają Image. Są to po prostu 5 x Image narysowane na ekranie w zadanych pozycjach

0

Ja to bym ograniczył do dwóch klas

  • Klasa auto
  • Klasa płótno

Po prostu w klasie auto masz info o karoserii, o aktualnym kierunku auta i kierunku w jakim koła są skierowane.

0

To są szczegóły.. bo tak czy siak w klasie auto rysowałbym 5 obrazków (4 koła + karoseria) i to jest mój problem... bo jak mam to przemieszczać?

Jazda w przód/ tył jest prosta bo wymaga tylko zmiany wartości Y wszystkich elementów.

ale jak zrobić jazdę ze skręconymi kołami? Przecież w tej sytuacji wszystkie wartości x,y każdego elementu zmieniają się inaczej czyli musiałbym mieć jakieś 5 funkcji dla każdego elementu..

Czy ja nie powinienem jakoś (jak?) połączyć ich (koła do karoserii) i wówczas poruszać całym autem?

0

No musisz rysować tak czy siak 5 elementów ale jeżeli trzymasz je w jednej klasie to nie musisz za każdym razem zmieniać pozycji tych 5 elementów tylko samego auta (te które są w środku dostosują się do całego obiektu).

ja bym to zaprojektował w ten sposób

class Auto {
  Point pozycja;
  double obrotAuta;
  double obrotKol;
}

I teraz tak, na początku obrotAuta to 0, podobnie jak kol. Faktycznie dopóki kąt jest 0, to zmieniasz tylko wartości Y. Ale musisz przewidzieć ten kąt, musisz to obsłużyć dla wszystkich kątów od 0-360. Możesz poczytać o funkcjach trygonometrycznych, o liczeniu kątów, odległości między punktami, oraz np znajdowaniu innego punktu po takim kontem w takiej odległości. Mam gdzieś kod takiej prostej gry w której sterowało się statkiem właśnie na takiej zasadzie. Co prawda trochę pomgmatwany ale mogę Ci podesłać.

1

Podejrzewam że masz coś takiego

  g2d.drawImage(autoImg, auto.x, auto.y, null);
  g2d.drawImage(kolo1Img, kolo1.x, kolo1.y, null);
  g2d.drawImage(kolo2Img, kolo2.x, kolo2.y, null);
  g2d.drawImage(karoseriaImg, karoseria1.x, karoseria1.y, null);

Żeby to działało tak jak chcesz, musisz trzymać te rzeczy "w kupie". Tzn nie tak że każda część auta jest trzymana w osobnych zmiennych tylko razem (np w aucie - centralnym punkcie auta), więc można to zmienić np w ten sposób.

  g2d.drawImage(autoImg, auto.x, auto.y, null);
  g2d.drawImage(kolo1Img, auto.x - 10, auto.y + 5, null);
  g2d.drawImage(kolo2Img, auto.x + 10, auto.y + 5, null);
  g2d.drawImage(karoseriaImg, auto.x, auto.y + 20, null);

Oczywiście te wartości które podałem będą inne. czyli zamiast 10,5, 20 będziesz musiał odpowiednio podstawione info podstawić.

W załączniku gra o której mówiłem, co prawda nie auto tylko statek, będziesz musiał przerobić kod tak żeby się nie obracał kiedy stoisz (bodaj wymazać jednego ifa tam musisz). Przepatrz cały kod, może się czegoś nauczysz.

Zaznaczam jednak!!1! pisałem go baaardzo dawno temu i wiele rozwiązań jest tam do bani, gdzieś się zawieruszył widocznie w kopiach zapasowych więc mogę go wysłać.

Zwłaszcza funkcje "img()" są bardzo złe, nie kopiuj ich tylko napisz swoje. Jakby co to pisz.

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