Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Player Not Falling After Thrown

VIDEO I’m working on a Pygame project where I have a player that can be thrown towards the pointed aiming dots when the space bar is clicekd. The throwing motion works as expected; however, I’m encountering an issue with the player not falling back down after being thrown like a bell shape. . Any suggestions or insights into what might be causing this issue would be greatly appreciated!

# Inside the main game loop
if keys[pygame.K_SPACE] and not player1.isThrown:
    player1.isThrown = True
    player1.throwCount = 0
    player1.angle = math.atan2(dot.y - player1.y, dot.x - player1.x) + math.pi / 2 

if player1.isThrown:
    throw_distance = player1.throwSpeed * player1.throwCount
    player1.y -= throw_distance * math.cos(player1.angle)  
    player1.x += throw_distance * math.sin(player1.angle) 
    player1.throwCount += 1


# Falling motion after the throw
if not player1.isThrown and player1.y < 400:
    fall_speed = 5
    player1.y += fall_speed

    if player1.y > 400:
        player1.y = 400

the full code


import pygame
import math

pygame.init()

window = pygame.display.set_mode((500, 500))

class Player:
    def __init__(self, x, y, height, width, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect(x, y, height, width)
        self.isThrown = False
        self.throwCount = 0
        self.throwSpeed = 1
        self.angle = 0
        self.initial_throw_height = 50

    def draw(self):
        self.rect.topleft = (self.x, self.y)
        pygame.draw.rect(window, self.color, self.rect)

class Dot:
    def __init__(self, x, y, size, color, alpha):
        self.x = x
        self.y = y
        self.size = size
        self.color = color
        self.alpha = alpha

    def draw(self):
        pygame.draw.rect(window, (self.color[0], self.color[1], self.color[2], self.alpha), (self.x - self.size // 2, self.y - self.size // 2, self.size, self.size))

player1 = Player(50, 400, 50, 50, (55, 255, 255))
bottom1 = Player(0, 450, 550, 40, (145, 215, 15))

dots = [
    Dot(0, 0, 10, (255, 255, 255), 128),
    Dot(0, 0, 20, (255, 255, 255), 128),
    Dot(0, 0, 30, (255, 255, 255), 128),
    Dot(0, 0, 40, (255, 255, 255), 128),
    Dot(0, 0, 50, (255, 255, 255), 128)
]

prev_mouse_pos = (0, 0)

run = True
while run:
    pygame.time.delay(50)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    mouse_x, mouse_y = pygame.mouse.get_pos()

    for dot in dots:
        dot.x = player1.x + player1.width // 2 + (mouse_x - player1.x - player1.width // 2) * (dot.size / 25)
        dot.y = player1.y + player1.height // 2 + (mouse_y - player1.y - player1.height // 2) * (dot.size / 25)

    window.fill((28, 40, 51))

    for dot in dots:
        dot.draw()

    player1.draw()
    bottom1.draw()

    # Inside the main game loop
    if keys[pygame.K_SPACE] and not player1.isThrown:
        player1.isThrown = True
        player1.throwCount = 0
        player1.angle = math.atan2(dot.y - player1.y, dot.x - player1.x) + math.pi / 2 
    if player1.isThrown:
        throw_distance = player1.throwSpeed * player1.throwCount
        player1.y -= throw_distance * math.cos(player1.angle) 
        player1.x += throw_distance * math.sin(player1.angle)  
        player1.throwCount += 1

 

    # Falling motion after the throw
    if not player1.isThrown and player1.y < 400:
        fall_speed = 5
        player1.y += fall_speed

        if player1.y > 400:
            player1.y = 400

    pygame.display.update()

pygame.quit()

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

Increase the self.throwSpeed:

self.throwSpeed = 10

but do not increment the movement vector:

throw_distance = player1.throwSpeed * player1.throwCount
player1.throwCount += 1

Falling is an accelerated movement, so the falling speed must be increased in each frame:

fall_speed = 0
run = True
while run:
    # [...]

    if keys[pygame.K_SPACE] and not player1.isThrown:
        player1.isThrown = True
        player1.angle = math.atan2(dot.y - player1.y, dot.x - player1.x) + math.pi / 2 
        fall_speed = 0

    if player1.isThrown:
        player1.y -= player1.throwSpeed * math.cos(player1.angle) 
        player1.x += player1.throwSpeed * math.sin(player1.angle) 
        player1.y += fall_speed
        fall_speed += 0.5
        if player1.y > 400:
            player1.y = 400
            player1.isThrown = False
            fall_speed = 0

    pygame.display.update()
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading