Pygame的Rect表现出奇怪的行为

时间:2014-06-16 15:48:49

标签: pygame

关于版本的说明:Python 3.4与Pygame 1.9.2 for Python 3.3(但到目前为止效果很好)

我的sidescroller中有瓷砖,由64x64像素组成,看起来有点像这样:

class Tile(object):

    def __init__(self, x, y):
        self.rect = pygame.Rect(x, y, x + 64, y + 64)

(当然这个课程还有更多内容,但现在与这个问题无关)

在程序中,我通过更改其x和y值来更新切片的位置:

def move(self, dx, dy):
    for tile in self.tilelist:
        tile.rect.x += dx
        tile.rect.y += dy

长话短说:只有x和y值发生变化,宽度和高度保持不变,因此矩形的尺寸会改变,而不是它的位置。到目前为止,我有这个解决方法:

def move(self, dx, dy):
    for tile in self.tilelist:
        tile.rect.x += dx
        tile.rect.y += dy
        tile.rect.w = tile.rect.x + 64
        tile.rect.h = tile.rect.y + 64

但这不是我理解矩形文档的这一段: “分配大小,宽度或高度会改变矩形的尺寸;所有其他分配都会移动矩形而不调整其大小” 从这里: http://www.pygame.org/docs/ref/rect.html

我做错了什么?如果不是通过我在那里做的事情,如何更改矩形以移动它?

我很欣赏任何我在这里错误的提示:/谢谢!

专利

//修改

这是我的碰撞检测的代码。根据理论,pygame rects应该如何工作,这也应该如此。它不知何故,但只有当我调整每个帧的w和h值时才会这样做。

def move(self, dx, dy):
    dx *= self.dt * self.speed
    dy *= self.dt * self.speed

    for tile in self.coll_list:
        if dx > 0:          # Moving LEFT
            if self.player.dir != "l":
                self.player.dir = "l"
            if tile.rect.y < self.player.rect.h and \
               tile.rect.h > self.player.rect.y:
                if tile.rect.w + dx > self.player.rect.x and \
                   tile.rect.x < self.player.rect.w:
                    if tile.category == "solid":
                        dx = self.player.rect.x - tile.rect.w
                    elif tile.category == "item":
                        if tile.func != None:
                            _func = eval(tile.func[0])
                            _args = eval(tile.func[1])
                            _func(_args, tile)
        elif dx < 0:        # Moving RIGHT
            if self.player.dir != "r":
                self.player.dir = "r"
            if tile.rect.y < self.player.rect.h and \
               tile.rect.h > self.player.rect.y:
                if tile.rect.x + dx < self.player.rect.w and \
                   tile.rect.w > self.player.rect.x:
                    if tile.category == "solid":
                        dx = self.player.rect.w - tile.rect.x
                    elif tile.category == "item":
                        if tile.func != None:
                            _func = eval(tile.func[0])
                            _args = eval(tile.func[1])
                            _func(_args, tile)
        if dy > 0:          # Moving UP
            if tile.rect.x < self.player.rect.w and \
               tile.rect.w > self.player.rect.x:
                if tile.rect.h + dy > self.player.rect.y and \
                   tile.rect.y < self.player.rect.h:
                    if tile.category == "solid":
                        dy = self.player.rect.y - tile.rect.h
                        if self.player.jumping != 1:
                            self.player.jumping = 1
                    elif tile.category == "item":
                        if tile.func != None:
                            _func = eval(tile.func[0])
                            _args = eval(tile.func[1])
                            _func(_args, tile)
        elif dy < 0:        # Moving DOWN
            if tile.rect.x < self.player.rect.w and \
               tile.rect.w > self.player.rect.x:
                if tile.rect.y + dy < self.player.rect.h and \
                   tile.rect.h > self.player.rect.y:
                    if tile.category == "solid":
                        self.collisions["bottom"] = True
                        dy = self.player.rect.h - tile.rect.y
                    elif tile.category == "item":
                        if tile.func != None:
                            _func = eval(tile.func[0])
                            _args = eval(tile.func[1])
                            _func(_args, tile)

    for category in ["solid", "deco", "actor", "item"]:
        for tile in self.tiles[category]:
            tile.rect.x += dx
            tile.rect.y += dy
            tile.rect.w = tile.rect.x + 64
            tile.rect.h = tile.rect.y + 64

2 个答案:

答案 0 :(得分:0)

假设dxdy应该是相对而非绝对坐标,为什么不使用内置的move函数

def move(self, dx, dy):
    for tile in self.tilelist:
        tile.rect.move_ip(dx, dy)

答案 1 :(得分:0)

wh是宽度和高度,不应该取决于位置。因此:

    tile.rect.x += dx
    tile.rect.y += dy
    tile.rect.w = 64
    tile.rect.h = 64