'pygame.Surface'对象没有属性'color'

时间:2017-04-23 04:23:33

标签: python pygame pygame-surface

所以,我的问题是我正在尝试绘制一个矩形,但我继续收到错误说'pygame.Surface' object has no attribute 'color'。有人能帮助我吗?

完整错误消息

Traceback (most recent call last):
File "main.py", line 64, in <module>
    game.new()
  File "main.py", line 23, in new
    self.run()
  File "main.py", line 32, in run
    self.draw()
  File "main.py", line 55, in draw
    self.snake.draw(self.screen)
  File "C:\Users\sidna\Dropbox\Dev Stuff\Games\Snake\sprites.py", line 15, in draw
    pygame.draw.rect(screen, self.color
AttributeError: 'pygame.Surface' object has no attribute 'color'

Sprites.py

import pygame


class Snake():
    def __init__(self):
        self.x = 0
        self.y = 0
        self.w = 10
        self.h = 10
        self.velX = 1
        self.velY = 0
        self.color = (0, 0, 0)

    def draw(screen, self):
        pygame.draw.rect(screen, self.color
                         (self.x, self.y, self.w, self.h))

    def animate(self):
        self.x = self.x + self.velX
        self.y = self.y + self.velY

Main.py

from settings import *
from sprites import *

import pygame
import random


class Game:
    def __init__(self):
        # initialize game window, etc

        pygame.init()
        pygame.mixer.init()
        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption(TITLE)
        self.clock = pygame.time.Clock()
        self.running = True

    def new(self):
        # start a new game

        self.snake = Snake()
        self.run()

    def run(self):
        # Game Loop

        self.playing = True
        while self.playing:
            self.clock.tick(FPS)
            self.events()
            self.draw()
            self.animate()
            self.update()

    def update(self):
        # Game Loop - Update

        pygame.display.update()

    def events(self):
        # Game Loop - events

        for event in pygame.event.get():
            # check for closing window
            if event.type == pygame.QUIT:
                if self.playing:
                    self.playing = False
                self.running = False

    def draw(self):
        # Game Loop - draw

        self.screen.fill((255, 255, 255))
        self.snake.draw(self.screen)

    def animate(self):
        self.snake.animate()


game = Game()

while game.running:
    game.new()

pygame.quit()

1 个答案:

答案 0 :(得分:0)

遵循Python zen 显式优于隐式

  

通常,方法的第一个参数称为 self 。这不重要   不仅仅是一个惯例:名称self绝对没有特别之处   意思是Python。但请注意,不遵守惯例   你的代码可能对其他Python程序员来说不太可读,而且确实如此   也可以想象,可以编写类浏览器程序   依赖于这样的惯例。

这意味着您应该将第一个参数设置为self,并且您忘记了comma,代码应该是这样的:

def draw(self,screen):
    pygame.draw.rect(screen, self.color,(self.x, self.y, self.w, self.h))

请查看此问题Why always add self as first argument to class methods?Python doc以查看更多详情。