【问题标题】:A moving rectangle becomes stuck after hitting the edge of the window移动的矩形在碰到窗口边缘后会卡住
【发布时间】:2016-04-08 02:39:47
【问题描述】:

我在窗口中间创建了一个矩形,并使用键'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()

【问题讨论】:

    标签: python-3.x pygame


    【解决方案1】:

    看看这段代码:

    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 语句的条件是True,在下一行你设置@ 987654328@ 到0,因此您所有的move_ip 调用都不会移动Rect(因为self.speed 现在是0)。

    如果你想阻止Rect离开屏幕,最好使用clamp_ip

    ...
    def moveup(self):
        self.rect.move_ip(0, -self.speed)
    
    def movedown(self):
        self.rect.move_ip(0,self.speed)
    
    def moveleft(self):
        self.rect.move_ip(-self.speed, 0)
    
    def moveright(self):
        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()
        self.rect.clamp_ip(pygame.display.get_surface().get_rect())
     ...
    

    (您的代码还有一些其他问题,但这是另一个话题。)

    【讨论】:

      猜你喜欢
      • 2013-12-28
      • 2011-04-23
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2019-09-07
      相关资源
      最近更新 更多