如何将PyGame游戏分解为单独的文件?

时间:2019-08-04 08:33:14

标签: python pygame file-management

我每两周向十几位超级聪明的年轻爱好者讲授一次编码课。我们已经介绍了OOP,并使用OOP创建了基于文本的冒险。

现在我打算教PyGame并继续使用对象,并且我想知道是否可以通过将每个对象的代码存储在单独文件中的方式来构建游戏?这真的很整洁,更容易构建上。

对于下面的代码,我尝试为每个对象创建单独的文件。这只是部分成功,因为draw方法永远无法很好地工作,我相信我无法拥有引用同一pygame屏幕的单独文件的问题。

import pygame
import random
import time

# Define some colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0,0,255)

SCREEN_WIDTH = 700
SCREEN_HEIGHT = 500
pygame.init()

class Paddle:
    '''Class to keep players location'''
    def __init__(self,x=350, y=480, width =70,height=20):
        self.x = x
        self.y = y
        self.change_x = 0
        self.change_y = 0
        self.width = width
        self.height = height
        self.score = 0

    def move(self):
        self.x += self.change_x
        self.y += self.change_y

    def draw(self):
        pygame.draw.rect(screen, BLUE, [self.x,self.y, self.width, self.height])

    def check_collision(self,ball):
        if ball.y>460:
            if abs(35+ self.x - ball.x) < 30:
                self.score += 1
                ball.draw(BLUE)
                ball.y = 0
                ball.x = random.randint(0,650)
                ball.change_y = random.randint(2,3+int(self.score/5))

class Ball:
    """Class to keep track of a ball's location and vector."""
    def __init__(self,x=350,y=250,size=25):
        self.x = x
        self.y = y
        self.change_x = 0
        self.change_y = 0
        self.size = size

    def move(self):
        self.x += self.change_x
        self.y += self.change_y

    def draw(self,colour = WHITE):
        pygame.draw.circle(screen,WHITE, [self.x, self.y], self.size)


# Set the height and width of the screen
size = [SCREEN_WIDTH, SCREEN_HEIGHT]
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Bouncing Balls")
done = False
clock = pygame.time.Clock()
screen.fill(BLACK)
ball = Ball()
player = Paddle()
ball.change_y = 2
ball.draw()

while not done:
    screen.fill(BLACK)
    # --- Event Processing
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                pass
            if event.key == pygame.K_LEFT:
                player.change_x = -5
            if event.key == pygame.K_RIGHT:
                player.change_x = 5
        else:
            ball.change_x = 0
            player.change_x = 0

    if ball.y > 500:
        print('YOUR SCORE: ',player.score)
        time.sleep(2)
        pygame.quit()
    #move ball and player and check if they collide
    ball.move()
    player.move()
    player.check_collision(ball)
    #draw ball and player
    ball.draw()
    player.draw()

    #render frame
    clock.tick(60)
    pygame.display.flip()

# Print score and exit
print('YOUR SCORE: ',player.score)
pygame.quit()

当我有单独的文件时,这是与屏幕有关的错误

  
line 20, in draw
   pygame.draw.circle(screen,WHITE, [self.x, self.y], self.size)
NameError: name 'screen' is not defined

1 个答案:

答案 0 :(得分:2)

在类surfacedraw()的{​​{1}}方法中添加一个Paddle参数,并在传递给该方法的表面上绘制对象:

Ball
class Paddle:
    # [...]

    def draw(self, surface):
        pygame.draw.rect(surface, BLUE, [self.x,self.y, self.width, self.height])

现在,您可以在所需的任何pygame.Surface上绘制对象,例如class Ball: # [...] def draw(self, surface, colour = WHITE): pygame.draw.circle(surface, colour, [self.x, self.y], self.size)

screen