Pygame碰撞代码

2023-12-24

首先,我必须说我是法国人(这样你就明白为什么我会犯所有这些错误,哈哈)

我正在使用 python、pygame 和 pymunk 开发一个物理游戏:一个球(我称之为 X)必须到达 Y 点。这是一款平台游戏 2d 游戏。为了帮助球到达 Y 点,用户必须添加球(右键单击)并制作形状来帮助 X 移动。

但是......当我发现(最近,在我开始编码之后)pygame 中类和方法以及精灵的存在时,我很惊讶地发现我的代码“丑陋”,而且太混乱了。但我不想重写代码,我的目标是在“空间”(窗口)中添加一个区域,当 X 与其碰撞时,会发生一个事件(例如;下一个级别,出现一张图片, ETC)。

谁能帮我 ?我一直在法国论坛上询问,但找不到解决方案。我希望 stack-overflow 社区能够解决这个问题 ^^

谢谢大家 :)

(CODE:)

    import pygame
from pygame.locals import *
from pygame.color import *

import random
import math
import pymunk
from pymunk import Vec2d
import pymunk as pm

X,Y = 0,1
### Physics collision types
COLLTYPE_DEFAULT = 0
COLLTYPE_MOUSE = 1
COLLTYPE_BALL = 2


def flipy(y):
    """Small hack to convert chipmunk physics to pygame coordinates"""
    return -y+600


def mouse_coll_func(space,arbiter):
    s1,s2 = arbiter.shapes
    s2.unsafe_set_radius(s2.radius + 0.15)
    return False

def main():

pygame.init()

fen1 = pygame.display.set_mode((1200, 675))
pygame.display.set_caption('Niveau 1')



marche = True

#Elements physiques
space = pm.Space()
space.gravity = Vec2d(0.0, -900.0)
clock = pygame.time.Clock()

#Balles
logos = []
logo_img = pygame.image.load("pringles.png").convert_alpha()
balls = []
ball_static = []


###Mouvements à la souris
mouse_body = pm.Body()
mouse_shape = pm.Circle(mouse_body, 3, Vec2d(99,99)) #0,0
mouse_shape.collision_type = COLLTYPE_MOUSE
space.add(mouse_shape)

space.add_collision_handler(COLLTYPE_MOUSE, COLLTYPE_BALL, None, mouse_coll_func, None, None)   

# Static line
static_body = pymunk.Body()
static_lines = [pymunk.Segment(static_body, (139.0, 480.0), (137.0, 479.0), 0.0)
               ,pymunk.Segment(static_body, (18.0, 497.0),  (249.0, 496.0), 0.0)
               ,pymunk.Segment(static_body, (252.0, 496.0), (309.0, 479.0), 0.0)
               ,pymunk.Segment(static_body, (309.0, 477.0), (358.0, 443.0), 0.0)
               ,pymunk.Segment(static_body, (358.0, 443.0), (407.0, 374.0), 0.0)
               ,pymunk.Segment(static_body, (407.0, 374.0), (433.0, 287.0), 0.0)
               ,pymunk.Segment(static_body, (482.0, 79.0),  (520.0, 34.0), 0.0)

               ,pymunk.Segment(static_body, (433.0, 287.0), (449.0, 193.0), 0.0)
               ,pymunk.Segment(static_body, (450.0, 193.0), (458.0, 130.0), 0.0)
               ,pymunk.Segment(static_body, (458.0, 130.0), (480.0, 79.0), 0.0)
               ,pymunk.Segment(static_body, (521.0, 34.0),  (573.0, 8.0), 0.0)
               ,pymunk.Segment(static_body, (573.0, 8.0), (645.0, -12.0), 0.0)

               ,pymunk.Segment(static_body, (645.0, -12.0), (714.0, -17.0), 0.0)
               ,pymunk.Segment(static_body, (714.0, -17.0), (805.0, -15.0), 0.0)
               ,pymunk.Segment(static_body, (805.0, -15.0), (889.0, -6.0), 0.0)
               ,pymunk.Segment(static_body, (890.0, -5.0), (995.0, 13.0), 0.0)
               ,pymunk.Segment(static_body, (995.0, 13.0), (1077.0, 23.0), 0.0)
               ,pymunk.Segment(static_body, (1077.0, 23.0), (1199.0, 24.0), 0.0)
               ,pymunk.Segment(static_body, (18.0, 497.0), (0.0, 515.0), 0.0)          
               ,pymunk.Segment(static_body, (1197.0, 598.0), (1197.0, -71.0), 0.0)]

#apparition de GES
rt = 200, 502
bodyrt = pm.Body(20, 100)
bodyrt.position = rt
shapert = pm.Circle(bodyrt, 40, (0,0))
shapert.friction = 90
shapert.collision_type = COLLTYPE_BALL
space.add(bodyrt, shapert)
#image = pygame.image.load("perso.png").convert_alpha()
ball_static.append(shapert)



# Static line
line_point1 = None
#static_lines = []
run_physics = True

###Friction avec les lignes 
for l in static_lines:
    l.friction = 0.5
space.add(static_lines)

#Fonctions à la souris 
while marche:
    for event in pygame.event.get():
        if event.type == QUIT:
            marche = False
        elif event.type == KEYDOWN and event.key == K_ESCAPE:
            marche = False
        elif event.type == KEYDOWN and event.key == K_p:
            pygame.image.save(fen1, "test_image.jpg")


        elif event.type == MOUSEBUTTONDOWN and event.button == 1:
            p = event.pos[X], flipy(event.pos[Y])
            body = pm.Body(20, 100)
            body.position = p
            shape = pm.Circle(body, 20, (0,0))
            shape.friction = 90
            shape.collision_type = COLLTYPE_BALL
            space.add(body, shape)
            balls.append(shape)


        elif event.type == MOUSEBUTTONDOWN and event.button == 3: 
            if line_point1 is None:
                line_point1 = Vec2d(event.pos[X], flipy(event.pos[Y]))
        elif event.type == MOUSEBUTTONUP and event.button == 3: 
            if line_point1 is not None:

                line_point2 = Vec2d(event.pos[X], flipy(event.pos[Y]))
                print (line_point1, line_point2)
                body = pm.Body()
                shape= pm.Segment(body, line_point1, line_point2, 0.0)
                shape.friction = 0.99
                space.add(shape)
                static_lines.append(shape)
                line_point1 = None

        elif event.type == KEYDOWN and event.key == K_SPACE:    
            run_physics = not run_physics


    p = pygame.mouse.get_pos()
    mouse_pos = Vec2d(p[X],flipy(p[Y]))
    mouse_body.position = mouse_pos




    #mise à jour
    dt = 1.0/60.0
    for x in range(1):
        space.step(dt)

    #################################################


    ### Dessiner fond

    fond1=pygame.image.load("niveau_1.gif")
    pygame.display.flip()
    fen1.blit(fond1, (0,0))

    for ball in balls:           
        r = ball.radius
        v = ball.body.position
        rot = ball.body.rotation_vector
        p = int(v.x), int(flipy(v.y))
        p2 = Vec2d(rot.x, -rot.y) * r * 0.9
        pygame.draw.circle(fen1, THECOLORS["blue"], p, int(r), 2)
        pygame.draw.line(fen1, THECOLORS["yellow"], p, p+p2)
        pe = pygame.image.load("pringles.png")
        pf = pygame.image.load("pringles3.png")
        fen1.blit(pe, (p2,v))  #essayer p2,v
        #fen1.blit(pf, (p, p2))

        ####

    for ball in ball_static:           
        r = ball.radius
        v = ball.body.position
        rot = ball.body.rotation_vector
        p = int(v.x), int(flipy(v.y))
        pt = int(v.x), int(flipy(v.y)) -90
        p2 = Vec2d(rot.x, -rot.y) * r * 0.9
        fdr = pygame.image.load("pringles2.png")
        pygame.draw.circle(fen1, THECOLORS["yellow"], p, int(r), 2)
        pygame.draw.line(fen1, THECOLORS["red"], p, p+p2)
        fen1.blit(fdr,(pt,pt))

    #   ESSAI
    if pygame.collide_rect(static_ball, static_lines):
        print ('....')

            ###

    if line_point1 is not None:
        p1 = line_point1.x, flipy(line_point1.y)
        p2 = mouse_pos.x, flipy(mouse_pos.y)
        pygame.draw.lines(fen1, THECOLORS["black"], False, [p1,p2])

    for line in static_lines:
        body = line.body

        pv1 = body.position + line.a.rotated(body.angle)
        pv2 = body.position + line.b.rotated(body.angle)
        p1 = pv1.x, flipy(pv1.y)
        p2 = pv2.x, flipy(pv2.y)
        pygame.draw.lines(fen1, THECOLORS["lightgray"], False, [p1,p2])
        ##########################################################









  if __name__ == '__main__':
      main()

既然您已经在使用 pymunk,为什么不使用它来检测碰撞(而不是其他答案中的 pygame)。

基本上,您需要创建并添加一个 pymunk.Shape 对象来定义您的目标,设置其碰撞类型并在该对象和您的玩家球 X 之间添加一个碰撞处理程序。

像这样的事情应该可以做到(pymunk 5.0 及更高版本):

# Add a new collision type
COLLTYPE_GOAL = 3

# Define collision callback function, will be called when X touches Y 
def goal_reached(space, arbiter):
    print "you reached the goal!"
    return True

# Setup the collision callback function
h = space.add_collision_handler(COLLTYPE_BALL, COLLTYPE_GOAL)
h.begin = goal_reached

# Create and add the "goal" 
goal_body = pymunk.Body()
goal_body.position = 100,100
goal = pymunk.Circle(goal_body, 50)
goal.collision_type = COLLTYPE_GOAL
space.add(goal)

在旧版本中,处理程序以这种方式设置:

# Setup the collision callback function
space.add_collision_handler(COLLTYPE_BALL, COLLTYPE_GOAL, goal_reached, None, None, None)   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pygame碰撞代码 的相关文章

  • Selenium AttributeError:列表对象没有属性 find_element_by_xpath

    我正在尝试从网站上抓取一些营养数据 到目前为止一切似乎都进展顺利 直到我遇到格式略有不同的页面 使用 selenium 和这样的行 返回一个空列表 values browser find elements by class name siz
  • ModuleNotFoundError:没有名为“pwd”的模块——airflow python [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想使用以下方式安装气流的 Web UI airflow webserver port 1080 但我收到这个错误 Mo
  • 从 Windows 文件系统中的任何位置运行 python 脚本

    我已经实现了一些实用程序来满足我的需要 以使用 Python 简化开发 需要多个 py文件和一些额外的 template文件 重命名 txt file 我希望能够从文件系统中的任何位置使用此实用程序 例如 如果我当前位于某个文件夹中 我想运
  • Celery未注册任务KeyError

    我通过在终端中执行以下命令来启动工作程序 celery A cel test worker loglevel INFO concurrency 10 n worker1 h 然后我收到一条长循环错误消息 指出 celery 已收到未注册的任
  • 哪个 Python IDE 可以逐行运行我的脚本?

    我不会称自己为程序员 但我最近开始学习 Python 并且非常喜欢它 到目前为止 我主要将它用于小任务 脚本编写 文本处理 KML 生成和 ArcGIS 根据我使用 R 的经验 使用出色的 Notepad 和NppToR http sour
  • 将行转换为 pandas 中逗号分隔的字符串

    我有一个熊猫数据框 from pandas import DataFrame import pandas as pd df2 DataFrame a one one two two three two one six b x y z y x
  • 输入到列表并找到同一输入python的最长条纹

    我正在编写一个程序 其中用户将值输入到列表中 直到想要结束为止 该程序将告诉用户他们输入的最长连续数字 例如 如果用户输入 7 7 7 6 6 4 end 则会得到输出 您的最长连胜次数为 3 因为 7 已连续输入 3 次 到目前为止 我有
  • 我可以使用 Python 访问 ImageMagick API 吗?

    我需要使用图像魔术师 http www imagemagick org script index php因为 PIL 没有我正在寻找的可用图像功能量 但是 我想使用Python python 绑定 PythonMagick 自 2009 年
  • 没有实例的 Django Formset

    In this http docs djangoproject com en dev topics forms modelforms inline formsetsDjango Doc 解释了如何创建一个表单集 该表单集允许您编辑属于特定作
  • 转换为 Base 64 时,TypeError: 'str' 不支持缓冲区接口 [重复]

    这个问题在这里已经有答案了 im Image open filePath load image self msg str bytearray list im getdata convert image data to string enco
  • 如何设置appache2的WSGI与python 3.7一起使用?

    我使用的是 ubuntu 16 04 并安装了 python 3 7 并使用以下说明将其设置为默认值 无法在 ubuntu 中将默认 python 版本设置为 python3 https stackoverflow com question
  • tf.reshape 与 tf.contrib.layers.flatten

    所以我正在运行 CNN 来解决分类问题 我有 3 个转换层和 3 个池化层 P3是最后一个池化层的输出 其维度为 Batch size 4 12 48 我想将该矩阵展平为 Batch size 2304 尺寸矩阵 为2304 4 12 48
  • 使用 Flask 测试客户端请求传递 cookie 标头

    我在让 Flask 测试客户端传递 cookie 时遇到问题 这段代码曾经有效 我认为我的环境中的某些内容发生了变化 这打破了这一点 我最近创建了一个新的 Python 3 7 virtualenv 并安装了 Flask 1 0 2 fro
  • Psycopg2 中的元命令 - \d 不起作用

    我希望使用列出表的所有列名psycopg2Python 包 2 7 但我无法执行以下查询 cur execute d my table psycopg2 ProgrammingError syntax error at or near 对于
  • zsh:当我尝试在 venv 中运行应用程序时,中止 python 错误

    我使用以下命令设置 Python 3 6pyenv这样我将来就可以管理多个Python版本 例如3 7和3 8 我没有使用 Homebrew 安装 Python 因为它改变了系统版本 这是我第一次使用zshshell 因为它是 Catali
  • django 返回记录的最近日期

    我正在尝试从用户的多个记录中返回最近的日期 当用户创建文档时 创建日期存储在 CreatedDocumentDetails 模型中 我无法返回用户最近创建的文档的日期 我问这个关于SO的问题 https stackoverflow com
  • Python 子进程在发出 HTTP 请求时无提示崩溃

    我在组合多处理 请求 或 urllib2 和 nltk 时遇到问题 这是一个非常简单的代码 gt gt gt from multiprocessing import Process gt gt gt import requests gt g
  • Flask 从线程中删除会话变量

    我尝试实施投票系统 它的工作原理是这样的 如果用户对帖子进行投票 我会在会话变量中记录其临时状态 已投票 已加星标等 如果当前用户在我将结果保存到临时表之前尚未投票 用户可以在 5 分钟内更改投票 5 分钟后 结果将使用线程永久写入数据库
  • 创建将一把小提琴按色调分割的小提琴图的正确方法是什么?

    创建将一把小提琴分开的小提琴图的正确方法是什么hue 我尝试了不同的方法 似乎唯一的方法是创建一个为数据集中的每个条目共享相同值的功能 并将该功能的名称传递为x fig plt figure figsize 20 8 fig add sub
  • “from-import”是否执行整个模块?

    好的 所以我知道from import与 完全 相同import 但这显然不是因为命名空间的填充方式不同 我的问题主要是因为我有一个utils我的应用程序中的每个其他模块都使用一个或两个函数的模块 我正在努力合并标准库logging模块 据

随机推荐

  • 使用 Gulpjs 编译客户端 Jade 模板

    我正在尝试将所有 jade 模板编译成一个 js 文件 我使用 Gulpjs 和 gulp jade gulp concat 我可以获得单个文件 但问题是那里呈现的所有函数都具有相同的名称 它们都称为 模板 foo jade fooDiv
  • 在 Actor 对象中的方法上使用远程调用时会阻塞?

    执行以下命令不会同时执行 而是首先执行 Run1 并阻塞直至完成 然后再执行 Run2 ray remote class Test def init self pass def Run1 self print Run1 Start slee
  • Visual C++ 12(VS2013 预览版)带有函数参数解决方法的可变参数模板

    我刚刚提交Microsoft Connect 上的此错误 https connect microsoft com VisualStudio feedback details 792024 variadic templates and fun
  • 将 JSON 字符串上传到 Google Cloud Storage,无需文件

    我的情况是 当我从其他来源接收数据作为 JSON 字符串时 然后我想将此字符串上传到 Google Cloud Storage 而不将此字符串写入本地文件并上传此文件 有什么办法可以做到这一点吗 谢谢 看起来像下面的代码 storage b
  • elementRef.style.top = "100px" 不起作用

    我想使用 elementRef 移动组件的位置 我下面的代码看起来相当合理 但不起作用 为什么 ngAfterViewInit let element this elementRef nativeElement element style
  • 在 Angular.js 中扩展 $scope

    有时 我看到人们使用这种模式 angular extend scope somekey someval 当我可以像这样直接设置范围时 使用这种类型的范围扩展有什么好处 scope somekey someval 使用这种范围扩展方式有什么好
  • Laravel 可选()如何工作?

    创建新模型时 我尝试使用optional 设置值时帮助程序分配值 然而 当user在此上下文中未设置对象 我收到此错误 Undefined property stdClass user this gt events gt create ca
  • jquery 效果突出显示在 asp.net 更新面板中不起作用

    我有两个更新面板如下 当单击链接按钮时我试图突出显示 div
  • 使用 purrr 的地图时出错,可能

    我正在尝试运行一个循环卡方dataframe 我在用着map and possibly 都来自purrr 即使抛出错误也允许循环运行 在我的 data frame 中的某个地方 我有一列显然少于两个值 我找不到它 但这就是为什么我要尝试跑步
  • 使用 .cer 文件签署 .exe(signtool.exe 要求的证书名称是什么?)

    我已经为我的课程购买了证书 我购买它的网站给我发了一份 cer file 43 一些 真的很长 名称 9962812767788 cer 没有发送任何其他文件 但我几乎 100 确定我不需要更多文件 当我点击它时 cer文件中 有如下信息
  • 通过配置选项将 CMake 与 icc 结合使用的推荐方法?

    我想将英特尔编译器 icc 或 icpc 与基于 CMake 的项目一起使用 在 Linux 上 我当然可以在调用 cmake 时导出 CXX 变量 例如喜欢 CXX icpc cmake 这很好用 不过 我想通过自定义选项提供此选择 为此
  • 错误:-[UIImage _deleteExternalReferenceFromPermanentLocation] 无法识别的选择器发送到实例

    当我删除包含图像 作为可转换值存储在外部记录中 的托管对象时 出现崩溃并出现以下错误 Terminating app due to uncaught exception NSInvalidArgumentException reason U
  • 如何获取 iOS 设备上关联接入点的 IP 地址

    使用案例 我们有一个 iOS 应用程序 您可以在 iOS 设备及其关联的无线接入点之间运行网络测试以测试吞吐量 该应用程序可以很好地获取 iOS 设备的 IP 地址 但用户必须输入接入点的 IP Problem 任务是获取关联接入点的 IP
  • SQL Server中唯一键是聚集索引还是非聚集索引?

    我是 SQL Server 新手 在学习聚集索引时 我感到很困惑 唯一键是聚集索引还是非聚集索引 unique key只保存列中唯一的值 包括null 所以根据这个概念 unique key应该是聚集索引 对吧 但当我读完这篇文章时 我感到
  • 陷入函数和布尔值的困境

    我有一个名为firstRun 其中我有两个定义的布尔值filesDeleted and dirsDeleted 也在函数里面我有if filesDeleted true dirsDeleted true 当我尝试调试应用程序时出现错误 Us
  • LINQ 内连接

    我有两个收藏 List
  • magento 肥皂 api v2 目录产品信息不工作

    当我如下调用api函数时 我收到以下错误 我确信所有传递的变量都设置正确 因为其他 magento api 函数工作得很好 产品不存在 错误 发生内部错误 我假设这是调用语法的错误 我找不到正确的调用示例目录产品信息使用 sku 而不是产品
  • Sugar ORM Android 具有多个数据库

    我正在尝试为具有多个数据库的多个用户创建一个应用程序 每次用户登录时 应用程序都会选择特定用户的数据库并从中获取值 是否可以使用 Sugar ORM 来实现它 因为在 Sugar ORM 中 我们只能在清单中指定一个数据库
  • 如何垂直对齐段落中的文本?

    我想知道如何对齐文本p元素垂直居中 这是我的风格 p event desc font bold 12px Helvetica Neue Helvetica Arial sans serif line height 14px height 3
  • Pygame碰撞代码

    首先 我必须说我是法国人 这样你就明白为什么我会犯所有这些错误 哈哈 我正在使用 python pygame 和 pymunk 开发一个物理游戏 一个球 我称之为 X 必须到达 Y 点 这是一款平台游戏 2d 游戏 为了帮助球到达 Y 点