resueltos programacion poo otra orientada objetos multiple metodo llamar lista importar herencia ejercicios ejemplo clases clase python class attributes pygame

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.