在pygame中显示是否颠倒?

0 投票
2 回答
922 浏览
提问于 2025-04-18 02:02

我正在制作一个游戏,里面有一个球应该会在屏幕的边缘反弹。但是看起来显示区域的边界是反向的,因为当球碰到边缘时,代码输出的是另一边的内容(比如,当球碰到底边时,它输出的是'顶部')。

这是我的代码:

import pygame

def coll_side(obj1, obj2, is_obj1_rect, is_obj2_rect):
    if is_obj1_rect:
        rect1 = obj1
    else:
        rect1 = obj1.rect
    if is_obj2_rect:
        rect2 = obj2
    else:
        rect2 = obj2.rect

    tl = rect1.collidepoint(rect2.topleft)
    bl = rect1.collidepoint(rect2.bottomleft)
    tr = rect1.collidepoint(rect2.topright)
    br = rect1.collidepoint(rect2.bottomright)

    if tl and bl:
        side = 'left'
    elif tl and tr:
        side = 'top'
    elif br and tr:
        side = 'right'
    elif br and bl:
        side = 'bottom'
    elif tl:
        side = 'topleft'
    elif tr:
        side = 'topright'
    elif bl:
        side = 'bottomleft'
    elif br:
        side = 'bottomright'
    else:
        side = None    

    print side
    return side

class Ball(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.area = pygame.display.get_surface()
        self.rect = pygame.Rect((295, 455), (10,10))

    def update(self):
        if not self.area.contains(self.rect):
            side = coll_side(self.area.get_rect(), self.rect, True, True)

那么,我的代码有什么问题,还是说pygame的显示区域是反向的呢?

谢谢!

补充:我添加了截图的链接

http://postimg.org/image/dcc3h50k9/

在这种情况下,控制台输出的是'左边'。

2 个回答

2

PyGame教程中提到:

在pygame中,我们总是用(X,Y)坐标来表示位置。这表示要把图像放置在右边多少像素,向下多少像素。

这就是二维计算机图形的标准坐标系统。

1

Rect.collidepoint(x, y) 是用来检查你传入的 x, y 坐标是否在你调用的那个 Rect 矩形内部的。比如说,screen.rect.collidepoint(ball.x, ball.y) 这个代码会返回一个布尔值,意思是“这个矩形 包含这个确切的点吗?

根据 PyGame 的文档:

collidepoint()

测试一个点是否在一个矩形内部

collidepoint(x,y) -> bool

collidepoint((x,y)) -> bool

如果给定的点在矩形内部,就返回真。如果点在右边或底边上,则不算在矩形内部。

换句话说,我觉得这个方法一开始就不是你想要的。你并没有为小球的 rect 设置一个边界;你只是在检查这个矩形里面是否有这四个点中的任何一个。

所以,如果你把 screen.rect 当作 rect1,把 ball.rect 当作 rect2,并且像现在这样使用一系列的 if/elif/elif,那么你列表中的第一个判断——屏幕的矩形是否包含小球矩形的左上角和左下角——通常会返回 True,然后就不会继续检查后面的 elif 了。

如果这个函数的最终目标是判断一个矩形是否完全在另一个矩形内部,你可以使用 obj.rect.contains(obj2.rect),这个方法会根据第二个 Rect 是否完全在第一个里面返回真或假。

撰写回答