programacion - Inicializando el atributo de clase Python
programacion orientada a objetos python pdf (3)
Tengo un siguiente programa con Pygame:
import pygame
import time
pygame.init()
white = (255,255,255)
red = (255,0,0)
gameDisplay = pygame.display.set_mode((600,800))
gameExit = False
x=0
y=0
w=25
h=25
class Shape:
square = pygame.draw.rect(gameDisplay,color,[x,y,w,h])
def __init__(self,color,x,y,w,h):
self.color = color
self.x = x
self.y = y
self.w = w
self.h = h
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
gameDisplay.fill(white)
shape = Shape(white,x,y,w,h)
pygame.display.update()
clock.tick(60)
pygame.quit()
quit()
Quiero inicializar el atributo cuadrado de la clase Shape con init , pero obtengo el siguiente error. NameError: name ''color'' no está definido. ¿Cómo puedo inicializar el atributo cuadrado?
Pruebe el siguiente código. Espero que esto ayude..
import pygame
import time
class Shape:
def __init__(self,color,x,y,w,h):
self.color = color
self.x = x
self.y = y
self.w = w
self.h = h
def draw_rect(self, gameDisplay):
square = pygame.draw.rect(gameDisplay,self.color,
[self.x,self.y,self.w,self.h]
)
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
gameDisplay.fill(white)
pygame.display.update()
clock.tick(60)
def main():
pygame.init()
white = (255,255,255)
red = (255,0,0)
gameDisplay = pygame.display.set_mode((600,800))
gameExit = False
x=0
y=0
w=25
h=25
sobj = shape(white,0,0,25,25)
sobj.draw_rect(gameDisplay)
if __name__ == ''__main__'':
main()
Sugiero reescribir el código de esta manera: solo guarde el color y un pygame.Rect
en la clase Shape
y pygame.Rect
un método de draw
. No tiene sentido tener tu loop principal dentro de la clase Shape
. Ahora puede crear tantas formas como desee y dibujarlas en el ciclo while.
import sys
import pygame
pygame.init()
WHITE = pygame.Color(''white'')
class Shape:
def __init__(self, color, x, y, w, h):
self.color = color
self.rect = pygame.Rect(x, y, w, h)
def draw(self, surface):
pygame.draw.rect(surface, self.color, self.rect)
def main():
game_display = pygame.display.set_mode((600, 800))
shape = Shape(WHITE, 0, 0, 25, 25)
shape2 = Shape(pygame.Color(''sienna1''), 100, 100, 25, 25)
clock = pygame.time.Clock()
game_exit = False
while not game_exit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_exit = True
game_display.fill((40, 40, 40))
shape.draw(game_display)
shape2.draw(game_display)
pygame.display.update()
clock.tick(60)
if __name__ == ''__main__'':
main()
pygame.quit()
sys.exit()
Como nota al margen, los nombres de variables en Python deben escribirse en snake_case
(minúsculas con guiones bajos). Además, use sys.exit()
para salir del juego.
su método init se ejecuta cada vez que crea un objeto de tipo Shape, por ejemplo:
shape = Shape(white,x,y,w,h)
Luego, el método init se ejecuta con los argumentos que ha especificado pasados como parámetros en ese método.
Con tu código escrito tal como está, nunca estarás ejecutando esa línea en particular. Intenta dedentificar el ciclo while para que no esté en la definición de la clase. O, solo para probarlo, intente inicializar la clase como una prueba ejecutando esa línea particular, shape = Shape (blanco, x, y, w, h), por separado.