How do I make a 2d enemy fire in any Direction?

Blitz3D Forums/Blitz3D Beginners Area/How do I make a 2d enemy fire in any Direction?

WERDNA(Posted 2008) [#1]
Lol. The space you have for the topic title is SO TINY!
I couldn't really describe accurately my question, so I will do so now.

I am making a 2D Space Shooter game, and would like one of the
enemys to be able to fire at the player no matter where he is
positioned. I know how to make enemys fire projectile weapons,
and have often done so in my games.

But I don't know how to make the enemy fire at the player no
matter where he is positioned, and to keep the bullet on track,
and going in a straight line to its destination without moving from
side to side at all!


Like this,

Key
P = Player
E = enemy
- = bullet path
; = space


;P;;;;;;;;;;;;;;;;;;
;-;;;;;;;;;;;;;;;;;;
;;-;;;;;;;;;;;;;;;;
;;;-;;;;;;;;;;;;;;
;;;;E;;;;;;;;;;;

I want the enemys bullet to go in a straight line to the player.


;;;;;;;;;;;;;P
;;;;;;;;;;;;-;
;;;;;;;;;;;-;;
;;;;;;;;;;-;;;
;;;;;;;;;E;;;
No matter where the player might be positioned.

So how do I move the bullet in the right direction?
normally I would just use Bullet\x = Bullet\x + 1
or something like that.
But I need the bullet to be able to move in any direction!


If anyone could answer this, I would appreciate it.

WERDNA


Matty(Posted 2008) [#2]
;pseudocode
BulletSpeed# = 5.0 ;could be any number
dx# = PlayerPositionX - EnemyPositionX
dy# = PlayerPositionY - EnemyPositionY
dist# = sqr(dx*dx + dy*dy)

bulletvelocityx#=0
bulletvelocityy#=0

if dist#>0 then 
	bulletvelocityx# = BulletSpeed * (dx / dist)
	bulletvelocityy# = BulletSpeed * (dy / dist)
endif 

;then when you move the bullet simply do so like this:
bulletpositionx# = bulletpositionx# + bulletvelocityx#
bulletpositiony# = bulletpositiony# + bulletvelocityy#




Nate the Great(Posted 2008) [#3]
Matty's code should work. Here is an example.

Graphics 640,480,0,2

Const towerx = 320
Const towery = 240
Const bspeed = 5

Type bul
	Field x#,y#,dx#,dy#,lif
End Type

SetBuffer BackBuffer()

btimer = 0
While Not KeyDown(1)
Cls

Color 255,255,255
Oval 310,230,20,20,0

btimer = btimer + 1
If btimer = 30 Then
	btimer = 0
	b.bul = New bul
	b\x# = towerx
	b\y# = towery
	distx = MouseX() - towerx
	disty = MouseY() - towery
	dist# = Sqr(distx*distx + disty*disty)
	
	b\dx# = (distx / dist#) * bspeed
	b\dy# = (disty / dist#) * bspeed
	b\lif = 300
	
EndIf


For b.bul = Each bul
	Line b\x,b\y,b\x-b\dx#,b\y-b\dy#
	b\x# = b\x# + b\dx#
	b\y# = b\y# + b\dy#
	b\lif = b\lif - 1
	If b\lif = 0 Then Delete b.bul
Next

Flip
Wend
End



Kryzon(Posted 2008) [#4]
And here's yet another example for you:
Const SHOT_speed = 5 ;pixels
Const SHOT_Timer_Delay = 10 ;just to hold the update on every computer you run the game.
Global SHOT_Timer = MilliSecs()

Const GW=640 : GH=480

Graphics GW,GH

SetBuffer BackBuffer()

Type shots
Field x#,y#
Field HSpeed#,VSpeed#
End Type
Global Update_Bullets = False 
While Not KeyHit(1)
Cls
 
MX# = MouseX()
MY# = MouseY()
angle# = ATan2(MY-GH/2,MX-GW/2)

Line MX-5,MY-5,MX+5,MY+5
Line MX-5,MY+5,MX+5,MY-5

Oval GW/2-10,GH/2-10,20,20

Line GW/2,GH/2, GW/2+Cos(angle)*30 , GH/2+Sin(angle)*30 

If MouseHit(1) Then
   s.shots = New shots
   s\x = GW*1.0/2   
   s\y = GH*1.0/2
   s\HSpeed = SHOT_Speed*Cos(angle)
   s\VSpeed = SHOT_Speed*Sin(angle)
EndIf

If SHOT_Timer + SHOT_Timer_Delay < MilliSecs() Then 
   Update_Bullets = True
   SHOT_Timer = MilliSecs()
Else
   Update_Bullets = False
EndIf

For s.shots = Each shots 
     Rect s\x-2,s\y-2,4,4 
     If Update_Bullets Then 
        s\x = s\x + s\HSpeed 
        s\y = s\y + s\VSpeed 
     Endif
     If (s\x < 0 Or s\x > GW) Or (s\y < 0 Or s\y > GH) Then Delete s  
Next  

Flip
Wend
End

In this one I used Atan2 to get the "angle" that I used to extract the horizontal and vertical components of the vector. Having these 2 components, you just add them every iteration of the bullet update loop to the bullet's current position and voilą.


Ross C(Posted 2008) [#5]
Yep, simply get the angle via atan2 then, plug that angle into COS for the x speed and SIN for the y speed.


Kryzon(Posted 2008) [#6]
plug that angle into COS for the x speed and SIN for the y speed

Don't forget to multiply the result by the desired bullet speed :o)


WERDNA(Posted 2008) [#7]
Thanks guys! this looks perfect ^_^

Just what I wanted.

WERDNA