【问题标题】:Rectangle in pygame won move consistentlypygame中的矩形赢得一致移动
【发布时间】:2020-02-12 04:31:33
【问题描述】:

我认为这段代码会在按下键时导致矩形移动,并在释放键时导致矩形停止移动,但我一定遗漏了一些东西。谁能看到这段代码有什么问题?我试图让它在我按住键时移动一个矩形,当我像乒乓球一样释放它时停止。

import pygame, random, sys
from pygame.locals import *
fpsClock=pygame.time.Clock()
pygame.init()

WINDOWWIDTH = 600
WINDOWHEIGHT = 600
TEXTCOLOR = (255, 255, 255)
BACKGROUNDCOLOR = (0, 0, 255)
FPS = 40
BLACK = (0,0,0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
rectY1 = 300
rectY2 = 300
Y1change = 0
Y2change = 0
keys = pygame.key.get_pressed()

def moveup():
    rectY1 -= 10
pygame.display.set_caption('Pong')
def drawshapes():
    pygame.init()
    DISPLAY=pygame.display.set_mode((600,600),0,32)
    DISPLAY.fill(BLACK)
    pygame.draw.rect(DISPLAY,RED,(18,rectY1,10,120))
    pygame.draw.rect(DISPLAY,RED,(580,rectY2,10,120))
    pygame.draw.ellipse(DISPLAY,BLUE,(300,300,30,30))
drawshapes()

while True:
    for event in pygame.event.get():
        if event.type==QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if (event.key == pygame.K_UP):
                Y1change -= 10

            elif (event.key == pygame.K_DOWN):
                Y1change += 10

            elif (event.key == ord('w')):
                Y2change -= 10

            elif (event.key == ord('s')):
                Y2change += 10             
        if event.type == KEYUP:
            if (event.key == pygame.K_UP):
                Y1change = 0

            elif (event.key == pygame.K_DOWN):
                Y1change = 0

            elif (event.key == ord('w')):
                Y2change = 0

            elif (event.key == ord('s')):
                Y2change = 0

    rectY1 += Y1change
    rectY2 += Y2change
    drawshapes()
    pygame.display.update()






    fpsClock.tick(FPS)
    pygame.display.update()

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    这种连续移动并不需要 Pygame 事件,只需使用 pygame.key.get_pressed() 即可返回当前按下的键的字典。

    在下面的示例代码中,我将一个 PyGame Rect 矩形对象包装到另一个类中。这允许“Paddle”维护位置数据,并知道如何将自己绘制到屏幕上。

    请试试这个例子。

    import pygame
    
    # Window size
    WINDOW_WIDTH    = 400
    WINDOW_HEIGHT   = 400
    WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE
    
    DARK_BLUE = (   3,   5,  54 )
    YELLOW    = ( 255, 250, 205 )
    
    PADDLE_WIDTH = 70
    PADDLE_HEIGHT= 10
    
    ### initialisation
    pygame.init()
    window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
    pygame.display.set_caption("Moveable Rectangle")
    
    
    ### Simple class to hold the position of a moveable rectangle
    ### and keep it on-screen.
    class Paddle:
        def __init__( self, x, y, width, height ):
            self.rect = pygame.Rect( x, y, width, height )
    
        def draw( self, window ):
            """ Draw the paddle on the given surface """
            pygame.draw.rect( window, YELLOW, self.rect, 0 )  # filled rectangle
    
        def move( self, x_delta ):
            """ adjust the position of the paddle by <x_delta> pixels """
            # Change position
            self.rect.x += x_delta
            # Keep it on the screen
            if ( self.rect.x < 0 ):
                self.rect.x = 0
            elif ( self.rect.x + self.rect.width > WINDOW_WIDTH ):
                self.rect.x = WINDOW_WIDTH - self.rect.width
    
    
    
    ### Controls
    # Create a paddle, roughly centred in the window
    player_paddle = Paddle( WINDOW_WIDTH//2, WINDOW_HEIGHT-50, PADDLE_WIDTH, PADDLE_HEIGHT )
    
    ### Main Loop
    clock = pygame.time.Clock()
    done = False
    while not done:
    
        # Handle user-input
        for event in pygame.event.get():
            if ( event.type == pygame.QUIT ):
                done = True
    
        # Movement keys
        keys = pygame.key.get_pressed()
        if ( keys[pygame.K_LEFT] ):
            player_paddle.move( -10 )
        if ( keys[pygame.K_RIGHT] ):
            player_paddle.move( 10 )
    
        # Update the window, but not more than 60fps
        window.fill( DARK_BLUE )
        player_paddle.draw( window )
        pygame.display.flip()
    
        # Clamp FPS
        clock.tick_busy_loop(60)
    
    pygame.quit()
    

    【讨论】:

      【解决方案2】:

      在这一行:

      keys = pygame.key.get_pressed()
      

      您正在按下按键并将它们存储为keys,但实际上您并没有在任何地方使用它们。

      进一步向下,您正在检测按键按下和向上事件,但我注意到,在按键按下事件之后,pygame 会立即生成一个按键向上事件,即使按键尚未被释放,所以这就是为什么你只看到一个小动作。

      【讨论】:

      • 那我该如何解决呢?
      • 好问题 - 我删掉了你的一些代码,但我一直看到你做的同样的行为,在按键之后立即按键。我会再玩一些 - 通常最好从一个最小的示例开始,看看它是否按预期工作。
      • 剥离代码只打开一个窗口并检测键,看来pygame 中的事件不是很可靠,您最好听从其他人的建议并查看当前按键的状态。
      猜你喜欢
      • 2014-12-02
      • 2021-02-06
      • 2016-06-19
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多