python-3.x - 为什么我的球员在我的屏幕上走出球场时会出现“连胜”?
问题描述
我的球员移动得很好,直到他们移动到场外,直到图像连续。为什么是这样?
我尝试将 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()
我只需要球员的图像不会出现条纹并停留在屏幕上,并且让他们能够像在球场上一样正常移动。
解决方案
我怀疑您看到这种损坏的原因是代码没有清除背景的那部分。
每一帧(事件循环迭代),“球场”都被重新绘制,但在这之外的只是在主循环开始之前绘制。
例如:
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
我还将字体加载移到了循环之外,不需要每帧都加载它。
推荐阅读
- python - sorted() 自动按元组的第二个元素排序
- encryption - 在 OutSystems 应用中实现 AES/RES 加密解密
- python - Appending specific indices from zipped lists
- jsse - Tomcat8不断显示https-jsse-nio-443-exec日志
- php - 如何在 Symfony 3.4 中获取当前页面 URL
- sql - TableCell 数据传递到另一个 UIViewController
- forms - 使用 VeeValidate 的 VueJS 表单验证,无法在某些移动设备上输入
- excel - 5 个特定单元格的平均值,包括活动行上面的 2 个/下面的 2 个跳过空白而不是包含在范围内
- sql - 从 R 将表写入 SAP HANA 的有效方法
- java - POM PageFactory 中需要吸气剂吗?