首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pygame-'pygame.Rect‘对象没有属性'rect’

pygame-'pygame.Rect‘对象没有属性'rect’
EN

Stack Overflow用户
提问于 2020-06-11 21:08:14
回答 2查看 115关注 0票数 1

当circle-a和circle-b发生冲突时,这段代码会打印一条"hit“消息。

但是当我运行它时,我得到了错误"'pygame.Rect‘对象没有’‘rect’属性“。

有什么问题吗?(我假设圆a和圆b不是图像或表面,而仅仅是形状。)

代码语言:javascript
复制
import pygame as pg

pg.init()
screen = pg.display.set_mode((1200, 800))

ax=100
ay=400
bx=500
by=400

while 1:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            sys.exit()
    ax+=1
    bx-=1
    a=pg.draw.circle(screen, [0,0,225], [ax, ay], 10)
    b=pg.draw.circle(screen, [0,0,0], [bx, by], 10)

    if pg.sprite.collide_circle(a,b):
        print("hit")

    pg.display.update()
EN

回答 2

Stack Overflow用户

发布于 2020-06-11 21:24:31

pygame.sprite.collide_circle()旨在与pygame.sprite.Sprite对象一起使用。

在声明中:

代码语言:javascript
复制
if pg.sprite.collide_circle(a,b):

abpygame.Rect对象。因此,abpygame.sprite.collide_circle()的非法参数。

写一个函数来计算e个圆是否相交。

计算圆圆心之间的Euclidean distance。并测试中心点之间的距离是否小于圆的半径之和:

代码语言:javascript
复制
import math 
代码语言:javascript
复制
def collide_circle(c1, r1, c2, r2):
    dist = math.hypot(c1[0]-c2[0], c1[1]-c2[1])
    return dist < r1+r2
代码语言:javascript
复制
if collide_circle(a.center, a.width/2, b.center, b.width/2):
    print("hit")

或者直接从pygame.Rect对象获取函数中的中心点和半径:

代码语言:javascript
复制
def collide_circle(c1, c2):
    r1, r2 = c1.width/2, c2.width/2
    dist = math.hypot(c1.centerx-c2.centerx, c1.centery-c2.centery)
    return dist < r1+r2
代码语言:javascript
复制
if collide_circle(a, b):
    print("hit")

请参见示例:

代码语言:javascript
复制
import pygame as pg
import math 

pg.init()
screen = pg.display.set_mode((1200, 800))

ax, ay = 100, 400
bx, by = 500, 400

def collide_circle(c1, c2):
    r1, r2 = c1.width/2, c2.width/2
    dist = math.hypot(c1.centerx-c2.centerx, c1.centery-c2.centery)
    return dist < r1+r2

while 1:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            sys.exit()

    ax+=1
    bx-=1

    screen.fill((255, 255, 255))
    a=pg.draw.circle(screen, [0,0,225], [ax, ay], 10)
    b=pg.draw.circle(screen, [0,0,0], [bx, by], 10)

    if collide_circle(a, b):
        print("hit")

    pg.display.update()
票数 2
EN

Stack Overflow用户

发布于 2020-06-11 21:32:15

你可以用这个来代替。@Rabbit76提到了错误的原因。

代码语言:javascript
复制
if (math.sqrt((a.x-b.x)**2 + (a.y-b.y)**2))< 20:
    print("hit")

编辑

您可以使用以下函数。

代码语言:javascript
复制
def check_collision(circle1, circle2):
    if (math.sqrt((circle1.x-circle2.x)**2 + (circle1.y-circle2.y)**2)) <= (circle1.size[0] + circle2.size[0])/2:
        return True
    return False

然后

代码语言:javascript
复制
if check_collision(a, b):
    print("hit")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62325191

复制
相关文章

相似问题

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