Übertragen von Werten zwischen verschiedenen Fenstern in Python mithilfe von Multiprocessing
Posted: 12 Jan 2025, 17:52
Ich bin gerade dabei, ein Spiel ähnlich wie Clicker Heroes in Python zu erstellen, wobei ich Pygame und einige andere Module verwende. Das Problem, das ich habe, ist, dass ich keine Werte zwischen zwei verschiedenen Spielschleifen übertragen kann.
Mein Code lautet wie folgt:
Ich habe versucht, eine Statistikwarteschlange zu implementieren, stellte jedoch fest, dass sie immer dann einfror, wenn ich versuchte, Werte zu übertragen. Diese Version versucht, ein Wörterbuch zu verwenden (wie von ChatGPT vorgeschlagen, bitte tun Sie mir nicht weh), aber jetzt treten nur Fehler auf, wenn ich versuche, das Wörterbuch zu verwenden. Da ich außerdem Multiprocessing verwende, werden keine Fehler mehr ausgegeben, damit ich sehen kann, wo ich einen Fehler gemacht habe.
Mein Code lautet wie folgt:
Code: Select all
import pygame
import random
from colour import Color
import multiprocessing
from pygame._sdl2 import Window
from multiprocessing import Manager
def game(stats):
pygame.init()
colours = list(Color("red").range_to(Color("green"),100)) # list of 100 colour values from red to green
screen = pygame.display.set_mode((600, 600))
stage = 1
killsleft = 5
hpord = 1+(stage*0.1)
chp = round(10**hpord)
mhp = chp
mdown = False
numFont = pygame.font.SysFont("twcen", 60)
gold = 0
dmg = 1
upgcost = 20
island = pygame.image.load("island.png")
centrex = 300
spacing = 110
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
mdown = True
if event.type == pygame.MOUSEBUTTONUP:
mdown = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
pygame.quit()
keyspressed = pygame.key.get_pressed()
#while not statsqueue.empty():
#transfer = statsqueue.get()
#gold = transfer[0]
#dmg = transfer[1]
if mdown: # click
chp -= dmg
mdown = False
if chp < 1: # monster ded
killsleft -= 1
chp = round(10**hpord)
mhp = chp
gold += round(chp/3)
if killsleft = upgcost:
#dmg += 1
#gold -= upgcost
#upgcost = round(upgcost*1.1)
screen.fill((200, 200, 200))
for i in range(-2, 3):
stagenum = stage+i
xpos = centrex + (i*spacing)
if i == 0:
fontsize = 80
islandsize = (70, 70)
else:
fontsize = 50
islandsize = (30, 30)
islandpos = (xpos-islandsize[0]//2, 60) # centre island under stg num
if stage+i-2 > -2:
screen.blit(pygame.transform.scale(island, islandsize), islandpos)
stgFont = pygame.font.SysFont("twcen", fontsize)
stgsdisplay = stgFont.render(str(stagenum), 1, (0, 0, 0))
stagerect = stgsdisplay.get_rect(center=(xpos, 80)) # centre text
screen.blit(stgsdisplay, stagerect)
healthperc = max(0, min(int((chp / mhp) * 100), 99)) # find current % of mhp that chp is
selectedcolour = colours[healthperc]
chpcolour = tuple(int(c * 255) for c in selectedcolour.rgb) # convert to rgb
pygame.draw.rect(screen, (0, 0, 0), (147, 147, 305, 27), 0, 4) # hp bar outline/back
pygame.draw.rect(screen, chpcolour, (150-(chp/mhp), 150, (chp/mhp)*300, 20), 0, 4) # hp bar
chpdisplay = numFont.render("chp:"+str(chp), 1, (0, 0, 0))
killsdisplay = numFont.render("killsleft:"+str(killsleft), 1, (0, 0, 0))
golddisplay = numFont.render("gold:"+str(gold), 1, (0, 0, 0))
upgcostdisplay = numFont.render("upgcost:"+str(upgcost), 1, (0, 0, 0))
dmgdisplay = numFont.render("dmg:"+str(dmg), 1, (0, 0, 0))
screen.blit(chpdisplay, (0, 200))
screen.blit(dmgdisplay, (0, 350))
screen.blit(killsdisplay, (0, 250))
screen.blit(golddisplay, (0, 400))
screen.blit(upgcostdisplay, (0, 300))
#statsqueue.put((gold, dmg))
pygame.display.flip()
def shop(stats): # stats window
pygame.init()
numFont = pygame.font.SysFont("twcen", 60)
shopwindow = pygame.display.set_mode((300, 200))
pygame.display.set_caption("shop")
gold = 0
shopmdown = False
Window.from_display_module().position = [1100, 200]
upgcost = 20
while True:
shopwindow.fill((255, 255, 255))
gold = stats["gold"]
dmg = stats["dmg"]
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
shopmdown = True
if event.type == pygame.MOUSEBUTTONUP:
shopmdown = False
keyspressed = pygame.key.get_pressed()
if shopmdown:
shopmdown = False
if keyspressed[pygame.K_u]: # upg
if gold >= upgcost:
dmg += 1
gold -= upgcost
upgcost = round(upgcost*1.1)
statsqueue.put((gold, dmg))
golddisplay = numFont.render("gold:"+str(gold), 1, (0, 0, 0))
shopwindow.blit(golddisplay, (0, 0))
pygame.display.update()
def main():
multiprocessing.set_start_method("spawn")
statsqueue = multiprocessing.Queue()
manager = Manager()
stats = manager.dict({"gold": 0, "dmg": 1})
gameprocess = multiprocessing.Process(target=game, args=(statsqueue,))
shopprocess = multiprocessing.Process(target=shop, args=(statsqueue,))
gameprocess.start()
shopprocess.start()
gameprocess.join()
shopprocess.join()
if __name__ == "__main__":
main()