关于版本的说明: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
答案 0 :(得分:0)
假设dx
和dy
应该是相对而非绝对坐标,为什么不使用内置的move函数
def move(self, dx, dy):
for tile in self.tilelist:
tile.rect.move_ip(dx, dy)
答案 1 :(得分:0)
w
和h
是宽度和高度,不应该取决于位置。因此:
tile.rect.x += dx
tile.rect.y += dy
tile.rect.w = 64
tile.rect.h = 64