首页 > 解决方案 > 为什么我的球员在我的屏幕上走出球场时会出现“连胜”?

问题描述

我的球员移动得很好,直到他们移动到场外,直到图像连续。为什么是这样?

我尝试将 screen.fill(OUT) 更改为绘制一个屏幕大小的矩形。

import pygame
import time

pygame.init()

# Define some colors
BLACK = (0, 0, 0)
OUT = (193, 58, 34)
COURT = (69, 150, 81)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
SKIN = (232, 214, 162)

ballspeed = 2

# Create the screen
windowsize = (700, 650)
screen = pygame.display.set_mode(windowsize)
pygame.display.set_caption('Tennis')




# Player Sprites
class Robert(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("Robert_tennis.png")
        self.rect = self.image.get_rect()
        self.rect.center = (400, 575)
        self.speedx = 0
        self.speedy = 0


    def update(self):
        self.speedx = 0
        self.speedy = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -4
        if keystate[pygame.K_RIGHT]:
            self.speedx = 4
        self.rect.x += self.speedx
        if self.rect.right > 700:
            self.rect.right = 700
        if self.rect.right < 0:
            self.rect.left = 0
        if keystate[pygame.K_UP]:
            self.speedy = -5
        if keystate[pygame.K_DOWN]:
            self.speedy = 3
        self.rect.y += self.speedy
        if self.rect.y < 325:
            self.rect.y = 325
        if self.rect.y < 0:
            self.rect.y = 0





class Camden(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("camden_tennis_front.png")
        self.rect = self.image.get_rect()
        self.rect.center = (260, 80)
        self.speedx = 0
        self.speedy = 0


    def update(self):
        self.speedx = 0
        self.speedy = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_a]:
            self.speedx = -6
        if keystate[pygame.K_d]:
            self.speedx = 6
        self.rect.x += self.speedx
        if self.rect.right > 700:
            self.rect.right = 700
        if self.rect.right < 0:
            self.rect.left = 0
        if keystate[pygame.K_w]:
            self.speedy = -7
        if keystate[pygame.K_s]:
            self.speedy = 5
        self.rect.y += self.speedy
        if self.rect.y > 250:
            self.rect.y = 250
        if self.rect.y < 0:
            self.rect.y = 0



class Ball(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("tennisball.png")
        self.rect = self.image.get_rect()
        self.rect.center = (420, 450)
        self.speedx = 0
        self.speedy = 0


    def update(self):
        #Robert's forehand
        if tennisball.rect.colliderect(robert) and tennisball.rect.x > robert.rect.x + 10:
            robert.image = pygame.image.load("Robert_tennis2 (1).png")
            effect = pygame.mixer.Sound('tennisserve.wav')
            effect.play(0)
            robert.rect.y -5
            self.speedy = -8
            self.speedx = 4

        #Robert's backhand
        if tennisball.rect.colliderect(robert) and tennisball.rect.x < robert.rect.x - 10:
            robert.image = pygame.image.load("Robert_tennis2_backhand.png")
            effect = pygame.mixer.Sound('tennisserve.wav')
            effect.play(0)
            robert.rect.y -5
            self.speedy = -7
            self.speedx = -3


        #Camden's forehand
        if tennisball.rect.colliderect(camden) and tennisball.rect.x < camden.rect.x -10:
            camden.image = pygame.image.load("camden_front_forehand.png")
            effect = pygame.mixer.Sound('tennisserve.wav')
            effect.play(0)
            camden.rect.y -5
            self.speedy = 9
            self.speedx = 2

        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_TAB]:
            self.speedx = -7
            self.speedy = -12

        self.speedy = self.speedy * .98
        self.speedx = self.speedx * .978
        self.rect = self.rect.move(self.speedx, self.speedy)


#Add people
all_sprites = pygame.sprite.Group()
robert = Robert()
camden = Camden()
tennisball = Ball()
all_sprites.add(robert)
all_sprites.add(tennisball)
all_sprites.add(camden)

carryOn = True
clock = pygame.time.Clock()


global score
score = 0


screen.fill(OUT)







while carryOn:
    font = pygame.font.Font('freesansbold.ttf', 32)

    camden.update()
    robert.update()
    tennisball.update()

    epsilonComp = .1
    if abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp:
        if tennisball.rect.x != 360 and tennisball.rect.y != 325:
            if time.time() > 1000:
                score = 15
                scorebox = font.render(str(score), True, WHITE, BLACK)
                scoreRect = scorebox.get_rect()
                scoreRect.center = (625, 50)
                screen.blit(scorebox, scoreRect)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            carryOn = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_x:
                carryOn = False



    all_sprites.update()

    #Fill the screen with a sky color

    # Draw the court
    pygame.draw.rect(screen, COURT, [175, 75, 350, 500])

    #outer left line
    pygame.draw.line(screen, WHITE, (175,574), (175,75), 7)

    #outer right line
    pygame.draw.line(screen, WHITE, (525,574), (525,75), 7)

    #top center line
    pygame.draw.line(screen, WHITE, (175, 200), (525,200), 7)

    #top outer line
    pygame.draw.line(screen, WHITE, (175, 78), (525,78), 7)

    #bottom outer line
    pygame.draw.line(screen, WHITE, (175, 571), (525,571), 7)

    #bottom center line
    pygame.draw.line(screen, WHITE, (175, 450), (525,450), 7)

    #center white line
    pygame.draw.line(screen, WHITE, (345,200), (345,450), 7)

    #net
    pygame.draw.line(screen, BLACK, (175,325), (525,325), 10)



    # Update
    all_sprites.draw(screen)
    pygame.display.update()
    clock.tick(60)

pygame.quit()

我只需要球员的图像不会出现条纹并停留在屏幕上,并且让他们能够像在球场上一样正常移动。

标签: python-3.xpygamepygame-surface

解决方案


我怀疑您看到这种损坏的原因是代码没有清除背景的那部分。

每一帧(事件循环迭代),“球场”都被重新绘制,但在这之外的只是在主循环开始之前绘制。

例如:

screen.fill(OUT)   #  <-- HERE - paint the area outside

while carryOn:
    font = pygame.font.Font('freesansbold.ttf', 32)

    # ... rest of loop-body

screen.fill( OUT )to 移到循环内部也会清除背景:

font = pygame.font.Font('freesansbold.ttf', 32)

while carryOn:
    camden.update()
    robert.update()
    tennisball.update()

    # ... Removed code for the sake of brevity

    all_sprites.update()

    # ensure the whole screen is cleared
    screen.fill(OUT)       #  <-- HERE!

    #Fill the screen with a sky color
    # Draw the court
    pygame.draw.rect(screen, COURT, [175, 75, 350, 500])

    # ... etc

我还将字体加载移到了循环之外,不需要每帧都加载它。


推荐阅读