即使 x 和 y 值正在更新,pygame 也不会通过按键更新draw.rect

我对编程相当陌生,我正在构建 Pong 只是一个初学者项目。我编写了以下代码来尝试移动两个拨片,但是当按下向上/向下/w/s 键时,它们都不会移动。然而,在尝试自己调试时,我将其设置为将 x 和 y 值打印到控制台,以查看这是否是问题所在,并且 x 和 y 值正在更新,但我的矩形的坐标没有更新。我确信这是一个相当简单的修复,但我对编程很陌生,只是不知道出了什么问题。这是我的代码:


import time

pygame.init()

screenW = 800

screenH = 600

win = pygame.display.set_mode((screenW, screenH))

pygame.display.set_caption("Pong")

clock = pygame.time.Clock()

font = pygame.font.SysFont("comicsans", 20)

paddleW = 20

paddleH = 100

ballSpeed = 15


class paddle(object):

    def __init__(self, x, y, width, height):

        self.x = x

        self.y = y

        self.width = width

        self.height = height

        self.pad = (self.x, self.y, self.width, self.height)


    def draw(self, win):

        pygame.draw.rect(win, (255,255,255), self.pad)


class ball(object):

    def __init__(self, x, y, side):

        self.x = x

        self.y = y

        self.side = side

        self.pad = (self.x, self.y, self.side, self.side)


    def draw(self, win):

        pygame.draw.rect(win, (255,255,255), self.pad)


def redrawGameWindow():

    win.fill((0,0,0))

    paddleLeft.draw(win)

    paddleRight.draw(win)

    theBall.draw(win)

    pygame.display.update()




#Main Loop:

paddleLeft = paddle(10, screenH//2, paddleW, paddleH)

paddleRight = paddle(screenW - 10 - paddleW, screenH//2, paddleW, paddleH)

theBall = ball(screenW//2, screenH//2, 30)

run = True

while run:

    clock.tick(30)

    

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            run = False


    keys = pygame.key.get_pressed()


    if keys[pygame.K_UP]:

        print("left up")

        print(paddleRight.y)

        paddleRight.y -= ballSpeed


    elif keys[pygame.K_DOWN]:

        print("left down")

        print(paddleRight.y)

        paddleRight.y += ballSpeed


    elif keys[pygame.K_w]:

        print("right up")

        print(paddleLeft.y)

        paddleLeft.y -= ballSpeed


    elif keys[pygame.K_s]:

        print("right down")

        print(paddleLeft.y)

        paddleLeft.y += ballSpeed


    redrawGameWindow()



pygame.quit()


慕妹3242003
浏览 127回答 1
1回答

回首忆惘然

当您更改属性x和时y,列表的内容pad不会神奇地改变。在绘图之前,您必须更新.pad。例如:class paddle(object):    # [...]    def draw(self, win):        self.pad = (self.x, self.y, self.width, self.height)        pygame.draw.rect(win, (255,255,255), self.pad)无论如何,我建议使用对象而pygame.Rect不是属性x、y和width:heightclass paddle(object):    def __init__(self, x, y, width, height):        self.rect = pygame.Rect(x, y, width, height)    def draw(self, win):        pygame.draw.rect(win, (255,255,255), self.rect)class ball(object):    def __init__(self, x, y, side):        self.rect = pygame.Rect(x, y, side, side)    def draw(self, win):        pygame.draw.rect(win, (255,255,255), self.rect)完整示例:import pygameimport timepygame.init()screenW = 800screenH = 600win = pygame.display.set_mode((screenW, screenH))pygame.display.set_caption("Pong")clock = pygame.time.Clock()font = pygame.font.SysFont("comicsans", 20)paddleW = 20paddleH = 100ballSpeed = 15class paddle(object):    def __init__(self, x, y, width, height):        self.rect = pygame.Rect(x, y, width, height)    def draw(self, win):        pygame.draw.rect(win, (255,255,255), self.rect)class ball(object):    def __init__(self, x, y, side):        self.rect = pygame.Rect(x, y, side, side)    def draw(self, win):        pygame.draw.rect(win, (255,255,255), self.rect)def redrawGameWindow():    win.fill((0,0,0))    paddleLeft.draw(win)    paddleRight.draw(win)    theBall.draw(win)    pygame.display.update()#Main Loop:paddleLeft = paddle(10, screenH//2, paddleW, paddleH)paddleRight = paddle(screenW - 10 - paddleW, screenH//2, paddleW, paddleH)theBall = ball(screenW//2, screenH//2, 30)run = Truewhile run:    clock.tick(30)        for event in pygame.event.get():        if event.type == pygame.QUIT:            run = False    keys = pygame.key.get_pressed()    if keys[pygame.K_UP]:        print("left up")        print(paddleRight.rect.y)        paddleRight.rect.y -= ballSpeed    elif keys[pygame.K_DOWN]:        print("left down")        print(paddleRight.rect.y)        paddleRight.rect.y += ballSpeed    elif keys[pygame.K_w]:        print("right up")        print(paddleLeft.rect.y)        paddleLeft.rect.y -= ballSpeed    elif keys[pygame.K_s]:        print("right down")        print(paddleLeft.rect.y)        paddleLeft.rect.y += ballSpeed    redrawGameWindow()pygame.quit()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python