Den specifikke undtagelse, du støder på, ser ud til at være relateret til din mongo-forbindelse. Er du i stand til at oprette forbindelse til din database i MongDB Compass?
Under alle omstændigheder vil din nuværende arkitektur gøre din spilløkke afhængig af databaseskrivningerne, hvilket kan tage betydelig tid.
Jeg har lavet et eksempel, der bruger en separat tråd til at styre MongoDB-forbindelsen og kommunikerer med hovedtråden ved hjælp af en kø. Dette eksempel inkluderer også billedhastigheden i titellinjen og begrænser spilløkken til tres FPS. Hvis du føjer det til dit eksisterende script, bør du se billedhastigheden falde, hver gang der sker en databaseindsættelse.
import time
import threading
import queue
import pygame
import pymongo
# Thread for Database storage
class MongoThread(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
self.daemon = True
def run(self):
t_running = True
client = pymongo.MongoClient("mongodb+srv://<insert-your-connection-string-here>")
db = client.test
c = db.scores
while t_running:
if self.queue.empty():
time.sleep(0.1)
pass
else:
data = self.queue.get()
if data == "exit":
t_running = False
else:
# do something with the queud data
c.insert_one(data)
print(c.count_documents({})) # for debugging
WIDTH, HEIGHT = 1000, 400
FPS = 60
# create a queue to send commands from the main thread
q = queue.Queue()
# create and then start the thread
mongo_thread = MongoThread(q)
mongo_thread.start()
pygame.init()
win = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
run = True
score = 0
while run:
for e in pygame.event.get():
if e.type == pygame.QUIT:
run = False
q.put("exit")
if e.type == pygame.KEYDOWN:
# c.insert_one({"Score": score})
q.put({"Score": score})
score += 1
win.fill((0, 0, 0))
pygame.display.update()
pygame.display.set_caption(f"FPS: {clock.get_fps():.1f}")
clock.tick(FPS)
pygame.quit()