python - 为什么我的记分牌没有在 pygame 中更新?
问题描述
我正在为我的网球比赛制作记分牌。为什么球停止时它不更新?
我试过改组缩进,删除 for 循环。
while carryOn:
font = pygame.font.Font('freesansbold.ttf', 32)
screen.fill(OUT)
camden.update()
robert.update()
tennisball.update()
epsilonComp = .1
stops = []
ballstop = abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp
if abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp:
stops.append(1)
if sum(stops) == 2:
score = 15
elif sum(stops) == 3:
score = 30
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()
# Update
all_sprites.draw(screen)
pygame.display.update()
clock.tick(60)
pygame.quit()
当球停止时它应该更新为 15,然后当它再次停止时更新为 30。如果有人能解决这个问题,我可以解决剩下的分数。
解决方案
条件if sum(stops) == 2:
永远不会满足,因为stops
在每一帧中都进行了初始化。sum(stops)
永远不会超过1。stops = []
在主循环之前做:
stops = []
while carryOn:
# [...]
#stops = [] <---- DELETE this
ballstop = abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp
if abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp:
stops.append(1)
if sum(stops) == 2:
score = 15
elif sum(stops) == 3:
score = 30
可能条件if sum(stops) == 2:
是错误的,它必须是if sum(stops) == 1:
。但这取决于你的游戏逻辑。如果球在开始时处于“停止”状态,那么if sum(stops) == 2:
将是正确的。
根据评论:
当球停止时,您必须设置一个状态ball_is_stopped = True
。在评估球是否停止的条件下,您必须评估此状态,以便球的停止不会导致得分:
if not ball_is_stopped and ....
ball_is_stopped = True
当球开始移动时,您必须重置状态,以便下一站可以增加分数。通过 初始化状态True
,因为一开始球是停止的,但分数不应该增加。
if abs(tennisball.speedx) > epsilonComp and abs(tennisball.speedy) > epsilonComp:
ball_is_stopped = False
此外,没有必要,即stops
一个列表,一个计数器就完全足够了。只要count
小于 3,就增加计数器。
stops = stops+1
if stops == 4:
stops = 0
增加分数的完整代码可能如下所示:
scores = [0, 15, 30, 40]
stops = 0
games = 0
ball_is_stopped = True
while carryOn:
# [...]
epsilonComp = .1
is_moving = abs(tennisball.speedx) > epsilonComp or abs(tennisball.speedy) > epsilonComp
if is_moving:
ball_is_stopped = False
if not ball_is_stopped and not is_moving:
ball_is_stopped = True
stops = stops+1
if stops == 4:
stops = 0
games += 1
score = scores[stops]
推荐阅读
- vb.net - 如何在我的 vb 代码中将 psiphon-tunnel-core.exe 作为后台进程运行?
- python - 如何(正确)在 Kubernetes 上部署 MongoDB 并从另一个 Pod/Job 访问它?
- javascript - 如何仅使用 Pure JS 而不是使用任何库或框架在分页中添加分页数字之间的点?
- image-processing - 是否可以在不将图像渲染到屏幕的情况下收集 pygame 游戏板的图像矩阵?
- postgresql - Can psql output a description of all tables, but only tables?
- latex - 一个接一个地显示向量的条目
- javascript - 如何设置条件以从 Javascript 对象中删除属性?
- python-3.x - python :- IndexError: 将列表转换为字典时列表索引超出范围
- xml - 向 XSLT 1.0 中的非根节点添加新名称空间
- javascript - ER_ACCESS_DENIED_ERROR CloudSQL