Berawal dari sebuah permasalahan yang sudah terbilang cukup kuno sekali.
Sebuah peluru ditembakkan dari sebuah meriam pada posisi (ax, ay). Berapakah sudut
dan kekuatan yang diperlukan agar peluru sampai ke sasaran yang berada pada posisi (bx,
by)? Posisi target bisa lebih tinggi atau lebih rendah.
Di SMA dikenal dengan permasalahan lintasan peluru atau Gerak Berubah Beraturan.
Masalah yang sebenarnya cukup lama sekali dan seharusnya tidak perlu dibahas.
Walaupun ternyata saya baru saja menemukan jawabannya kemarin
Karena permasalahannya terlalu ringan, maka saya rasa perlu
dipersulit lagi agar lebih berbobot.
Untuk menaikkan bobot permasalahan, maka pertanyaan saya rubah.
1. Ada berapa kemungkinan sudut dan kekuatan yang diperlukan agar tembakan bisa
mengenai target?
2. Berapa waktu yang dibutuhkan sebelum mengenai target?
3. Bagaimana dengan target yang bergerak?
Untuk lebih membobotkan lagi, saya rubah dari peluru ke panah. Kenapa panah?
Karena panah butuh animasi arah pergerakan yang lebih rumit.
Baiklah, saya rasa permasalahannya sudah cukup kompleks, jadi layak dibahas
Jawaban singkat:
1. Kemungkinan sudut dan kekuatan adalah tak terbatas
2. Waktu bisa ditentukan sekehendak kita, kita bisa mengatur waktu kapan target akan
terkena tembakan.
3. Target yang bergerak bisa ditembak, dan kita bisa menentukan dimana target itu akan
terkena dan kapan target itu akan terkena peluru. Dengan syarat
target bergerak dengan pola yang bisa dihitung (GLB, GLBB,
bezier, walk point, A * atau gerak lain yang terkendali)
Kenapa bisa begitu? Inilah topik yang akan saya bahas. Prolognya panjang yah.
Pendekatan yang saya ambil cukup aneh dan diluar rumus fisika SMA (terakhir kali
ketemu fisika ya SMA itu). Karena memang hanya ditujukan untuk game.
Untuk menjelaskannya saya akan langsung beri contoh ke kasus.
Soal untuk posisi meriam dan target sejajar.
Seorang penembak pada posisi (10,400) menembak target pada posisi (450,400).
Posisi target berada pada posisi yang sama tingginya dengan target.
Pemanah/Penembak ingin mengenai target setelah panah bergerak 15 loop.
berapa sudut dan tenaga yang diperlukan, bila gravitasinya adalah 8 pixel/loop
Jawab:
Disini saya pakai loop. Karena game memakai loop dan bukannya detik. Nama lain loop
adalah frame. Untuk game yang bergerak 30 frame per second maka dalam satu detik ada
30 loop. Jadi 15 loop sama dengan 1/2 detik, jadi gitu yah. Dipikir sendirilah konversinya.
Untuk mencari sudut sebenarnya sudut tidak perlu dicari, kenapa begitu? Karena dalam
game kita sebenarnya tidak memakai sudut melainkan proyeksi dari sudut tersebut. Kalau
mau cari sudut ya tinggal membalik rumusnya saja.
Rumusnya untuk lintasan peluru adalah seperti ini:
Ini adalah rumus saya sendiri dan gak ada hubungannya dengan
teori fisika di SMA.
vx = (bx - ax)/(loop)
vy = grav * (loop - 1)/2
vx adalah kecepatan x
vy adalah kecepatan y
bx,by adalah lokasi target
loop adalah waktu kapan kita ingin target terkena peluru
untuk cari power dan sudut tinggal dicari saja pakai rumus biasa.
walaupun hasilnya mungkin hanya sebagai tampilan saja.
sudut = atan(vy/vx)
power = sqr(vy^2+vx^2)
Bagaimana nilai ini diterapkan dalam game. Sederhana sekali sebenarnya.
contoh pseude codenya sbb:
Code:
While True
;update
x = x + vx
y = y - vy
vy = vy - grav
;render
Color 0,0,255
Oval ax,ay,10,10,1
Oval bx,by,10,10,1
Color 255,255,255
Oval x,y,10,10,1
If y>480 Then Exit
If KeyHit(1) Then Exit
Wend
WaitKey()
End
Pada kode diatas kita menambahkan x dengan vx, y dengan vy dan untuk mengesankan
gravitasi vy dikurangi dengan grav.
Sangat simple seperti pada game pada umumnya.
Hasilnya seperti ini
Dari gambar diatas terlihat bahwa setelah 15 loop, peluru mengenai target.
Targetnya berwarna biru di sebelah kanan.
biru di sebelah kiri adalah posisi penembak/pemanah
Seandainya soalnya dirubah. Misalkan penembak ingin mengenai target setelah 20 loop
(2/3 detik untuk game 30 fps) maka rumusnya sama saja dengan diatas.

Dari gambar diatas, terlihat bahwa target terkena setelah 30 loop
Hasilnya sama saja bila dirubah. Misalnya penembak ingin mengenai target setelah 10
loop. (1/3 detik untuk game 30 fps)

target terkena tembakan setelah 10 loop.