Im working on a tower defense game in python/pygame and im trying to program a tower that will pick a random direction to shoot but still shoot in the direction of its target.
The towers shoot just fine using 2d vectors but i would like to add some randomness to their shots. And i just dont know how to go about doing this. One thing i thought of was to convert the vector to an angle and then add/subtract a number from that angle which i would then convert back into a vector as a direction for the tower to shoot. But i cant seem to get this working. I would appreciate any help with my method or maybe another method that would work better.
I need the final vector to still be in the general direction of the starting vector and i would like to be able to control the range of the difference between the two with a variable.
Thanks tons for anyone who can help me.
random 2d vector within set range
heres what ive got so far:
this converts the vector into a degree value
then gives me a random degree value within the
correct range but it does not convert it back into
a vector
(I have not figured out how to do that correctly yet)
angle_range = 10turret_pos = vec2d(self.rect.centerx, self.rect.centery)target_pos = vec2d(self.target.rect.centerx, self.target.rect.centery)dist = y - xdist_x = dist[0] # gets the x from the dist tupledist_y = dist[1] # gets the y from the dist tupleradians = math.atan2(dist_y,dist_x)degrees = math.degrees(radians)degrees += (random.random() * angle_range) * random.choice([-1,1])
this converts the vector into a degree value
then gives me a random degree value within the
correct range but it does not convert it back into
a vector
(I have not figured out how to do that correctly yet)
Well, you have a distance and an angle value pointing to the target, or slightly next to it. If you assume your turrent to be the origin of a coordinate frame, you can easily get the (cartesian) coordinates of a point given angle and distance using polar coordinates:
See: Polar coordinate system
x = distance * math.cos(alpha)y = distance * math.sin(alpha)
See: Polar coordinate system
I wouldn't use degrees in the computations. If you want to be able to specify angle_range in degrees, just do:
double const pi = std:atan(1.0)*4.0; double const radians_per_degree = pi/180.0; double angle_range = 10 * radians_per_degree;
Ok, so im trying to use this but the angle is not getting converted into a vector correctly
example:
heres the output:
that vector should be (0,1) (straight up)
so what do i need to change?
example:
x = math.cos(degrees)y = math.sin(degrees)print degreesprint (x,y)
heres the output:
-90.0(-0.44807361612917013, -0.89399666360055785)
that vector should be (0,1) (straight up)
so what do i need to change?
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement