Reply
 
Thread Tools Display Modes   
 
Archer Ai
 
Old 17/12/2009, 17:58 Reply With Quote   #1
realtime
Veteran Member
 
realtime's Avatar
 
Join Date: Feb 2007
Location: deket bunderan kampus
Posts: 1,422
realtime is on a distinguished road
realtime is offline
Archer Ai

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.
__________________
Blogs-gak jelas

   
 
 
Old 17/12/2009, 18:03 Reply With Quote   #2
realtime
Veteran Member
 
realtime's Avatar
 
Join Date: Feb 2007
Location: deket bunderan kampus
Posts: 1,422
realtime is on a distinguished road
realtime is offline
Soal yang sama tapi dengan posisi target lebih tinggi.
Bagaimana jika target dipindah ke posisi lebih tinggi, misalnya by=200, dan penembak
ingin mengenai target setelah loop ke 15
Intinya sama saja, namun disini setiap loop kita tambah sedikit-sedikit hingga akhirnya sampai ke sasaran. Untuk itu kita butuh
variabel. Saya namai variabel ini dengan xel. (el=elevasi)

Dimana:

Code:
xel=(by - ay)/loop
Pada programnya tinggal menambahkan xel ke y
Code:
y = y - vy+xel
Kodenya hanya berganti pada saat perubahan sumbu y, kita tambahkan xel, agar peluru
bergerak sedikit ke atas/kebawah, hasilnya akan seperti ini.


Dari gambar diatas terlihat bahwa peluru mengenai target setelah 15 loop.
Target berada di posisi agak ke atas dan tidak berada dalam posisi
sejajar.

Perhitungan diatas hanya berlaku di game dan tidak berlaku di dunia nyata.

Target Bergerak?
Bagaimana dengan target yang bergerak. Syaratnya adalah target harus bergerak
beraturan dengan rumus atau pola tertentu.

Misalkan begini.
Sebuah pesawat bergerak dengan kecepatan 15 pixel/loop, dari posisi awal (640,200).
Untuk game dengan fps 30 sama dengan 450 pixel/detik.
Seorang penembak ingin menembak dengan meriam dari posisi (10,400). Penembak
ingin menembak pesawat dalam 15 loop. Atau dengan kata lain Penembak ingin
menembak pesawat saat pesawat berada pada posisi (415,200). Keduanya sama saja,
karena setelah 15 loop pesawat berada pada posisi (415,200). Gravitasi = 8
Disini semuanya sudah jelas
bx = 540
by = 200
loop = 20
ax = 10
ay = 400
grav = 8

kalau dimasukkan rumus

vx = (bx - ax)/(loop)
vy = grav * (loop - 1)/2

Silahkan hitung sendiri.

Di dalam game hasilnya akan tampak seperti ini.


Pesawat (biru) akan tertembak setelah bergerak 255 pixel (15 loop). Sesuai dengan
gerakan peluru yang juga bergerak 15 loop.

Archer:
Bagaimana untuk pemanah dengan animasi arah panahnya. Perhitungannya sama saja
hanya sedikit ditambah perhitungan sudut panah untuk menyesuaikan dengan gambar.
Silahkan hitung sendiri, tinggal dikembangkan kok.




Perhitungan diatas hanya berlaku pada game dan tidak berlaku pada dunia nyata.
Masih bisa dikembangkan ke dalam beberapa macam game dan pergerakan musuh
selama musuh bergerak dengan pola yang bisa dihitung.



full code bagi yang ingin coba:

oh ya, untuk panah dan alien pakai gambar ini:



Code:
Graphics 640,480,16,2 SetBuffer BackBuffer() Type tbullet Field vx# ;x velocity Field vy# ;y velocity Field x# Field y# Field time# ;time to get to target Field ftime Field xel# ;elevation Field frame End Type ;bullet Global ax#=10 ;archer position Global ay#=400 ;archer position Global bx#=450 ;target position Global by#=300 ;target position Global grav#=1 ;gravitation Global test=LoadAnimImage("test.png",32,32,0,16) MidHandle test create_bullet() .main While True Cls bullet_update() bx=MouseX() by=MouseY() If MilliSecs()>(time+100) time=MilliSecs() create_bullet() EndIf ;render Color 0,0,255 Oval ax,ay,10,10,1 Oval MouseX(),MouseY(),20,20 Text MouseX(),MouseY()+20,"Target" Color 255,255,255 For bullet.tbullet = Each tbullet If bullet\frame>=0 Then DrawImage test,bullet\x,bullet\y,bullet\frame Next Flip 1 If KeyHit(1) Then Exit Wend WaitKey() End Function bullet_update() For bullet.tbullet = Each tbullet If MilliSecs()>(bullet\ftime+30) x#=bullet\x y#=bullet\y bullet\x=bullet\x+bullet\vx bullet\y=bullet\y-bullet\vy+bullet\xel bullet\vy=bullet\vy-grav bullet\ftime=MilliSecs() ;angle x=(bullet\x-x) y=(bullet\y-y) If x=0 Then x=.1 a#=ATan(Abs(y)/Abs(x)) ;quad If (x>=0) And (y>=0) Then a=360-a If (x>=0) And (y<=0) Then a=a+0 If (x<=0) And (y>=0) Then a=a+180 If (x<=0) And (y<=0) Then a=180-a ;frame bullet\frame=(a-(a Mod 22.5))/22.5 If bullet\frame>15 Then bullet\frame=0 EndIf If bullet\y>480 Delete bullet EndIf Next End Function Function create_bullet() bullet.tbullet = New tbullet bullet\x=ax bullet\y=ay bullet\time#=Rand(20,60) bullet\vx#=(bx-ax)/(bullet\time) bullet\vy#=grav*(bullet\time-1)/Float(2) bullet\xel=(by-ay)/(bullet\time) bullet\frame=-1 End Function
second code: moving target
Code:
Graphics 640,480,16,2 SetBuffer BackBuffer() SeedRnd MilliSecs() Type tbullet Field vx# ;x velocity Field vy# ;y velocity Field x# Field y# Field time# ;time to get to target Field ftime Field xel# ;elevation Field frame Field hit End Type Type talien Field x# Field y# Field xspeed# Field timer Field targeted End Type ;bullet Global ax#=10 ;archer position Global ay#=400 ;archer position Global bx#=450 ;target position Global by#=300 ;target position Global grav#=1 ;gravitation Global miss,kill Global test=LoadAnimImage("test.png",32,32,0,16) MidHandle test Global img_alien=LoadImage("alien.png") MidHandle img_alien ;create_bullet() alien_create() .main While True Cls bullet_update() alien_update() ;If MilliSecs()>(time+100) ; time=MilliSecs() ; create_bullet() ;EndIf If MilliSecs()>(timer2+500) timer2=MilliSecs() alien_create() EndIf ;render Color 0,0,255 Oval ax,ay,10,10,1 Color 255,255,255 For bullet.tbullet = Each tbullet If bullet\frame>=0 If Not bullet\hit DrawImage test,bullet\x,bullet\y,bullet\frame EndIf EndIf Next For alien.talien = Each talien DrawImage img_alien,alien\x,alien\y Next Text 10,10,"kill : "+kill Text 10,30,"Miss : "+miss Flip 1 If KeyHit(1) Then Exit Wend WaitKey() End Function bullet_update() For bullet.tbullet = Each tbullet If MilliSecs()>(bullet\ftime+30) x#=bullet\x y#=bullet\y bullet\x=bullet\x+bullet\vx bullet\y=bullet\y-bullet\vy+bullet\xel bullet\vy=bullet\vy-grav bullet\ftime=MilliSecs() ;angle x=(bullet\x-x) y=(bullet\y-y) If x=0 Then x=.1 a#=ATan(Abs(y)/Abs(x)) ;quad If (x>=0) And (y>=0) Then a=360-a If (x>=0) And (y<=0) Then a=a+0 If (x<=0) And (y>=0) Then a=a+180 If (x<=0) And (y<=0) Then a=180-a ;frame bullet\frame=(a-(a Mod 22.5))/22.5 If bullet\frame>15 Then bullet\frame=0 ;collision For alien.talien=Each talien If Not bullet\hit If ImagesCollide(test,bullet\x,bullet\y,0,img_alien,alien\x,alien\y,0) Delete alien bullet\hit=True kill=kill+1 EndIf EndIf Next EndIf If bullet\y>480 If bullet\hit=False Then waste=waste+1 Delete bullet EndIf Next End Function Function create_bullet() bullet.tbullet = New tbullet bullet\x=ax bullet\y=ay bullet\time#=Rand(20,60) bullet\vx#=(bx-ax)/(bullet\time) bullet\vy#=grav*(bullet\time-1)/Float(2) bullet\xel=(by-ay)/(bullet\time) bullet\frame=-1 ;targeting bx=640 by=480 For alien.talien = Each talien If alien\targeted=False bx=alien\x by=alien\y speed=alien\xspeed alien\targeted=True Exit EndIf Next time#=Rand(20,50) bx=bx-(time*speed) bullet\time=time bullet\vx#=(bx-ax)/(bullet\time) bullet\vy#=grav*(bullet\time-1)/Float(2) bullet\xel=(by-ay)/(bullet\time) bullet\frame=-1 End Function Function alien_create() alien.talien = New talien alien\x=600 alien\y=Rand(36,440) alien\xspeed=Rand(5,10) create_bullet() End Function Function alien_update() For alien.talien = Each talien If MilliSecs()>(alien\timer+30) alien\timer=MilliSecs() alien\x=alien\x-alien\xspeed If alien\x<50 Then Delete alien:miss=miss+1 EndIf Next End Function
__________________
Blogs-gak jelas

   
 
 
Old 17/12/2009, 18:16 Reply With Quote   #3
cruxblack
Kura2 Overquota
Pink is Power
 
cruxblack's Avatar
 
Join Date: Oct 2007
Location: Cimahi, Bandung
Posts: 2,416
cruxblack is on a distinguished road
Send a message via Yahoo to cruxblack cruxblack is offline
AI for a bloon type system ya?
Nice om real, belum ada yang mo ditanyain, kayanya penjelasannya dah cukup jelas

Appreciate the reference, thx thx
__________________
~Lose all doubts, everything is possible!~

~One who question is not ready for an answer~
~One who's ready for an answer would not need to question~

| My Portfolio |
   
 
 
Old 17/12/2009, 18:20 Reply With Quote   #4
bart_the_13th
Veteran Member
 
No Avatar
 
Join Date: Jan 2004
Location: Bandung
Posts: 1,274
bart_the_13th is on a distinguished road
bart_the_13th is offline
Wah, si om rajin banget bikin tutorial kayak gini. Kebetulan saya lagi butuh buat game yang ada lompat2nya... Save as dulu ah

Ada yang mau ditanyakan tapi ntar, mau dicoba sendiri dulu, soalnya udah dapet titik terang nih
__________________
What should I put here anyway?
Favorit quote:
   
 
 
Old 17/12/2009, 19:14 Reply With Quote   #5
not me
Junior Member
 
not me's Avatar
 
Join Date: Oct 2009
Posts: 15
not me is on a distinguished road
not me is offline
bagus Om artikelnya... sangat bermanfaat buat saya...
save juga...
thanks...
   
 
 
Old 17/12/2009, 22:41 Reply With Quote   #6
pe-e-be
Alien dari lab GAIB
 
pe-e-be's Avatar
 
Join Date: Jul 2005
Location: lab gaib itb, bandung
Posts: 1,755
pe-e-be is on a distinguished road
pe-e-be is offline
Quote:
1. Ada berapa kemungkinan sudut dan kekuatan yang diperlukan agar tembakan bisa
mengenai target?

Jawaban singkat:
1. Kemungkinan sudut dan kekuatan adalah tak terbatas
kemungkinan sudut dan kekuatan bisa dibatasi om tergantung arah gravitasi dan posisi relatif target terhadap penembak (kalo target ada di kanan, dan gravitasi ke bawah, maka nembak ke kiri nggak akan pernah nyampe kanan om).
__________________
liku-liku hidup.
game, dapur dan perspektif.
hire me here
   
 
 
Old 17/12/2009, 23:14 Reply With Quote   #7
alijaya
GDI Power Users
 
alijaya's Avatar
 
Join Date: Dec 2007
Location: Pangkalpinang
Posts: 3,279
alijaya is on a distinguished road
Send a message via Yahoo to alijaya alijaya is offline
*alijaya idem ama om peb
Btw...
In my humble opinion, napa xel gk digabungin ama vy?
Jadi vy = (by - ay) / loop + grav * (loop - 1) / 2
Dan sekalian tambah arah angin
vx = (bx - ax) / loop + wind * (loop - 1) / 2

Dan pengen nambah soal lage neh, gmana kalo ada penghalangnya *yay, it's a complicated one!
__________________
tobat ngejunk. tobat nyepam. tobat bikin yang gak bener. tobat kasih komen gak jelas. tobat buang-buang ikon. tobat jadi orang jelek. tobat maen komputer sambil belajar. tobat banget kalo ngomong gak bertanggung jawab. tobat banget untuk kesalahan laennya.
"siapa yang mau ikut2an tobat??"
blog : http://alijaya.wordpress.com/, http://bothaxe.wordpress.com/
   
 
 
Old 18/12/2009, 05:00 Reply With Quote   #8
realtime
Veteran Member
 
realtime's Avatar
 
Join Date: Feb 2007
Location: deket bunderan kampus
Posts: 1,422
realtime is on a distinguished road
realtime is offline
karena gak pernah bikin game, akhirnya cuman bisa nulis buat sekalian update blog.

lagian disini gak ada yang ngelarang nulis toh.
di forum sebelah malah dimarahi karena salah tempat
mereka minta langsung dijadikan library ajah.

xel bisa digabungin yah, nice
oh ya tentang sudut gak terbatas, emang rada hiperbola

memang pernah kepikiran bagaimana kalau ada halangan.
kalau manual bisa ngecek apakah panah yang dilempar kena apa gak
kalau kena tinggal manah lagi pakai sudut beda.
atau tembak yang banyak, pasti ada yang kena.

buat yang ahli matematika:
sebenarnya kita bisa memprediksi posisi bola pada posisi tertentu
kalau tahu polanya.
bagaimanapun pergerakan peluru tuh ada polanya
pakai fungsi (-x2+bx+c). tapi aku udah lupa cara cari rumus
dari data yang sudah ada. ada yang tahu gak?

thanks



seterusnya mo nulis apa lagi yah? (mumpung belum ada yang nglarang )
__________________
Blogs-gak jelas

   
 
 
Old 18/12/2009, 10:56 Reply With Quote   #9
alijaya
GDI Power Users
 
alijaya's Avatar
 
Join Date: Dec 2007
Location: Pangkalpinang
Posts: 3,279
alijaya is on a distinguished road
Send a message via Yahoo to alijaya alijaya is offline
y(t) = vy * t + a * t * t / 2

rumus fisika biasa kan?
Dalam hal ini a = -g

*btw sumbu y na ke atas atau ke bawah neh?
__________________
tobat ngejunk. tobat nyepam. tobat bikin yang gak bener. tobat kasih komen gak jelas. tobat buang-buang ikon. tobat jadi orang jelek. tobat maen komputer sambil belajar. tobat banget kalo ngomong gak bertanggung jawab. tobat banget untuk kesalahan laennya.
"siapa yang mau ikut2an tobat??"
blog : http://alijaya.wordpress.com/, http://bothaxe.wordpress.com/
   
 
 
Old 18/12/2009, 17:16 Reply With Quote   #10
realtime
Veteran Member
 
realtime's Avatar
 
Join Date: Feb 2007
Location: deket bunderan kampus
Posts: 1,422
realtime is on a distinguished road
realtime is offline
no...no.. not that formula

maksudnya rumus untuk yang ini
1 3 6 10 15 21 28 36 45 55 66 78 ..... n

bagaimana nyari rumus untuk bilangan ke n
gak ada hubungannya dengan topik seh
sekedar pingin tau ajah.
__________________
Blogs-gak jelas

   
   Reply « Previous Thread| Next Thread »     


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off


All times are GMT +7. The time now is 01:30.


skin developed by: uray
Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.