0

So, my problem is that I'm trying to draw a rectangle but I keep on getting an error saying that 'pygame.Surface' object has no attribute 'color'. Can someone help me?

Full Error Message

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 Answers1

0

Follow the Python zen explicit is better than implicit.

Often, the first argument of a method is called self. This is nothing more than a convention: the name self has absolutely no special meaning to Python. Note, however, that by not following the convention your code may be less readable to other Python programmers, and it is also conceivable that a class browser program might be written that relies upon such a convention.

Which means you should set the first argument to self, and also you forgot a comma, code should be like this:

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

Have a look at this question Why always add self as first argument to class methods? and Python doc to see more details.

Community
  • 1
  • 1
McGrady
  • 10,869
  • 13
  • 47
  • 69