在pygame中显示是否颠倒?
我正在制作一个游戏,里面有一个球应该会在屏幕的边缘反弹。但是看起来显示区域的边界是反向的,因为当球碰到边缘时,代码输出的是另一边的内容(比如,当球碰到底边时,它输出的是'顶部')。
这是我的代码:
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 个回答
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
是否完全在第一个里面返回真或假。