2017-02-13 1 views
0

Я пытаюсь создать спрайт круга, который будет находиться в окне, которое будет иметь стены слева и справа от экрана. Я не могу заставить class Player работать как круг, но я могу заставить его работать как квадрат. Попытавшись исправить это в течение 20-и-часов, я чертовски склонен, чтобы заставить круг работать ... Или, по крайней мере, понять, почему мой код терпит неудачу.Circle sprite создает объект 'Player' не имеет атрибута 'rect' error в Python

import pygame 

pygame.init() 

black = (0,0,0) 
white = (255,255,255) 
gray = (105,105,105) 
red = (255,0,0) 

class Barrier(pygame.sprite.Sprite): #Barriers will be walls and "floors" 

    def __init__(self,x,y,width,height,color): 
     super().__init__() 
     self.image = pygame.Surface([width, height]) 
     self.image.fill(color) 
     self.rect = self.image.get_rect() 
     self.rect.y = y 
     self.rect.x = x 

class Player(pygame.sprite.Sprite): #player will be a circle 

    def __int__(self,x,y): 
     super().__init__() 

     self.image = pygame.Surface((50,50)) 
     self.image.fill(white) 

     pygame.draw.circle(self.image, black, (25, 25), 25, 0) 

     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

     self.change_x = 0 
     self.change_y = 0 
     self.barrier = None 

    def changespeed(self, x, y): 
     self.change_x += x 
     self.change_y += y 

    def update(self): 
     self.rect.x += self.change_x 

     block_hit_list = pygame.sprite.spritecollide(self, self.barrier, False) 
     for block in block_hit_list: 
      if self.change_x > 0: 
       self.rect.right = block.rect.left 
      else: 
       self.rect.left = block.rect.right 

     self.rect.y += self.change_y 
     block_hit_list = pygame.sprite.spritecollide(self, self.barrier, False) 

     for block in block_hit_list: 
      if self.change_y > 0: 
       self.rect.bottom = block.rect.top 
      else: 
       self.rect.top = block.rect.bottom 

screen = pygame.display.set_mode((800,480)) 
pygame.display.set_caption("Test") 
background = pygame.Surface(screen.get_size()) 
background = background.convert() 
background.fill(white) 

all_sprite_list = pygame.sprite.Group() 
wall_list = pygame.sprite.Group() #wall will be a vertical Barrier 

wall = Barrier(0,0,10,800,red) 
wall_list.add(wall) 
all_sprite_list.add(wall) 

wall = Barrier(790,0,10,800,red) 
wall_list.add(wall) 
all_sprite_list.add(wall) 

player = Player(50,50) 
player.barrier = wall_list 

all_sprite_list.add(player) 
clock = pygame.time.Clock() 

score = 0 

done = False 

while not done: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 

     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       player.changespeed(-3, 0) 
      elif event.key == pygame.K_RIGHT: 
       player.changespeed(3, 0) 
      elif event.key == pygame.K_UP: 
       player.changespeed(0, -3) 
      elif event.key == pygame.K_DOWN: 
       player.changespeed(0, 3) 

     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT: 
       player.changespeed(3, 0) 
      elif event.key == pygame.K_RIGHT: 
       player.changespeed(-3, 0) 
      elif event.key == pygame.K_UP: 
       player.changespeed(0, 3) 
      elif event.key == pygame.K_DOWN: 
       player.changespeed(0, -3) 

    all_sprite_list.update() 

    screen.fill(white) 
    all_sprite_list.draw(screen) 
    pygame.display.flip() 

    clock.tick(40) 

pygame.quit() 

Полная ошибка Traceback:

Traceback (most recent call last): 
    File "D:/pyDump/FallGame/freeFALL.py", line 114, in <module> 
    all_sprite_list.update() 
    File "C:\Program Files\Anaconda3\lib\site-packages\pygame\sprite.py", line 462, in update 
    s.update(*args) 
    File "D:/pyDump/FallGame/freeFALL.py", line 43, in update 
    self.rect.x += self.change_x 
AttributeError: 'Player' object has no attribute 'rect' 

Для контекста, я использую PyCharm и питона 3.5 на ПК. Благодаря!

* Edit- грамматика

+2

Вы ошибочно написали «__init__» в своем классе игроков ... – Chris

+0

Вы должны представить это как ответ, чтобы я мог дать вам зеленую галочку, которую вы заслуживаете! – stitcher000

ответ

0

В классе игрока, вы видите, как инициализации междунар. Это означает, что когда объект создается, ни один из кода этого метода не запускается.

Смежные вопросы