python:pymunk + pygame 模拟六边形中小球弹跳运动
向 chat.deepseek.com 提问:编写 python 程序,用 pymunk, 有一个正六边形,围绕中心点缓慢旋转,六边形内有一个小球,六边形的6条边作为墙壁,小球受重力和摩擦力、弹力影响,模拟小球弹跳运动,小球初始位置在中心点,中心点位置不变。
以下是结合 pymunk
(2D 物理引擎)和 pygame
的 Python 脚本,模拟六边形中小球的弹跳运动。
1. 安装依赖
确保你已经安装了 pymunk
和 pygame
:pip install pymunk pygame
2. 示例代码 test_pymunk_6e1b.py
# -*- coding: utf-8 -*-
""" pymunk + pygame 模拟六边形小球弹跳运动 """
import math
import pygame
import pymunk
import pymunk.pygame_util
# 初始化pygame
pygame.init()
# 屏幕参数
width, height = 800, 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("2D Hexagon Ball Simulation with Pymunk")
# 初始化pymunk
space = pymunk.Space()
space.gravity = (0, 500) # 设置重力
# 绘制选项
draw_options = pymunk.pygame_util.DrawOptions(screen)
# 创建六边形的静态物体
def create_hexagon(center, radius, rotation_angle=0):
num_sides = 6
points = []
for i in range(num_sides):
angle = 2 * math.pi * i / num_sides + rotation_angle
x = center[0] + radius * math.cos(angle)
y = center[1] + radius * math.sin(angle)
points.append((x, y))
# 创建六边形的边
segments = []
for i in range(num_sides):
p1 = points[i]
p2 = points[(i + 1) % num_sides]
segment = pymunk.Segment(space.static_body, p1, p2, 5)
segment.elasticity = 0.8 # 反弹系数
segment.friction = 0.5 # 摩擦力
segments.append(segment)
return segments
# 创建小球
def create_ball(space, position, radius, mass):
moment = pymunk.moment_for_circle(mass, 0, radius)
body = pymunk.Body(mass, moment)
body.position = position
shape = pymunk.Circle(body, radius)
shape.elasticity = 0.8 # 反弹系数
shape.friction = 0.5 # 摩擦力
space.add(body, shape)
return body
# 中心点和半径
hexagon_center = (width // 2, height // 2)
hexagon_radius = 200
# 初始六边形
rotation_angle = 0 # 初始旋转角度
hexagon_segments = create_hexagon(hexagon_center, hexagon_radius, rotation_angle)
for segment in hexagon_segments:
space.add(segment)
# 创建小球
ball_radius = 20
ball_mass = 1
ball_position = (width // 2, height // 2 - hexagon_radius + ball_radius + 10)
ball_body = create_ball(space, ball_position, ball_radius, ball_mass)
# 主循环
clock = pygame.time.Clock()
running = True
rotation_speed = 0.01 # 旋转速度
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 清屏
screen.fill((255, 255, 255))
# 更新六边形的旋转角度
rotation_angle += rotation_speed
if rotation_angle >= 2 * math.pi:
rotation_angle -= 2 * math.pi
# 移除旧的六边形边
for segment in hexagon_segments:
space.remove(segment)
# 创建新的六边形边
hexagon_segments = create_hexagon(hexagon_center, hexagon_radius, rotation_angle)
for segment in hexagon_segments:
space.add(segment)
# 更新物理引擎
space.step(1 / 60.0)
# 绘制物理空间
space.debug_draw(draw_options)
# 刷新屏幕
pygame.display.flip()
clock.tick(60)
pygame.quit()
3.运行 python test_pymunk_6e1b.py
运行脚本后,你会看到一个六边形和一个红色小球在六边形内弹跳。小球受重力影响,碰到六边形的边时会反弹。
4. 代码说明
-
初始化:
-
初始化
pygame
和pymunk
。 -
设置重力方向为向下(
(0, 500)
)。
-
-
创建六边形:
-
使用
pymunk.Segment
创建六边形的六条边。 -
设置边的弹性(
elasticity
)和摩擦力(friction
)。
-
-
创建小球:
-
使用
pymunk.Circle
创建一个圆形刚体。 -
设置小球的弹性(
elasticity
)和摩擦力(friction
)。
-
-
主循环:
-
每帧更新物理引擎(
space.step
)。 -
使用
space.debug_draw
绘制物理空间的内容。
-
-
显示:
-
使用
pygame
显示六边形和小球的运动。
-
5. 自定义参数
你可以调整以下参数来改变模拟效果:
-
重力:修改
space.gravity
的值。 -
反弹系数:修改
elasticity
的值(范围为0
到1
)。 -
摩擦力:修改
friction
的值。 -
小球质量:修改
ball_mass
的值。
6. 总结
-
使用
pymunk
可以轻松实现 2D 物理模拟。 -
结合
pygame
可以实现图形显示和交互。 -
这个脚本是一个简单的示例,你可以根据需要扩展功能,例如添加更多小球或更复杂的形状。
pymunk + pygame 模拟八边形小球弹跳运动
只需修改一行 num_sides = 8 ,另存为:test_pymunk_8e1b.py
运行 python test_pymunk_8e1b.py