【问题标题】:pygame not updating draw.rect with key presses, even though x and y values are being updatepygame 不使用按键更新 draw.rect,即使 x 和 y 值正在更新
【发布时间】:2020-09-06 01:45:11
【问题描述】:

我对编程还很陌生,我正在构建 Pong 只是一个初学者项目。我编写了以下代码来尝试移动两个桨,但是当按下 up/down/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()

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    当您更改属性xy 时,列表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 对象而不是xywidthheight 属性:

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

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多