撞到窗口边缘后,移动的矩形会卡住

时间:2016-04-08 02:39:48

标签: python-3.x pygame

我在窗口中间创建了一个矩形,并使用键'w','s','a','d'来移动它。我的问题是每当矩形撞到窗口的边缘时就会卡住并且不能再移动了。

import pygame, sys, time
from pygame.locals import *

class Tile:
    bcolor = pygame.Color('black')
    rcolor = pygame.Color('white')

    def __init__(self, surface):
        self.surface = surface
        self.size = 30
        self.x = self.surface.get_width()//2 - self.size//2
        self.y = self.surface.get_height()//2 - self.size//2
        self.rect = pygame.Rect(self.x, self.y, self.size, self.size)
        self.speed = 10
        self.rcolor = Tile.rcolor
        self.bcolor = Tile.bcolor

    def draw(self):
        pygame.draw.rect(self.surface, self.rcolor, self.rect)

    def moveup(self):
        if self.rect.top < self.speed:
            self.speed = self.rect.top
        self.rect.move_ip(0, -self.speed)

    def movedown(self):
        maxbottom = self.surface.get_height()
        if maxbottom - self.rect.bottom < self.speed:
            self.speed = maxbottom - self.rect.bottom
        self.rect.move_ip(0,self.speed)

    def moveleft(self):
        if self.rect.left < self.speed:
            self.speed = self.rect.left
        self.rect.move_ip(-self.speed, 0)

    def moveright(self):
        maxright = self.surface.get_width()
        if maxright - self.rect.right < self.speed:
            self.speed = maxright - self.rect.right
        self.rect.move_ip(self.speed, 0)

    def handlekeydown(self, key):
        if key == K_w:
            self.moveup()
        if key == K_s:
            self.movedown()
        if key == K_a:
            self.moveleft()
        if key == K_d:
            self.moveright()
    def update(self):
        self.surface.fill(self.bcolor)
        self.draw()
def main():
    pygame.init()
    pygame.key.set_repeat(20, 20)
    surfacesize = (500,400)
    title = 'Practice'
    framedelay = 0.02
    surface = pygame.display.set_mode(surfacesize, 0, 0)
    pygame.display.set_caption(title)
    tile = Tile(surface)
    gameover = False
    tile.draw()
    pygame.display.update()

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN and not gameover:
                tile.handlekeydown(event.key)
            tile.update()
            pygame.display.update()
            time.sleep(framedelay)
main()

1 个答案:

答案 0 :(得分:0)

看看这段代码:

def moveup(self):
    if self.rect.top < self.speed:
        self.speed = self.rect.top
    self.rect.move_ip(0, -self.speed)

移至屏幕顶部后,self.rect.top变为0,小于self.speed,因此if语句的条件为{{1在下一行中,您将True设置为self.speed,因此您的所有0来电都不会移动move_ip(因为Rect是现在self.speed)。

如果您想阻止0离开屏幕,最好只使用clamp_ip

Rect

(您的代码还存在其他问题,但这是另一个主题。)