0

Everywhere online says to use atan2(pointA.y-pointB.y, pointA.x, pointB.x) but it just doesn't work.

import pygame
import sys
from math import *

WIDTH, HEIGHT = 1024, 576
screen = pygame.display.set_mode((WIDTH, HEIGHT))

def rot(surface, angle):
    rotated_surface = pygame.transform.rotozoom(surface, angle, 1)
    rotated_rect = rotated_surface.get_rect()
    return rotated_surface, rotated_rect

surf = pygame.Surface((64, 32), flags=pygame.SRCALPHA)
surf.fill((255, 0, 0))

def map_range(value, leftMin, leftMax, rightMin, rightMax):
    # Figure out how 'wide' each range is
    leftSpan = leftMax - leftMin
    rightSpan = rightMax - rightMin

    # Convert the left range into a 0-1 range (float)
    valueScaled = float(value - leftMin) / float(leftSpan)

    # Convert the 0-1 range into a value in the right range.
    return rightMin + (valueScaled * rightSpan)

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    mouse_pos = pygame.Vector2(pygame.mouse.get_pos())

    center = pygame.Vector2(surf.get_rect().center)
    
    angle = degrees(atan2(mouse_pos.y - center.y, mouse_pos.x - center.x))

    rotated_surface = rot(surf, angle)
    rotated_surface[1].center = (WIDTH/3, HEIGHT/3)

    screen.fill((0,0,0))

    screen.blit(rotated_surface[0], rotated_surface[1])

    pygame.display.update()

I converted it in degrees and all, but it just doesn't rotate properly towards the cursor. Am I missing something?

  • The typical screw ups are (1) Do you know what the angle is that you're measuring? (2) Is it degrees or radians? (3) Which direction is positive and which direction is negative. Are you sure that `rot` takes degrees, and that its "positive" direction is what you expect? Sometimes it's worthwhile to replace `rot` with `-rot` just to see what happens! – Frank Yellin Jan 21 '22 at 21:58

2 Answers2

0
  1. You're using the center of surf in your calculation. The center of surf is in the top-left of your screen. Use the center of your rotated_surface.
  2. Negate the angle.
Cookiscuit
  • 21
  • 5
0

2 Mistakes:

  1. The center of the object is (WIDTH/3, HEIGHT/3)
  2. The y-axis of the pygame coordinate system points down. So you need to invert the y-axis before calculating the angle.
center = pygame.Vector2(WIDTH/3, HEIGHT/3)
angle = degrees(atan2(-(mouse_pos.y - center.y), mouse_pos.x - center.x))
rotated_surface = rot(surf, angle)
rotated_surface[1].center = center.x, center.y

See also How to know the angle between two vectors? and How to rotate an image(player) to the mouse direction?.

Rabbid76
  • 202,892
  • 27
  • 131
  • 174