Pygame基础10-物理模拟

简介: Pygame基础10-物理模拟

PyMunk

PyMunk是一个模拟物理的库。

注意,PyMunk只是进行物理模拟,不包含可视化的功能。如果需要可视化,可使用pygame等库。

可用pip安装pymunk

pip install pymunk

pymunk中的概念

  • space: 物理空间。 包含gravity 模拟重力,update更新空间。
  • Body: 原子物体(一个点,没有形状),受到力的影响。
  • Shape:形状,包围在Body周围,用于检测碰撞。

pymunk中有3种类型的Body

  • static:静止的,不会移动,但是可以产生碰撞。
  • dynamic:动态的,受到力的影响。
  • kinematic:受玩家控制(或非物理控制)的影响。

模拟的过程

  1. 创建空间
space = pymunk.Space()
space.gravity = (0.0, 100.0)


  1. 创建Body和shape, 并加入到空间中
def create_apple(space, pos):
    body = pymunk.Body(mass=1, moment=10, body_type=pymunk.Body.DYNAMIC) # DYNAMIC 类型的物体会受到力的影响
    body.position = pos
    shape = pymunk.Circle(body, radius=10)
    space.add(body, shape)
    return shape

(如果使用pygame可视化)绘制物体:

def draw_apple(apples):
    for apple in apples:
        pos_x = int(apple.body.position.x)
        pos_y = int(apple.body.position.y)
        pygame.draw.circle(screen, (255, 0, 0), (pos_x, pos_y), 10)
  1. 更新空间
...
# 在每一帧中更新空间
space.step(1/60.0)

案例

下面是一个完整示例,模拟苹果掉落的过程。

import sys
import pygame
import pymunk


pygame.init()
screen_size = (800, 600)
screen = pygame.display.set_mode(screen_size)
clock = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, 100.0)


def create_apple(space, pos):
    body = pymunk.Body(mass=1, moment=10, body_type=pymunk.Body.DYNAMIC) # DYNAMIC 类型的物体会受到力的影响
    body.position = pos
    shape = pymunk.Circle(body, radius=10)
    space.add(body, shape)
    return shape


def draw_apple(apples):
    for apple in apples:
        pos_x = int(apple.body.position.x)
        pos_y = int(apple.body.position.y)
        pygame.draw.circle(screen, (255, 0, 0), (pos_x, pos_y), 10)



def create_static_ball(space, pos):
    body = pymunk.Body(body_type=pymunk.Body.STATIC) # STATIC 类型的物体 不会移动
    body.position = pos
    shape = pymunk.Circle(body, radius=10)
    space.add(body, shape)
    return shape

def draw_balls(balls):
    for ball in balls:
        pos_x = int(ball.body.position.x)
        pos_y = int(ball.body.position.y)
        pygame.draw.circle(screen, (0, 255, 0), (pos_x, pos_y), 10)

apples =[]

balls = []
balls.extend([create_static_ball(space, (400, 300)),
             create_static_ball(space, (500, 400))
            ])

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            apple = create_apple(space, pos)
            apples.append(apple)

    screen.fill((35, 35, 35))
    draw_apple(apples)
    draw_balls(balls)

    space.step(1/60.0)

   
    pygame.display.flip()
    clock.tick(60)

相关文章
|
10月前
|
NoSQL MongoDB 开发者
Python与MongoDB的亲密接触:从入门到实战的代码指南
本文详细介绍了Python与MongoDB结合使用的实战技巧,涵盖环境搭建、连接管理、CRUD操作、高级查询、索引优化、事务处理及性能调优等内容。通过15个代码片段,从基础到进阶逐步解析,帮助开发者掌握这对黄金组合的核心技能。内容包括文档结构设计、批量操作优化、聚合管道应用等实用场景,适合希望高效处理非结构化数据的开发者学习参考。
468 0
|
存储 Windows
卸载时报错:“系统找不到指定的驱动器”问题处理
【10月更文挑战第5天】文档介绍了分析“系统找不到指定的驱动器”错误的原因及解决方法。此错误多因外部设备移除、网络驱动器断开或软件卸载程序缺陷引起。解决策略包括检查外部设备连接、更新驱动器盘符、使用第三方卸载工具以及手动清理注册表和文件系统。
5424 3
|
JSON 自然语言处理 API
对接开源大模型应用开发平台最佳实践
本文介绍如何使用OpenSearch LLM智能问答版对接大模型应用开发平台构建RAG系统。
894 8
对接开源大模型应用开发平台最佳实践
|
传感器 机器学习/深度学习 编解码
自动驾驶 | 毫米波雷达视觉融合方案综述(数据级/决策级/特征级融合)
自动驾驶在复杂场景下的目标检测任务至关重要,而毫米波雷达和视觉融合是确保障碍物精准检测的主流解决方案。本论文详细介绍了基于毫米波雷达和视觉融合的障碍物检测方法,从任务介绍、评估标准和数据集三方面展开。
自动驾驶 | 毫米波雷达视觉融合方案综述(数据级/决策级/特征级融合)
|
网络协议 安全 网络安全
揭秘互联网的隐形斗篷:你的DNS数据真的安全吗?
【8月更文挑战第27天】在互联网中,每个网站通过IP地址定位,但记忆这些数字困难且存在安全风险。因此,域名系统(DNS)诞生,实现域名与IP之间的转换。然而,未加密的DNS请求易受中间人攻击,导致隐私泄露或恶意软件植入。为解决此问题,DNS-over-HTTPS(DoH)和DNS-over-TLS(DoT)协议应运而生,它们通过对DNS查询进行加密确保数据传输安全。本文将介绍这两种协议,并通过示例展示如何配置支持DoT的DNS服务器,包括安装dnscrypt-proxy、编辑配置文件及重启服务等步骤。
1103 0
|
安全 Unix Linux
AIX系统关机命令的正确使用
AIX系统关机命令的正确使用
715 2
小狼毫Rime输入法简单配置指南
小狼毫Rime输入法简单配置指南
4268 4
Python----统计字符串中的英文字母、空格、数字和其它字符的个数。
Python----统计字符串中的英文字母、空格、数字和其它字符的个数。
|
Dubbo Java 应用服务中间件
Spring Boot整合Dubbo+Zookeeper实现RPC调用
Spring Boot整合Dubbo+Zookeeper实现RPC调用 技术栈说明 Dubbo:Dubbo作为RPC框架,能在多个服务之间实现远程服务的调用。比如有两个独立的微服务A和B,A服务想要调用B服务时,因为两者不在同个内存空间中,不能直接调用,所以可以通过Dubbo实现这点。 功能和Spring Cloud的Feign相同,两者都是应用于微服务架构的远程调用框架 Zookeeper:作为注册中心去管理Dubbo服务,这点和Eureka、Nacos相同。 概述 通过一个示例说明Dubbo+Zookeeper在Spring Boot中的应用。 现有两个服务provider和con
695 4