为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3242003 2023-07-18 15:08:13
我对编程相当陌生,我正在构建 Pong 只是一个初学者项目。我编写了以下代码来尝试移动两个拨片,但是当按下向上/向下/w/s 键时,它们都不会移动。然而,在尝试自己调试时,我将其设置为将 x 和 y 值打印到控制台,以查看这是否是问题所在,并且 x 和 y 值正在更新,但我的矩形的坐标没有更新。我确信这是一个相当简单的修复,但我对编程很陌生,只是不知道出了什么问题。这是我的代码:import 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.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 = 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.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()
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

当您更改属性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:height


class 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 pygame

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.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 = 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.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()


查看完整回答
反对 回复 2023-07-18
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号