Python - Pygame - Класс __init___ вопрос / Не рисует - PullRequest
0 голосов
/ 30 августа 2018

Я изучаю ООП, и у меня есть несколько вопросов. Когда вызывается initiliazer, автоматически ли обрабатывается код? Потому что, если это так, я не понимаю, почему моя игра не рисует прямоугольник, я прошу его нарисовать в init часть класса игрока. Я очень плохо знаком с ООП и поэтому не уверен в том, что делаю, в некоторой степени. Вот мой код:

import pygame

white = (255, 255, 255)
black = (0, 0, 0)

class Game():
    width = 800
    height = 600
    screen = pygame.display.set_mode((width, height))
    def __init__(self):
        pass
    def fill_screen(self, color):
        self.color = color
        self.screen.fill(self.color)

class Player(pygame.sprite.Sprite):
    lead_x = 800/2
    lead_y = 600/2
    velocity = 0.002
    block_size = 10
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.draw.rect(game.screen, black, [self.lead_x, self.lead_y, self.block_size, self.block_size])

    def move_player_x_left(self):
        self.lead_x += -self.velocity

    def move_player_x_right(self):
        self.lead_x += self.velocity

    def move_player_y_up(self):
        self.lead_y += -self.velocity

    def move_player_y_down(self):
        self.lead_y += self.velocity

game = Game()
player = Player()

exitGame = False
while not exitGame:
    game.fill_screen(white)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exitGame = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                player.move_player_y_up()
            if event.key == pygame.K_s:
                player.move_player_y_down()
            if event.key == pygame.K_d:
                player.move_player_x_right()
            if event.key == pygame.K_a:
                player.move_player_x_left()
    pygame.display.update()
pygame.quit()
quit()

1 Ответ

0 голосов
/ 30 августа 2018

Вы постоянно заполняете экран белым в своей основной петле. Класс Player опирается только на __init__. Это означает, что прямоугольник рисуется на долю секунды, а затем покрывается белым.

Ваше предположение о том, что код в __init__ вызывается автоматически, верно. Эти методы с двойным подчеркиванием в особых случаях вызываются python, они называются магическими методами. Вы можете найти их список здесь .

def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    # The rect drawing part was moved from here.
def update(self):
    # You were previously assigning this to a variable, this wasn't necessary.
    pygame.draw.rect(game.screen, black, [self.lead_x, self.lead_y, self.block_size, self.block_size])

Вам нужно будет вызвать новый метод обновления в основном цикле после заполнения экрана.

while True:
    game.fill_screen(white)
    player.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...