0

こんにちは、pygame を使ったプログラミングは初めてで、次のコードがあります。

import sys, pygame

pygame.init()
screen = pygame.display.set_mode((800, 368))
background = pygame.image.load("background.png")
background.convert()
screen.blit(background, (0, 0))

speed = [1, 1]
width = 800
height = 368

ball = pygame.image.load("ball.bmp")
ballrect = ball.get_rect()
player1 = pygame.image.load("player1.png")
player1rect = player1.get_rect()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: 
            sys.exit()              

    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.blit(ball, ballrect)
    screen.blit(player1, player1rect)
    pygame.display.update()

しかし、実行するとボールが多すぎて、ボールは1つだけになるはずです。そして、ますます多くのボールが来ます。

4

2 に答える 2

1

パイゲームの専門家ではないので、次のようなことをする必要があると思います

new_ball_rect = ballrect.move(speed)
...
screen.blit(background, ballrect, ballrect) #redraw background over old ball location
screen.blit(ball, new_ball_rect)

古いボールの画像の上に背景を再描画します。

于 2013-07-10T10:44:02.290 に答える
1

Fredrik Håårdは、背景の再描画については正しいです。

screen画像として機能し、呼び出すscreen.blit()とその画像の一部を描画します。ループが繰り返されるwhile 1:と、画像には既にボールのコピーが 1 つ以上あり、現在のコードは単純にボールの別の画像を に描画しますscreen

ボールを移動する前に背景を描画できるため、以前のボールの位置を保持するために新しい変数を追加する必要がありません。

...
while 1:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        sys.exit()

    screen.blit(background, ballrect, ballrect) #redraw background over old ball location
    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.blit(ball, ballrect)
    screen.blit(player1, player1rect)
    pygame.display.update()

または、上記をにscreen置き換えることで、毎回全体を再構築できます。これにより、各「フレーム」の背景が正しいことが保証されますが、大幅に遅くなります。screen.blit(background, ballrect, ballrect)screen.blit(background, (0, 0))

私の好みのアプローチは、長方形のリストを渡すことができることに注意することですpygame.display.update()。これにより、呼び出しがはるかに速く戻ります。while ループに入る前に、最初の全画面表示の更新を必ず行ってください。

...
pygame.display.update()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    old_ballrect = ballrect
    screen.blit(background, old_ballrect, old_ballrect) #redraw background over old ball location
    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.blit(ball, ballrect)
    screen.blit(player1, player1rect)
    pygame.display.update([old_ballrect, ballrect])
于 2013-07-11T17:03:49.840 に答える