如何在pygame中绘制在我更新游戏显示时不会被删除的形状?

2024-04-28 10:18:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python和pygame制作我自己的brick breaker版本,我发现每次运行主循环时,我的计算机都很难绘制出构成关卡的每个砖块。我需要知道如何绘制它们,并保持绘制,直到我真的需要更新它们

import pygame
from random import randint
pygame.init()
pygame.mouse.set_visible(True)

#Time
FPS = 60
clock = pygame.time.Clock()

#Colors
black = (0, 0, 0)
grey = (127, 127, 127)
white = (255, 255, 255)

#Display
displayInfo = pygame.display.Info()

displayWidth = displayInfo.current_w - 200
displayHeight = displayInfo.current_h - 100

borderB = 10
borderS = 1

gameDisplay = pygame.display.set_mode((displayWidth, displayHeight)) #,pygame.FULLSCREEN)
pygame.display.set_caption("Brick Breaker")
gameDisplay.fill(white)
pygame.display.update()

#Blocks
blocks = []
blockSize = 20
blockCount = 20
speed = int(blockSize / 2)


"""Classes"""

#Player
class Player():
    def __init__(self):
        #Size
        self.width = blockSize * 5
        self.height = blockSize

        #Pos
        self.x = displayWidth / 2 - self.width / 2
        self.y = displayHeight - borderB - self.height

    def move(self):
        mousePos = pygame.mouse.get_pos()
        #Check border left
        if not mousePos[0] >= borderS:
            mousePos = (borderS, mousePos[1])
        #Check border right
        elif not mousePos[0] + self.width <= displayWidth - borderS:
            mousePos = (displayWidth - borderS - self.width, mousePos[1])

        self.x = mousePos[0]

class Block():
    def __init__(self, x = 0, y = 0):
        #Size
        self.width = blockSize * 2
        self.height = blockSize

        #Position
        self.x = x
        self.y = y

    def giveDetails(self):
        print(self.x, self.y, self.width, self.height)


class Ball():
    def __init__(self):
        self.radius = int(blockSize / 2)
        self.width = blockSize

        #Co-ordinates
        self.x = int(playerBoard.x + playerBoard.width / 2)
        self.y = int(playerBoard.y - self.radius)

        self.yChange = - speed
        self.xChange = 10

    def move(self):
        if self.x - self.radius + borderS <= 0 or self.x + self.radius >=     displayWidth - borderS:
            self.xChange *= -1
        if self.y - self.radius <= 0 or self.y + self.radius >=     displayHeight - borderB:
            self.yChange *= -1  

        self.x += self.xChange
        self.y += self.yChange



"""Functions"""

def create_level():
    global blocks
    blocks = []
    xPos = blockSize
    yPos = blockSize

    #Down, across
    accross = int((displayWidth - blockSize * 2 - borderS * 2) / (blockSize     * 2 + 2))
    levelData = [1, accross]
    for row in range(levelData[0]):
        yPos += blockSize + 1
        xPos = blockSize
        for num in range(levelData[1]):
            xPos += blockSize * 2 + 1
            _ = Block(xPos, yPos)
            _.name = "block" + str(num)
            blocks.append(_)


def main_loop():
    global playerBoard, ball
    gameExit = False
    pygame.mouse.set_visible(False)

    playerBoard = Player()
    ball = Ball()
    #This creates a list called 'blocks' with all the block objects
    create_level()

    while not gameExit:
       for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True
                break
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    menu()
                    gameExit = True
                    break
            if event.type == pygame.MOUSEMOTION:
                playerBoard.move()

        ball.move()

        gameDisplay.fill(white) #Clear Screen

        #Draw Player
        pygame.draw.rect(gameDisplay, grey, (playerBoard.x, playerBoard.y, 
    playerBoard.width, playerBoard.height))

        """Draw Blocks, this is where the main problem is as it runs this     loop 100 
    times or so as there are about 100 blocks. This obviously means that the 
    display.update has a hard time."""

        for item in blocks:
            pygame.draw.rect(gameDisplay, black, (item.x, item.y,     item.width, item.height))

        #Draw ball
        pygame.draw.circle(gameDisplay, black, (ball.x, ball.y), ball.radius)

        pygame.display.update()

        clock.tick(FPS)

main_loop()

pygame.quit()
quit()

Tags: selfifdefdisplaywidthpygameblocksball