Прямоугольник в Pygame выиграл ход последовательно - PullRequest
1 голос
/ 12 февраля 2020

Я думал, что этот код вызовет перемещение прямоугольника при нажатии клавиши и остановит его при отпускании, но я должен что-то упустить. Кто-нибудь может увидеть, что не так с этим кодом? Я пытаюсь заставить прямоугольник двигаться, когда я держу ключ, и останавливаться, когда я отпускаю его, как в понг.

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

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вам не нужны события Pygame для такого рода непрерывного движения, просто используйте pygame.key.get_pressed(), который возвращает словарь нажатых клавиш.

В приведенном ниже примере кода я обернул прямоугольник PyGame Rect объект в другой класс. Это позволяет «Веслу» вести данные о местоположении и знать, как рисовать себя на экране.

Пожалуйста, попробуйте этот пример.

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()
0 голосов
/ 12 февраля 2020

В этой строке:

keys = pygame.key.get_pressed()

Вы получаете нажатые клавиши и сохраняете их как keys, но на самом деле вы их нигде не используете.

Далее вы обнаруживаете события нажатия и уменьшения клавиши, но я заметил, что сразу после события нажатия клавиши pygame сгенерирует событие нажатия клавиши вверх, даже если ключ не был отпущен, поэтому вот почему вы видите только небольшое движение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...