2016-04-08 11 views
-2

Pencerenin ortasında bir dikdörtgen oluşturdum ve onu taşımak için 'w', 's', 'a', 'd' anahtarını kullandım. Benim problemim, dikdörtgenin pencerenin kenarına çarptığı her zaman sıkışır ve artık hareket edemez.Pencerenin kenarına çarptıktan sonra hareketli bir dikdörtgen sıkışır

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() 

cevap

0

Sadece bu kod parçasına bakıp:

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

ekranın üst geçmek kez self.rect.topself.speed daha küçüktür 0, olur, bu yüzden if ifadenin durumdur True ve sonraki satırda self.speed değerini 0 olarak ayarlayın, dolayısıyla tüm move_ip çağrılarınız Rect (self.speed artık 0 olduğundan) hareket etmeyecektir. Ekrana bırakmasını Rect önlemek istiyorsanız

, daha iyi sadece clamp_ip kullanın:

... 
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()) 
... 

(Orada sizin koduyla diğer bazı sorunlar vardır, ama bu başka bir konu.)

İlgili konular