Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pygame和Pymunk游戏库非冲突形状_Python_Pygame_Collision_Pymunk - Fatal编程技术网

Python Pygame和Pymunk游戏库非冲突形状

Python Pygame和Pymunk游戏库非冲突形状,python,pygame,collision,pymunk,Python,Pygame,Collision,Pymunk,在我的游戏中,我想创建非碰撞球。这是使用鼠标左键和右键单击创建蓝色和红色球的代码。。然而,正如你们所看到的,尽管我对球进行了分类,并在评论中对它们进行了遮罩,但球还是会发生碰撞 import sys import pygame as pg from pygame.color import THECOLORS import pymunk as pm def to_pygame(p): """Small hack to convert pymunk to pygame coordinat

在我的游戏中,我想创建非碰撞球。这是使用鼠标左键和右键单击创建蓝色和红色球的代码。。然而,正如你们所看到的,尽管我对球进行了分类,并在评论中对它们进行了遮罩,但球还是会发生碰撞

import sys
import pygame as pg
from pygame.color import THECOLORS
import pymunk as pm


def to_pygame(p):
    """Small hack to convert pymunk to pygame coordinates"""
    return int(p[0]), int(-p[1]+600)


pg.init()
screen = pg.display.set_mode((600, 600))
clock = pg.time.Clock()

space = pm.Space()
space.gravity = (0.0, -900.0)

# Walls
static_body = space.static_body
static_lines = [
    pm.Segment(static_body, (111.0, 280.0), (407.0, 246.0), 0.0),
    pm.Segment(static_body, (407.0, 246.0), (407.0, 343.0), 0.0),
    pm.Segment(static_body, (111.0, 420.0), (407.0, 386.0), 0.0),
    pm.Segment(static_body, (407.0, 386.0), (407.0, 493.0), 0.0),
    ]
for idx, line in enumerate(static_lines):
    line.elasticity = 0.95
    if idx < 2:  # Lower lines.
        # The lower lines are in category 2, in binary 0b10.
        line.filter = pm.ShapeFilter(categories=2)
    else:  # Upper lines.
        # The upper lines are in category 1, in binary 0b1.
        line.filter = pm.ShapeFilter(categories=1)
space.add(static_lines)

balls = []
running = True

while running:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            running = False
        elif event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE:
            running = False
        if event.type == pg.MOUSEBUTTONDOWN:
            radius = 15 if event.button == 1 else 30
            mass = 10
            inertia = pm.moment_for_circle(mass, 0, radius, (0,0))
            body = pm.Body(mass, inertia)
            body.position = to_pygame(event.pos)
            shape = pm.Circle(body, radius, (0,0))
            shape.elasticity = 0.95
            if shape.radius > 25:
                # bin(pm.ShapeFilter.ALL_MASKS ^ 1) is '0b11111111111111111111111111111110'
                # That means all categories are checked for collisions except
                # bit 1 (the upper lines) which are ignored.
                #### HOW EVER BALSS COLLIDE
                shape.filter = pm.ShapeFilter(categories=0x1)
                shape.filter = pm.ShapeFilter(mask=pm.ShapeFilter.ALL_MASKS ^ 1)
            else:
                # Ignores category bin(2), '0b11111111111111111111111111111101'
                # All categories are checked for collisions except bit 2 (the lower lines).
                #### HOW EVER BALSS COLLIDE
                shape.filter = pm.ShapeFilter(categories=0x2)
                shape.filter = pm.ShapeFilter(mask=pm.ShapeFilter.ALL_MASKS ^ 2)

            space.add(body, shape)
            balls.append(shape)

    screen.fill(THECOLORS["white"])

    balls_to_remove = []
    for ball in balls:
        if ball.body.position.y < 100:
            balls_to_remove.append(ball)

        p = to_pygame(ball.body.position)
        if ball.radius > 25:
            color = THECOLORS["red"]
        else:
            color = THECOLORS["blue"]
        pg.draw.circle(screen, color, p, int(ball.radius), 2)

    for ball in balls_to_remove:
        space.remove(ball, ball.body)
        balls.remove(ball)

    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 = to_pygame(pv1)
        p2 = to_pygame(pv2)
        pg.draw.lines(screen, THECOLORS["gray29"], False, [p1, p2])

    # Update physics.
    dt = 1.0/60.0
    for x in range(1):
        space.step(dt)

    pg.display.flip()
    clock.tick(50)


pg.quit()
sys.exit()
导入系统 导入pygame作为pg 从pygame.color导入颜色 导入pymunk作为pm def至_pygame(p): “”“将pymunk转换为pygame坐标的小黑客”“” 返回int(p[0]),int(-p[1]+600) 第init页() 屏幕=pg.display.set_模式((600600)) 时钟=pg.time.clock() space=pm.space() 空间重力=(0.0,-900.0) #墙 静态体=空间。静态体 静态_行=[ pm.段(静态_体,(111.0280.0),(407.0246.0),0.0), pm.段(静态_体,(407.0246.0),(407.0343.0),0.0), pm.段(静态_体,(111.0420.0),(407.0386.0),0.0), pm.段(静态_体,(407.0386.0),(407.0493.0),0.0), ] 对于idx,枚举中的行(静态行): 直线弹性=0.95 如果idx<2:#下一行。 #下面的行在类别2中,二进制0b10。 line.filter=pm.ShapeFilter(类别=2) 其他:#上一行。 #上面的行在类别1中,以二进制0b1表示。 line.filter=pm.ShapeFilter(类别=1) 添加(静态_行) 球=[] 运行=真 运行时: 对于pg.event.get()中的事件: 如果event.type==pg.QUIT: 运行=错误 elif event.type==pg.KEYDOWN和event.key==pg.K_转义: 运行=错误 如果event.type==pg.MOUSEBUTTONDOWN: 如果event.button==1,则半径=15,否则为30 质量=10 惯性=圆周的pm力矩(质量,0,半径,(0,0)) 主体=pm主体(质量、惯性) body.position=to_pygame(event.pos) 形状=pm圆(主体,半径,(0,0)) 形状.弹性=0.95 如果shape.radius>25: #bin(pm.ShapeFilter.ALL_MASKS^1)是“0b11111111111111110” #这意味着检查所有类别的碰撞,除了 #忽略的第1位(上面的行)。 ####巴尔斯如何碰撞 shape.filter=pm.ShapeFilter(类别=0x1) shape.filter=pm.ShapeFilter(掩码=pm.ShapeFilter.ALL_掩码^1) 其他: #忽略类别仓位(2),“0B11111111111111101” #除第2位(较低的行)外,检查所有类别是否存在冲突。 ####巴尔斯如何碰撞 shape.filter=pm.ShapeFilter(类别=0x2) shape.filter=pm.ShapeFilter(掩码=pm.ShapeFilter.ALL_掩码^2) 添加(主体、形状) 球。附加(形状) 屏幕填充(颜色[“白色”]) 球到球移除=[] 对于球中球: 如果球体位置y<100: 球到球移除。附加(球) p=比赛(球、身体、位置) 如果球体半径>25: 颜色=颜色[“红色”] 其他: 颜色=颜色[“蓝色”] pg.draw.circle(屏幕、颜色、p、int(球半径)、2) 对于球中球_至_移除: 空间。移除(球,球。体) 球。移除(球) 对于静态线中的线: body=line.body pv1=主体位置+线a旋转(主体角度) pv2=车身位置+直线b旋转(车身角度) p1=对战(pv1) p2=对战(pv2) pg.绘制线条(屏幕、颜色[“灰色29”]、假[p1、p2]) #更新物理学。 dt=1.0/60.0 对于范围(1)内的x: 空间步长(dt) pg.display.flip() 时钟滴答(50) 第页退出 sys.exit() 球不会与墙壁相撞,而是与自身相撞。我只想要不碰撞的球

附言:示例库形状过滤器类:


您需要将球放入它们自己的类别中,然后调整遮罩,以便它们不会与该类别发生碰撞。例如,要关闭大红色球的碰撞,可以将它们放入类别
0b100

shape.filter = pm.ShapeFilter(categories=0b100, mask=pm.ShapeFilter.ALL_MASKS ^ 0b100)

mask=pm.ShapeFilter.ALL_MASKS^0b100
参数意味着应该忽略此类别中的对象。

请发布一条消息。这将使我们更容易帮助您。@skrx我编辑过。请帮助我的朋友:(我的朋友,你知道我怎样才能做到某些对碰撞,但其他非碰撞。?我问了一个新问题,你能检查一下吗?