Bagaimana cara kerja animasi di java? [tertutup]

Saya tidak begitu yakin bagaimana sebenarnya cara orang membuat animasi di java seperti menerjemahkan kotak di layar. Ketika saya mencoba mengubah posisi persegi panjang menggunakan perulangan for, semuanya dieksekusi secara instan dan saya berakhir dengan koordinat akhir persegi panjang. Jadi yang ingin saya ketahui adalah bagaimana orang mencapai animasi halus ini dari waktu ke waktu dan jika saya ingin membuat kelas animasi khusus untuk alasan apa pun, bagaimana cara menambahkan penundaan agar muncul sebagai animasi alih-alih perubahan posisi instan di Java?


person AnotherRandomUser    schedule 13.05.2016    source sumber
comment
Singkatnya: menjalankan sesuatu seperti rectangle.x = (System.currentTimeInMillis() - startTimeInMillis) * 0.5 + 10; setiap beberapa milidetik. Atau hanya menjalankan rectangle.x += 2; setiap beberapa milidetik.   -  person user253751    schedule 13.05.2016
comment
Hai terima kasih. bagaimana cara saya melakukan Rectangle.x setiap milidetik tanpa menyebabkan thread tertidur atau melanggar eksekusi acara lain?   -  person AnotherRandomUser    schedule 13.05.2016
comment
Anda perlu memahami konkurensi. Pada dasarnya, Anda memiliki thread/timer yang dicentang di latar belakang, yang mengirimkan pemberitahuan ke pengamat yang memperbarui statusnya berdasarkan kebutuhan mereka dan kemudian ditampilkan ke layar (dalam thread terpisah, sering dikenal sebagai Event Dispatching Thread). Metode yang pada akhirnya Anda gunakan untuk mencapai hal ini, akan bergantung pada kerangka kerja yang Anda gunakan   -  person MadProgrammer    schedule 13.05.2016
comment
Untuk contoh, contoh, contoh. Animasi adalah contoh yang kompleks (misalnya) dan dari pengalaman saya, Anda lebih baik menggunakan perpustakaan khusus untuk tugas-tugas ini   -  person MadProgrammer    schedule 13.05.2016
comment
Wow, saya rasa saya sudah mengerti sekarang. Jadi untuk membuat animasi seperti itu dan tetap mendengarkan pengguna, saya perlu memiliki thread yang berbeda bukan? Tapi bukankah hal seperti itu nyaman? Bagaimana jika saya memiliki beberapa animasi yang perlu saya jalankan tetapi sebuah thread tidak dapat menjalankan semuanya karena waktu animasinya berbeda? Apakah ini berarti saya harus menggunakan lebih banyak thread untuk beberapa animasi tersebut?   -  person AnotherRandomUser    schedule 13.05.2016
comment
@AnotherRandomUser Bagaimana jika saya memiliki beberapa animasi yang perlu saya jalankan tetapi sebuah thread tidak dapat menjalankan semuanya karena waktu animasinya berbeda? - Ini adalah saat Anda akan menggunakan satu thread yang menghasilkan tick dengan kecepatan konstan, semua animasi Anda akan mengamati hal ini dan membuat perubahan yang sesuai berdasarkan kebutuhannya. Beginilah cara kerja TimingFramework   -  person MadProgrammer    schedule 13.05.2016
comment
@AnotherRandomUser Saya perlu memiliki thread yang berbeda, bukan? Tapi bukankah hal seperti itu nyaman? - Anda akan menemukan bahwa hampir semua kerangka GUI bekerja berdasarkan prinsip sederhana ini, satu thread untuk mengelola semua peristiwa yang terjadi di UI, ini sebenarnya adalah bidang penelitian akademis (untuk membuat kerangka thread aman yang benar-benar dapat digunakan). Ada sejumlah kerangka kerja dan pendekatan yang dapat membantu, bergantung pada kerangka mana yang Anda gunakan   -  person MadProgrammer    schedule 13.05.2016
comment
Lihatlah JavaFX dan transisi.   -  person ManoDestra    schedule 13.05.2016


Jawaban (2)


Anda cukup menyimpan posisi x dan y persegi panjang. Kemudian jalankan perulangan while di mana Anda memeriksa apakah jangka waktu tertentu telah berlalu. Jika sudah, tambahkan variabel posisi.

Kode (akan memerlukan sedikit penyesuaian untuk memenuhi kebutuhan Anda):

int tick = 500; //set this to whatever you want
long lastTime = System.currentTimeInMillis();
while(true) {
 long currTime = System.currentTimeInMillis();
 if (currTime > lastTime + tick) {
  lastTime = currTime;
  x = x + 1; //replace this with your object's position
 }
}
person nhouser9    schedule 13.05.2016
comment
Hai, itu berhasil, terima kasih tapi saya punya pertanyaan singkat. Hal ini dijalankan di thread terpisah, benar? Bagaimana jika saya ingin membuat 10 animasi berbeda, apakah saya memerlukan 10 thread agar dapat berfungsi dan bagaimana saya melakukannya ketika komputer saya hanya memiliki 8? Saya hanya ingin menguji. - person AnotherRandomUser; 13.05.2016
comment
Pertama, Anda masih bisa membuat 10 thread pada mesin dengan 8 core. Komputer akan mengabstraksinya dan menjalankan thread pada inti yang sama secara paralel. Kedua, Anda tidak HARUS menjalankan ini di thread terpisah, tapi itu ide yang bagus. - person nhouser9; 13.05.2016
comment
Berhati-hatilah karena bergantung pada kerangka kerjanya, Anda dapat mengambil risiko kondisi balapan antara ticker dan perender (atau jika Anda menjalankan thread peristiwa, cegah interaksi lebih lanjut dengan UI) - person MadProgrammer; 13.05.2016
comment
@AnotherRandomUser Gunakan satu utas yang menghasilkan tanda centang pada keadaan konstan, izinkan semua animasi lain mengamati ini dan membuat perubahan yang sesuai, TimingFramework bekerja dengan cara ini. - person MadProgrammer; 13.05.2016

Anda dapat menambahkan penundaan dengan menggunakan metode Thread.sleep(long millis) yang akan menghentikan eksekusi thread saat ini dengan jumlah milidetik yang ditentukan. Namun mungkin ada cara yang lebih baik.

person Pyrrhic    schedule 13.05.2016
comment
Hai, terima kasih atas jawabannya tetapi saya tidak begitu yakin thread.sleep adalah pilihan terbaik karena katakanlah Anda sedang membuat menu, bukan? Bagaimana jika Anda memberi tahu thread untuk tidur untuk beberapa animasi, tetapi bagaimana responsnya terhadap klik pengguna jika tidur? - person AnotherRandomUser; 13.05.2016
comment
Saya tidak percaya itu bisa mendaftarkan klik pengguna saat sedang tidur. - person Pyrrhic; 13.05.2016
comment
Ya, kurasa begitu. Saya telah mencoba mencari di Google tentang bagaimana hal ini akan dilakukan tetapi sejauh ini saya belum menemukan apa pun dan saya telah mencari selama lebih dari satu jam sebelum datang ke sini dan mengajukan pertanyaan. - person AnotherRandomUser; 13.05.2016
comment
@DogeOverlord Itu akan menimbulkan banyak asumsi, jika Anda memanggil Thread.sleep di thread utama atau acara kerangka kerja, maka ya, itu akan menyebabkan UI berhenti merespons - person MadProgrammer; 13.05.2016