首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用pymunk定义函数

用pymunk定义函数
EN

Stack Overflow用户
提问于 2022-09-20 10:42:15
回答 1查看 33关注 0票数 0

我在下面的代码中定义了一个名为add_spring的函数

代码语言:javascript
复制
import pymunk
import pymunk.pygame_util
import math

pygame.init()
wid, hei = 800, 700
window = pygame.display.set_mode((wid, hei))


def draw(space, window, draw_options):
    window.fill("white")
    space.debug_draw(draw_options)
    pygame.display.update()

def wall(space, wid, hei):
    rects = [
        [(wid/2, hei - 10), (wid, 20)],
        [(wid/2, 10), (wid, 20)]
    ]
    for pos, size in rects:
        body = pymunk.Body(body_type=pymunk.Body.STATIC)
        body.position = pos
        shape  = pymunk.Poly.create_box(body, size)
        shape.elasticity = 0.4
        shape.friction = 0.5
        space.add(body, shape)

def create_ball(space, radius, mass):
    body = pymunk.Body()
    body.position = (500, 350)
    shape = pymunk.Circle(body, radius)
    shape.mass = mass
    shape.color = (55, 0, 0, 100)
    space.add(body, shape)
    shape.elasticity = 0.9
    shape.friction = 0.4
    return shape

def add_ball(space):
    body = pymunk.Body()
    body.position = (500, 500)
    shape = pymunk.Circle(body, 20)
    shape.mass = 1
    shape.friction = 0.7
    space.add(body, shape)
    return body

def create_ball_a(space, radius, mass):
    body = pymunk.Body(body_type=pymunk.Body.STATIC)
    body.position = (500, 300)
    shape = pymunk.Circle(body, radius)
    shape.mass = mass
    shape.color = (55, 0, 0, 100)
    space.add(body, shape)
    shape.elasticity = 0.9
    shape.friction = 0.4
    return shape

def create_ball_b(space, radius, mass):
    body = pymunk.Body(body_type=pymunk.Body.STATIC)
    body.position = (550, 300)
    shape = pymunk.Circle(body, radius)
    shape.mass = mass
    shape.color = (55, 0, 0, 100)
    space.add(body, shape)
    shape.elasticity = 0.9
    shape.friction = 0.4
    return shape
def add_spring(var1, var2):
    dlx = pymunk.DampedSpring(var1, var2, (0, 0), (0, 0), 5, 70, 0)
    space.add(dlx)



def run(window, wid, hei):
    run = True
    clock = pygame.time.Clock()
    fps = 60
    dt = 1 / fps
    space = pymunk.Space()
    space.gravity = (0, 981)
    big_ball = create_ball(space, 30, 10)
    joina = create_ball_a(space, 5, 10)
    joinb = create_ball_b(space, 5, 10)
    j = pymunk.DampedSpring(big_ball.body, joina.body, (0, 0), (0, 0), 5, 70, 0)
    space.add(j)
    add_spring(joina, big_ball)
    space.add(pymunk.DampedSpring(big_ball.body, joinb.body, (0, 0), (0, 0), 100, 100, 10))
    wall(space, wid, hei)
    draw_options = pymunk.pygame_util.DrawOptions(window)

    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                break
        draw(space, window, draw_options)
        space.step(dt)
        clock.tick(fps)
    pygame.quit()

if __name__ == "__main__":
    run(window, wid, hei)

但是,当我运行它时,会出现下面的错误。

代码语言:javascript
复制
pygame 2.0.1 (SDL 2.0.14, Python 3.8.9)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "e:/pymunk/2D-cloth-simulation/string_d.py", line 104, in <module>
    run(window, wid, hei)
  File "e:/pymunk/2D-cloth-simulation/string_d.py", line 88, in run
    add_spring(joina, big_ball)
  File "e:/pymunk/2D-cloth-simulation/string_d.py", line 71, in add_spring
    dlx = pymunk.DampedSpring(var1, var2, (0, 0), (0, 0), 5, 70, 0)
  File "C:\Users\Kishlay\AppData\Local\Programs\Python\Python38\lib\site-packages\pymunk\constraints.py", line 617, in __init__
    _constraint = lib.cpDampedSpringNew(
TypeError: initializer for ctype 'struct cpBody *' must be a cdata pointer, not Body

当我在不为它定义函数的情况下做同样的事情时,它可以工作,但是为了保持代码的干净,我需要它将它转换成一个函数,这样我就可以不麻烦地多次完成它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-20 19:34:29

你有两个错误。

  1. 它需要.body (就像代码中的其他DampedSpring一样) 您可以从var1var2: dlx = pymunk.DampedSpring(var1.body,var2.body,(0,0),(0,0),5,70,0) 或者你可以发送.body: add_spring(joina.body,big_ball.body)
  2. 您还必须将space发送到此函数(要运行space.add() ) 使它发挥作用: def add_spring(space,var1,var2): 发送到功能: Add_spring(空间,joina.body,big_ball.body)

完整代码:

代码语言:javascript
复制
import pygame
import pymunk
import pymunk.pygame_util
import math

# --- constants ---  # PEP8: `UPPER_CASE_NAMES`

WIDTH = 800
HEIGHT = 700
FPS = 60

# --- functions ---  # PEP8: all function before main code

def draw(space, window, draw_options):
    window.fill("white")
    space.debug_draw(draw_options)
    pygame.display.update()

def wall(space, width, height):
    rects = [
        [(width/2, height - 10), (width, 20)],
        [(width/2, 10), (width, 20)]
    ]
    
    for pos, size in rects:
        body = pymunk.Body(body_type=pymunk.Body.STATIC)
        body.position = pos
        
        shape  = pymunk.Poly.create_box(body, size)
        shape.elasticity = 0.4
        shape.friction = 0.5
        
        space.add(body, shape)

def create_ball(space, radius, mass):
    body = pymunk.Body()
    body.position = (500, 350)
    
    shape = pymunk.Circle(body, radius)
    shape.mass = mass
    shape.color = (55, 0, 0, 100)
    shape.elasticity = 0.9
    shape.friction = 0.4

    space.add(body, shape)
    
    return shape

def add_ball(space):
    body = pymunk.Body()
    body.position = (500, 500)
    
    shape = pymunk.Circle(body, 20)
    shape.mass = 1
    shape.friction = 0.7
    
    space.add(body, shape)
    
    return body

def create_ball_a(space, radius, mass):
    body = pymunk.Body(body_type=pymunk.Body.STATIC)
    body.position = (500, 300)
    
    shape = pymunk.Circle(body, radius)
    shape.mass = mass
    shape.color = (55, 0, 0, 100)
    shape.elasticity = 0.9
    shape.friction = 0.4
    
    space.add(body, shape)
    
    return shape

def create_ball_b(space, radius, mass):
    body = pymunk.Body(body_type=pymunk.Body.STATIC)
    body.position = (550, 300)
    
    shape = pymunk.Circle(body, radius)
    shape.mass = mass
    shape.color = (55, 0, 0, 100)
    shape.elasticity = 0.9
    shape.friction = 0.4

    space.add(body, shape)
    
    return shape

def add_spring(space, body1, body2):
    dlx = pymunk.DampedSpring(body1, body2, (0, 0), (0, 0), 5, 70, 0)
    
    space.add(dlx)
    
    return dlx

def run(WIDTH, HEIGHT):
    pygame.init()
    window = pygame.display.set_mode((WIDTH, HEIGHT))

    dt = 1 / FPS

    clock = pygame.time.Clock()
    
    space = pymunk.Space()
    space.gravity = (0, 981)
    
    big_ball = create_ball(space, 30, 10)
    joina = create_ball_a(space, 5, 10)
    joinb = create_ball_b(space, 5, 10)
    
    j = pymunk.DampedSpring(big_ball.body, joina.body, (0, 0), (0, 0), 5, 70, 0)
    space.add(j)
    
    add_spring(space, joina.body, big_ball.body)
    
    space.add(pymunk.DampedSpring(big_ball.body, joinb.body, (0, 0), (0, 0), 100, 100, 10))
    
    wall(space, WIDTH, HEIGHT)
    draw_options = pymunk.pygame_util.DrawOptions(window)

    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                break
            
        draw(space, window, draw_options)
        
        space.step(dt)
        clock.tick(FPS)
        
    pygame.quit()

if __name__ == "__main__":
    run(WIDTH, HEIGHT)

PEP 8 -- Python代码样式指南

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73785401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档