问题
I am making a game about falling circles and the player, which is basically a square, has to avoid them. The code is almost done but I have a problem with how to add a stopwatch to the game on the window? I have no idea where to put this type of code can anyone help me? I have all of the code done except for the stopwatch.
import pygame
from pygame.locals import *
import os
import random
import math
import sys
import time
white = (255,255,255)
blue = (0,0,255)
gravity = 10
size =10
height = 500
width =600
varHeigth = height
ballNum = 5
eBall = []
apGame = pygame.display.set_mode((width, height))
pygame.display.set_caption("AP Project")
clock = pygame.time.Clock()
class Player(object):
def __init__(self):
red = (255, 0, 0)
move_x = 300
move_y = 400
self.rect = pygame.draw.rect(apGame,red, (move_x, move_y, 10, 10))
self.dist = 10
def handle_keys(self):
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit();
exit()
key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
self.draw_rect(-1, 0)
elif key[pygame.K_RIGHT]:
self.draw_rect(1, 0)
elif key[pygame.K_ESCAPE]:
pygame.quit();
exit()
else:
self.draw_rect(0, 0)
def draw_rect(self, x, y):
red = (255, 0, 0)
black = (0, 0, 0)
'''apGame.fill(black)'''
self.rect = self.rect.move(x * self.dist, y * self.dist);
pygame.draw.rect(apGame, red , self.rect)
pygame.display.update()
def draw(self,surface):
red = (255, 0, 0)
move_x = 300
move_y = 400
pygame.draw.rect(apGame, red, (move_x, move_y, 10, 10))
def show_go_screen():
pygame.font.init()
myfont = pygame.font.SysFont("Comic Sans MS", 30)
label = myfont.render("Game Over", 1, red)
apGame.blit(label, (300,100))
def instuct():
pygame.font.init()
myfont = pygame.font.SysFont("Comic Sans MS", 15)
label = myfont.render("Avoid The Circles", 1, red)
apGame.blit(label, (250,450))
move_x = 300
move_y = 400
red = (255, 0, 0)
black = (0, 0, 0)
player = Player()
clock = pygame.time.Clock()
'''apGame.fill(black)'''
player.draw(apGame)
pygame.display.update()
for q in range(ballNum):
x = random.randrange(0, width)
y = random.randrange(0, varHeigth)
eBall.append([x, y])
while True:
apGame.fill(black)
for i in range(len(eBall)):
ball_rect = pygame.draw.circle(apGame, blue, eBall[i], size)
if player.rect.colliderect(ball_rect):
show_go_screen()
break
eBall[i][1] += 5
if eBall[i][1] > height:
y = random.randrange(-50, -10)
eBall[i][1] = y
x = random.randrange(0, width)
eBall[i][0] = x
instuct()
player.handle_keys()
pygame.display.flip()
clock.tick(30)
回答1:
First of all do not continuously initialize the font module, and do not generate the pygame.font.Font objects every time when you display a text. That is wast of resources and performance. Do it once at initialization:
import pygame
from pygame.locals import *
# [...]
pygame.init()
pygame.font.init()
myfont15 = pygame.font.SysFont("Comic Sans MS", 15)
myfont30 = pygame.font.SysFont("Comic Sans MS", 30)
Use the font objects when a text has to be displayed:
def show_go_screen():
label = myfont30.render("Game Over", 1, red)
apGame.blit(label, (300,100))
def instuct():
label = myfont15.render("Avoid The Circles", 1, red)
apGame.blit(label, (250,450))
Write a function which can display the time, for instance with the accuracy of tenths of a second:
def display_time(time_s):
# time string with tents of seconds
time_str = str(int(time_s*10) / 10)
label = myfont15.render(f"Time : {time_str}", 1, red)
apGame.blit(label, (20, 20))
The exact time time which has passed since the previous frame is returned by pygame.time.Clock.tick in milliseconds. Count the time and use the function to display the time:
time_seconds = 0
while True:
apGame.fill(black)
game_over = False
for i in range(len(eBall)):
ball_rect = pygame.draw.circle(apGame, blue, eBall[i], size)
if player.rect.colliderect(ball_rect):
show_go_screen()
game_over = True
break
eBall[i][1] += 5
if eBall[i][1] > height:
y = random.randrange(-50, -10)
eBall[i][1] = y
x = random.randrange(0, width)
eBall[i][0] = x
instuct()
display_time(time_seconds)
player.handle_keys()
pygame.display.flip()
time_millis = clock.tick(30)
if not game_over:
time_seconds += time_millis / 1000
来源:https://stackoverflow.com/questions/61994805/how-to-add-a-stopwatch-to-pygame