[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] Angle To Target Function



Just thought I'd offer this function, which might be useful for
characters with following behavior. It finds the angle from one point to
another, in degrees, with 0 being "up" and 90 being "right." It's
therefore useful for deciding whether a target is to a character's right
etc., and it's easily changed if you don't like the scale I used.

------

import math
def AngleToTarget(dx,dy):
    """Returns the angle to a point (dx,xy) in degrees.

    0==up/north, 90==right/east, 180==down/south, 270==left/west.
    """
    if dx == 0: ## Special case to prevent zero-division
        if dy > 0:
            return 180
        elif dy < 0:
            return 0
        else:
            return None

    oa = float(dy)/float(dx)
    theta = math.degrees(math.atan(oa)) + 90.0

    if dx > 0:
        return theta
    else:
        return 180+theta

    return theta


## Demonstrate the function graphically: show angle from a "sun" to your
cursor.
import pygame
pygame.init()
from pygame.locals import *
s = pygame.display.set_mode((500,500))
font = pygame.font.Font(None,36)
done = False
while not done:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            done = True

    x, y = pygame.mouse.get_pos()
    dx, dy = x-250, y-250
    theta = AngleToTarget(dx,dy)
    s.fill((0,0,0))
    pygame.draw.circle(s,(255,255,64),(250,250),10)
    t = font.render(str(int(theta)),1,(255,255,255))
    pygame.draw.line(s,(128,128,128),(250,250),(x,y))
    s.blit(t,(0,0))
    pygame.display.update()