Python Forum
Trying to understand Pymunk - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Trying to understand Pymunk (/thread-34896.html)



Trying to understand Pymunk - Prithak - Sep-13-2021

Here I have some code:

import pygame
import pymunk
import sys

pygame.init()

screen = pygame.display.set_mode((1280,720))
clock = pygame.time.Clock()
space = pymunk.Space()

class Player():
	def __init__(self, x, y, w, h):
		self.x = x
		self.y = y
		self.w = w
		self.h = h
		self.body = pymunk.Body(body_type = pymunk.Body.KINEMATIC)
		self.body.position = x, y
		self.shape = pymunk.Poly.create_box(self.body, (w, h))
		self.shape.elasticity = 1
		space.add(self.body, self.shape)

	def draw(self):
		pygame.draw.rect(screen, (100,200,255), (self.x, self.y, self.w, self.h),0, 10)

	def moveUP(self, up_down):
		if up_down:
			self.body.velocity = 0, -600

		if not up_down:
			self.body.velocity = 0, 600

	def moveDOWN(self, left_right):
		if left_right:
			self.body.velocity = -600, 0

		if not left_right:
			self.body.velocity = 600, 0

	def stop(self):
		self.body.velocity = 0, 0

player = Player(100,200,50,50)

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

	player.draw()

	k = pygame.key.get_pressed()

	if k[pygame.K_w]:
		player.moveUP(True)
	elif k[pygame.K_s]:
		player.moveUP(False)
	else:
		player.stop()

	pygame.display.flip()
	screen.fill((0,0,0))
	clock.tick(60)
	space.step(1/60)
After setting the velocity to -600 in the moveUP function at Player Class, shouldn't the player move? Am I doing something wrong??


RE: Trying to understand Pymunk - deanhystad - Sep-13-2021

Your problem is that you don't use the body.x and body.y information in Player.draw(). In Player.draw() you should use self.body.x instead of self.x and self.body.y instead of self.y.

I would make Player a subclass of Pymunk.body. Then I could use self.x because it would be pymunk.Body.x. Note that this is untested code.
import pygame
import pymunk
import sys
 
pygame.init()
 
screen = pygame.display.set_mode((1280,720))
clock = pygame.time.Clock()
space = pymunk.Space()
 
class Player(pyumunk.Body):
    def __init__(self, x, y, w, h):
        super().__init__(body_type = pymunk.Body.KINEMATIC)
        self.position = x, y
        self.w = w
        self.h = h
        self.shape = pymunk.Poly.create_box(self, (w, h))
        self.shape.elasticity = 1
        space.add(self, self.shape)
 
    def draw(self):
        pygame.draw.rect(screen, (100,200,255), (self.x, self.y, self.w, self.h),0, 10)
 
    def moveVertical(self, vel):
        self.velocity = (self.velocity[0], vel)
 
    def moveHorizontal(self, vel):
        self.velocity = (vel, self.velocity[1])
 
    def stop(self):
        self.velocity = (0, 0)
 
player = Player(100, 200, 50, 50)
 
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
 
    k = pygame.key.get_pressed()
    if k[pygame.K_w]:
        player.vertical(-600)
    elif k[pygame.K_s]:
        player.vertical(600)
    else:
        player.stop()
 
    screen.fill((0,0,0))   # Changed the order of fill/draw/flip.  Seems more logical to me.
    player.draw()
    pygame.display.flip()

    clock.tick(60)
    space.step(1/60)