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()

classcurvemove:
    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.99defdraw(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)
    
    defupdate(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 = Falsedefredraw():
    window.fill((0,0,0))
    curve_move1.draw()
    touched.draw()

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

    if (curve_move1.pos - touched.pos).length() < 10:
        move = Falseif 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?"