2016-04-08 16 views
-2

我在窗口中間創建了一個矩形,並使用'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() 

回答

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語句的條件是True,並在下一行中設置self.speed0,因此您所有的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()) 
... 

(有你的代碼其他一些問題,但這是另一個話題。)