1

Python と pygame に問題があります。単純なパドルを左右に動かす方法がわかりません。基本的に私は私の最初のプロジェクトのポン型ゲームに取り組んでいます。

オンラインでいくつかの記事を読んだ後、これを行う方法を考えました。私がこれまでに持っているコードは次のとおりです。

PADDLE_WIDTH = 50
PADDLE_HEIGHT = 10
paddleSpeedX = 0
p1Paddle = pygame.Rect(10, 430, PADDLE_WIDTH, PADDLE_HEIGHT)
PADDLE_COLOR = pygame.color.Color("red")

while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                p1Paddle.right = p1Paddle.left + paddleSpeedX - 10
            if event.key == K_RIGHT:
                p1Paddle.left = p1Paddle.left + paddleSpeedX + 10
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
                pygame.display.update()

    pygame.display.update()

このコードを入力した後、ゲームは実行されますが、まだパドルを左右に動かすことができません。これどうやってするの?

4

2 に答える 2

2

Pygame は、KEYDOWN最初にキーを押したときに一度だけイベントを発生させます。

KEYDOWN残念ながら、それはイベントを発生させ続けることはないので、パドルは 1 回だけけいれんし、左または右のキーを連打し続けない限り、再び動くことはありません。

代わりに、次のように、イベントを受信したときに速度をKEYDOWN設定し、 を取得したときに速度をゼロに戻すことができますKEYUP

while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                p1Paddle.x_velocity = -10
            elif event.key == pygame.K_RIGHT:
                p1Paddle.x_velocity = 10
        if event.type == pygame.KEYUP:
            if event.key in [pygame.K_LEFT, pygame.K_RIGHT]:
                # if either the left or right arrow keys are released
                p1Paddle.x_velocity = 0
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    p1Paddle.x_distance += p1Paddle.x_velocity
    # other stuff here
    # drawing code here
    pygame.display.update()

p1Paddle.left(また、変数名のいくつかを変更しました。なぜなら、何が何であるかを理解できなかったからp1Paddle.rightです。気にしないでください)。

于 2012-07-06T15:39:28.180 に答える
1

コードを機能させるために、いくつかの追加と変更を行いました。各フレーム (ループの反復) で、画面を消去してパドルを再描画する必要があります。これは、左右の矢印が押されたときにパドルが新しい座標で再描画されるようにするためです。LEFT が押されたときに、p1Paddle.right の代わりに p1Paddle.left を変更することに注意してください。

import pygame, sys
from pygame import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Paddle Movement')


PADDLE_WIDTH = 50
PADDLE_HEIGHT = 10
paddleSpeedX = 0
p1Paddle = pygame.Rect(10, 430, PADDLE_WIDTH, PADDLE_HEIGHT)
PADDLE_COLOR = pygame.color.Color("red")

while True:
    # clear screen with black color
    screen.fill( (0,0,0) )

    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_LEFT:
                p1Paddle.left = p1Paddle.left + paddleSpeedX - 10
            if event.key == K_RIGHT:
                p1Paddle.left = p1Paddle.left + paddleSpeedX + 10
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
                pygame.display.update()

    # draw the paddle
    screen.fill( PADDLE_COLOR, p1Paddle );

    pygame.display.update()

よりエレガントなソリューションは以下のとおりです

import pygame, sys
from pygame import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Paddle Movement')


PADDLE_WIDTH = 50
PADDLE_HEIGHT = 10
paddleSpeedX = 0
p1Paddle = pygame.Rect(10, 430, PADDLE_WIDTH, PADDLE_HEIGHT)
PADDLE_COLOR = pygame.color.Color("red")

# clock object that will be used to make the game
# have the same speed on all machines regardless
# of the actual machine speed.
clock = pygame.time.Clock()

while True:
    # limit the demo to 50 frames per second
    clock.tick( 50 );

    # clear screen with black color
    screen.fill( (0,0,0) )

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
            pygame.display.update()

    keys = pygame.key.get_pressed()
    if keys[K_LEFT]:
        p1Paddle.left = p1Paddle.left + paddleSpeedX - 5

    if keys[K_RIGHT]:
        p1Paddle.left = p1Paddle.left + paddleSpeedX + 5

    # draw the paddle
    screen.fill( PADDLE_COLOR, p1Paddle );

    pygame.display.update()

を使用してキーの押下を確認していることに注意してくださいpygame.key.get_pressed()。キーの状態を確認し、イベントの発生を待たないため、スムーズな動きが可能になります。フレーム レートを 50 FPS (フレーム/秒) に制限するクロック オブジェクトを追加しました。

両方のアプローチを試してください。

于 2012-07-06T15:42:22.593 に答える