EarthIsFlat
EarthIsFlat

Reputation: 63

Pymunk bodies colliding without touching each other

Why do bodies in pymunk keep colliding without actually touching each other even after the position and body shape is correctly set?

You will see from my code below that the bird keeps colliding with the ball without actually touching the ball.

import pygame, pymunk
pygame.init()

WIDTH, HEIGHT = 900, 500
win = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Flappy OBJ")

color = (255,255,255)

win.fill(color)

fps = 120

fb_img = pygame.image.load("images/flappy-bird.png")#.convert()
fb_img = pygame.transform.rotate(pygame.transform.scale(fb_img, (30,20)), 0)
ball_img = pygame.image.load("images/ball.png")#.convert()
ball_img = pygame.transform.rotate(pygame.transform.scale(ball_img, (60,60)), 0)

def bird_body():
    body = pymunk.Body(1, 100, body_type=pymunk.Body.DYNAMIC)
    body.position = (50, 0)
    shape = pymunk.Poly.create_box(body, (30,20))
    space.add(body, shape)
    return shape

def ball_body():
    body = pymunk.Body(1, 100, body_type = pymunk.Body.KINEMATIC)
    body.position = (500, 300)
    body.velocity = (-25,0)
    shape = pymunk.Circle(body, 60)
    shape.color = (0,255,255, 128)
    space.add(body, shape)
    return shape

space = pymunk.Space()

space.gravity = (0, 20)
fb_body = bird_body()
b_body = ball_body()


def draw_window():
    global scroll
    win.fill(color)

    space.step(0.03)
    
    win.blit(ball_img, (b_body.body.position.x, b_body.body.position.y))
    win.blit(fb_img, (fb_body.body.position.x, fb_body.body.position.y))
    
    pygame.display.update()

def main():
    w_was_down = True

    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(fps)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        keys_pressed = pygame.key.get_pressed()
        
        if keys_pressed[pygame.K_w]:
            if not w_was_down:
                fb_body.body.apply_impulse_at_local_point((0,-50))
                w_was_down = True
        else:
            w_was_down = False

        draw_window()

    pygame.quit()
main()

Tap w to move the bird up. some more details some more details some more details

Upvotes: 2

Views: 370

Answers (1)

Rabbid76
Rabbid76

Reputation: 210908

The 2nd argument of pymunk.Circle is the radius, but not the diameter:

shape = pymunk.Circle(body, 60)

shape = pymunk.Circle(body, 30)

And the position of the pymuk object is the center of the object:

win.blit(ball_img, (b_body.body.position.x, b_body.body.position.y))
win.blit(fb_img, (fb_body.body.position.x, fb_body.body.position.y))

win.blit(ball_img, (b_body.body.position.x-30, b_body.body.position.y-30))
win.blit(fb_img, (fb_body.body.position.x-15, fb_body.body.position.y-10))

Upvotes: 3

Related Questions