Skip to content Skip to sidebar Skip to footer

Pygame Curve Movement Problem How To Fix?

VIDEO < I'm trying to make the white rectangle curve slowly and smoothly towards the red rectangle and then stop but for some reason the white rectangle isn't curving right and

Solution 1:

The gravitational force must act in the direction of the target.

I recommend to use pygame.math.Vector2 for the calculations. Calculate the direction vector from the object to the target and scale it to the size of the gravitational force. Change the motion vector depending on gravity in each frame:

dir_vec = pygame.math.Vector2(target_pos) - self.rect.center
v_len_sq = dir_vec.length_squared()
if v_len_sq > 0:
    dir_vec.scale_to_length(self.gravity)
    self.speed = (self.speed + dir_vec) * self.friction
    self.pos += self.speed

Minimal example:

import pygame
pygame.init()

class curvemove:
    def __init__(self, x, y, height, width, color):
        self.pos = pygame.math.Vector2(x, y)
        self.color = color
        self.rect = pygame.Rect(x, y, height, width)
        self.speed = pygame.math.Vector2(-5.0, 0)
        self.gravity = 0.5
        self.friction = 0.99
    
    def draw(self):
        self.rect.center = (self.pos.x, self.pos.y)
        pygame.draw.circle(window, self.color, (self.pos.x, self.pos.y), self.rect.width//2)
    
    def update(self, target_pos):
        dir_vec = pygame.math.Vector2(target_pos) - self.rect.center
        v_len_sq = dir_vec.length_squared()
        if v_len_sq > 0:
            dir_vec.scale_to_length(self.gravity)
            self.speed = (self.speed + dir_vec) * self.friction
            self.pos += self.speed

window = pygame.display.set_mode((500,500))
pygame.display.set_caption("test map")
clock = pygame.time.Clock()
white = 255, 255, 255
red = 205, 0, 10
curve_move1 = curvemove(250, 400, 20, 20, white)
touched = curvemove(250, 200, 20, 20, red)
fps = 60
move = False

def redraw():
    window.fill((0,0,0))
    curve_move1.draw()
    touched.draw()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_v:
                move = True
            if event.key == pygame.K_r:
                move = False
                curve_move1 = curvemove(250, 400, 20, 20, white)

    if (curve_move1.pos - touched.pos).length() < 10:
        move = False
    if move:
        curve_move1.update(touched.rect.center)
    redraw()
    pygame.display.update()
    clock.tick(fps)

pygame.quit()
exit()

Play around with the values of speed, gravity and friction to get different effects.

e.g.:

self.speed = pygame.math.Vector2(-10.0, 0)
self.gravity = 1
self.friction = 0.95

e.g.:

self.speed = pygame.math.Vector2(-10.0, 0)
self.gravity = 1
self.friction = 0.91


Post a Comment for "Pygame Curve Movement Problem How To Fix?"