Wątki i animacje

0

Cześć,

cały dzień męczę się z pewnym zagadnieniem, które przedstawię poniżej:

Mam arrayview N referencji do n obiektów. Każdy z nich jest obiektem tej samej klasy, jednak zainicjalizowanym innymi parametrami. Co więcej, każdy z nich posiada funkcję .animate() po której następuje prawidłowa jego animacja.

Problem polega na tym, że chciałbym odtworzyć sekwencję takich animacji, tj. jadąc foreachem po arrayview i robiąc current.animate(). Niestety to skutkuje tym, że odtwarzane są oczywiście wszystkie jednocześnie.

Najpierw próbowałem różnych rodzajów locków. Później postanowiłem stworzyć obok głównego procesu drugi proces. Główny miał kontrolować czy proces potomny się zakończył i uruchamiać nowy z nowymi parametrami. Niestety mimo że pomysł wydaje się być dobry, nie działa ani join(), ani wait()...

Pomocy!

0

Po co te wszystkie wątki? Jeżeli chcesz odtworzyć animację w sekwencji to te animację muszą mieć określony czas trwania. Jak się jedna skończy to odpalasz następną.

0

Ale problem całościowo:
Mam klasę game (implements runnable). Klasa game ma w sobie 5 obiektów klasy plane, przy czym każdy obiekt klasy plane posiada m. in. pole animation: przy konstrukcji każdy dostaje inną. W run() w game robię sobie arraylist wpisując do niej losowe obiekty z tych 5 obiektów (wiem, że to referencja, może tu problem?). Następnie chcę przejechać po każdym z nich i wyanimować ich animację. Tutaj następuje problem, bo odtwarzają się wszystkie naraz.

Próbowałem zapobiec temu stosując locki, dodatkowy wątek: nic. Siedzę nad tym już 12godzin.

Ponadto zauważyłem, że stworzenie nowego wątku i umieszczenie w nim instrukcji sleep powoduje, że całość programu się zatrzymuje...
Pomocy!

w game run()

			
			Thread t = new Thread(new Runnable() {

			public void run() {
				        Thread.sleep(5000);
					MakeToast();
					
				}
				
			});
			
			Thread tt = new Thread(new Runnable() {

				public void run() {
					MakeToast();
						
					}
					
				});
			
			t.run();
			tt.run();
 
0

Nie za bardzo rozumiem co chcesz zrobić. Możesz mieć listę animacji do wykonania i kiedy jedna się skończy to uruchamia następną.

Pseudokod

List animations;
ListIterator it;

Animation current = it->next();

while(true) {
current.animate();

if(current.isDone)
  current = it->next();
}

0
kbzium napisał(a)

Następnie chcę przejechać po każdym z nich i wyanimować ich animację. Tutaj następuje problem, bo odtwarzają się wszystkie naraz.

Pewnie to działa tak, że metoda animate aktualizuje animację, czyli na przykład inkrementuję aktualną klatkę animacji do wyświetlenia. Gdzie indziej jest on wyświetlana. Więc musisz wywołać raz animate dla jednego obiektu Plane, w jednej klatce twojej gry.

0

Rozumiem. A co z tymi wątkami? Tworzę 2 wątki i każdy ma inny sleep. Uruchamiam i okazuje się, że cały program śpi, zamiast tych wątków...

0

Skąd wiesz, że cały program śpi? ;)

0

Bo to, co powinno się pojawić na ekranie od razu i pojawia się, jeśli nie ma tego thread.sleep(x), pojawia się dopiero po takim właśnie opóźnieniu... może tu tkwi problem? Może nie mogę tworzyć wątków w run() (klasy implementującej Runnable)? Albo wątków w pętli?

0

Może zamiast t.run i tt.run, spróbuj t.start() i tt.start() ;)

0

Na samym poczatku tego probowalem. Chyba tutaj tkwi problem.

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