Jak zrobić animację klatka po klatce?

Odpowiedz Nowy wątek
2019-01-01 21:28
0

Mam napisać program, który wyświetla animację. Z okienkiem itp nie mam problemu ale z samą animacja już tak. Otóż animacja to okręgi wyświetlane klatka po klatce. I to wszystko mam w pliku .txt. I w każdej linijce pierwsza liczba to nr klatki a reszta współrzędna x i y tej kuli (chyba max to 1200 tych kulek). Będę wdzięczny za pomoc jak to ogarnąć i w razie czego za udzielenie odpowiedzi na dodatkowe pytania.

edytowany 2x, ostatnio: furious programming, 2019-01-01 23:37

Pozostało 580 znaków

2019-01-01 22:27
Tig
1

Weź dowolny program w Swingu, który coś wyświetla jako animację, następnie podmień etap renderowania grafiki, tak aby wyświetlał co potrzebujesz.

Model powinien wczytać (zapewne przed rozpoczęciem) plik, ułożyć sobie informacje w nim zawarte w taki sposób aby dało się szybko wyrenderować kolejne klatki.

Poniżej podaję pisane na kolanie przykłady, w założeniu ma to ilustrować temat, a nie pokazywać ładne praktyki programistyczne :)

        canvas = new Canvas() {
            private static final long serialVersionUID = 1L;

            @Override
            public void paint(Graphics g) {
                super.paint(g);
//tutaj sobie rysuj co wynika z modelu danych na daną klatkę, poniżej jakiś abstrakcyjny przykład
                g.drawRect(0, 0, CANVAS_SIZE - 1, CANVAS_SIZE - 1);
                for (int i = 0; i < 30; i++) {
                    int x = rng.nextInt(CANVAS_SIZE - 2);
                    int y = rng.nextInt(CANVAS_SIZE - 2);
                    g.fillOval(x, y, 8, 8);
                }
            }
        };

A tak wygląda użycie:

        while (true) {
            try {
                Thread.sleep(995);
                modelAnimacji.tick(); //przygotowanie kolejnej klatki do wyświetlenia
                canvas.repaint();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

Pozostało 580 znaków

2019-01-01 22:50
0

Super, a jeśli chodzi o wczytywanie 1 inta w danej linijce i później po kolei współrzędnych to jak to zrobić? Pewnie Scanner tylko jakie metody?

Pozostało 580 znaków

2019-01-01 23:05
Tig
0

Może być, podaję szkic algorytmu: dopóki jest następna linijka, pobierz ją. Wynik rozbij (split) po spacjach, przekonwertuj odpowiednie elementy tej tablicy na int/Integer za pomocą Integer.valueOf.

edytowany 1x, ostatnio: furious programming, 2019-01-01 23:37

Pozostało 580 znaków

2019-01-01 23:40
0

Mam taką ramkę https://4programmers.net/Forum/Download/21630
i jak ustawić wysokość g,drawRect() zajmował całą tą przestrzeń a nie więcej?

Pozostało 580 znaków

2019-01-01 23:45
Tig
0
Mattii4211 napisał(a):

Mam taką ramkę https://4programmers.net/Forum/Download/21630
i jak ustawić wysokość g,drawRect() zajmował całą tą przestrzeń a nie więcej?

W zapodanym przykładzie ja robię:

private static final int CANVAS_SIZE = 500;
//.........
canvas.setSize(CANVAS_SIZE, CANVAS_SIZE);
//a to jest taki roboczy pomysł na zrobienie obramowania, tj: rysuję prostokąt od 0,0 do punktu 1 piksel od końca canvas
g.drawRect(0, 0, CANVAS_SIZE - 1, CANVAS_SIZE - 1);

Pozostało 580 znaków

2019-01-01 23:48
0

Tylko problem jest taki, że moja ramka (BorderLayout) może zmienić rozmiar a Canvas() musi cały czas być maksymalne
I jeszcze jedno pytanie BufferedReader in czy (int) in.lines().count() odczyta mi ilość linijek w pliku?

Zrobiłem g.drawrect(0,0, this.getsize().width, this.getSize().height)

edytowany 4x, ostatnio: Mattii4211, 2019-01-02 12:40

Pozostało 580 znaków

2019-01-02 17:25
0

Dobra analizuję ten twój przykład i jakoś nie wiem jak się za to zabrać. Dane w pliku od 2 linijki są tak poukładane: nr klatki, pozycja x pozycja y pozycja x .... Pozycje są double/float. I nie wiem za bardzo jak rozpracować to rysowanie tych kulek (drawOval).

Pozostało 580 znaków

2019-01-02 18:03
Tig
0
Mattii4211 napisał(a):

Dobra analizuję ten twój przykład i jakoś nie wiem jak się za to zabrać. Dane w pliku od 2 linijki są tak poukładane: nr klatki, pozycja x pozycja y pozycja x .... Pozycje są double/float. I nie wiem za bardzo jak rozpracować to rysowanie tych kulek (drawOval).

Pierwszy z wyników Googla daje przyzwoity przykład: https://www.google.com/search?q=java+parse+file+of+doubles
Czyli powinieneś zrobić pętle po linijkach pliku, następnie zeskanować jeden int, i dowolną liczbę (par) doubli.

Odnośnie rysowania, nie ma pytania na które można by odpowiedzieć, natomiast zarzucę linkiem: https://docs.oracle.com/javas[...]tml#drawOval-int-int-int-int-

Pozostało 580 znaków

2019-01-05 01:12
0

Dobra, ze wczytywaniem sobie poradziłem ale nie wiem jak narysować na raz 1200 tych piłek na 1 klatce. Robię for(int i=0; i<1200; i++) i co dalej?
PS dane mam w ArrayList();
\Mam tak obecnie:

g.drawRect(0, 0, this.getSize().width, this.getSize().height);
                Graphics2D g2 = (Graphics2D) g;
                for (int i = 0; i < numberOfBalls; i++) {
                    double x = positions.get(frame).get(j);
                    double y = positions.get(frame).get(j+ 1);
                    if(j > 1) {
                        x1 = positions.get(frame).get(j-2)+10d;
                        y1 = positions.get(frame).get(j - 1)+10d;
                    }
                    j = j+2;
                    Ellipse2D circle = new Ellipse2D.Double(x1+x+10d, y1+y+10d, 10, 10);
                    g2.draw(circle);
                }

ale rysuje mi te kulki tylko tak jakby w jednym kwadracie

edytowany 2x, ostatnio: Mattii4211, 2019-01-05 14:53

Pozostało 580 znaków

2019-01-05 14:55
Tig
0
Mattii4211 napisał(a):

Dobra, ze wczytywaniem sobie poradziłem ale nie wiem jak narysować na raz 1200 tych piłek na 1 klatce. Robię for(int i=0; i<1200; i++) i co dalej?
PS dane mam w ArrayList();

Dla każdego takiego i pobierasz z tej listy x, oraz y i wypełniasz "owal" na tej grafice. Przykład rysowania koła o promieniu 8 już podawałem powyżej, dokumentację do metody rysowania okręgu także.

PS Warunek kontynuacji pętli (i<1200) powinien więc zależeć od rozmiaru tej listy, a nie od wpisanej literału zgodnego z jakimś jednym inputem. Taki kod będzie odporniejszy na błędy oraz czytelniejszy.

Już wyżej wrzuciłem kod - Mattii4211 2019-01-05 14:57
OK, ja odpowiadałem na post w oryginalnym kształcie, widzę że to zostało już uwzględnione, to dobrze :) Co do konkretnych wartości x i y, to ja nie mam szklanej kuli, może podejrzyj sobie debuggerem jak się te zmienne obliczają? - Tig 2019-01-05 15:00
one są ustawione ok, tylko te kule nakładają się jedna na drugą, tak jakby ich promień nie był uwzgledniony i nie zajmują całego obszaru rysowania - Mattii4211 2019-01-05 15:02
Może masz w danych współrzędnie nie większe niż 100 pikseli, a obszar masz na 1000 pikseli. Podaj jakieś linijki ze swojego pliku, swój rozmiar canvas, wtedy możemy pogadać. - Tig 2019-01-05 15:07

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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