所以,我有一个由shell输入控制的游戏。我遇到的问题是,每当我点击Pygame窗口时,它就会停止响应。它会在我输入更多shell输入后立即响应,但它仍然是我不想发生的事情。游戏的工作方式,以便您可以尝试,只需输入x += (a number)
或y += (a number)
,它就会改变玩家的位置。关于如何防止冻结的任何想法?我尝试使用线程而不是将输入放在while
循环中,但是我无法修改函数中的变量。
import pygame
pygame.init()
display_width = 1366
display_height = 768
gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('A game for teaching python')
black = (0,0,0)
white = (255,255,255)
clock = pygame.time.Clock()
crashed = False
carImg = pygame.image.load('player.png')
def player(x,y):
gameDisplay.blit(carImg, (x,y))
x = (display_width * 0.45)
y = (display_height * 0.8)
x_change = 0
car_speed = 0
while not crashed:
for event in pygame.event.get():
if event.type == pygame.QUIT:
crashed = True
gameDisplay.fill(black)
player(x,y)
pygame.display.update()
clock.tick(60)
exec(input(">>> "))
pygame.quit()
quit()
答案 0 :(得分:1)
我制作的游戏非常类似于此。我所做的是创建一个Player()类,然后使用线程创建一个控制台,以便我可以编辑Player.x和Player.y属性。例如:
class Player():
def __init__(self,startx,starty):
self.x = startx
self.y = starty
#Move method is optional, as you can just edit the x and y attributes
#directly
def move(self,x=0,y=0):
self.x += x
self.y += y
现在,要制作一个好的线程控制台,您需要执行以下操作。
import thread
consoling = False
def threadedConsole():
global consoling
consoling = True
try:
exec(raw_input(">> "))
except Exception as error:
print error
consoling = False
#Game loop
while True:
if not consoling: thread.start_new_thread(threadedConsole,())
#Game stuff
然后你只需在控制台中调用Player.move方法。全局变量在线程中不可编辑,但对象是。对不起凌乱的代码,我只有15岁。
答案 1 :(得分:0)
我想到了两种方式: 第一个是使用线程:一个用于shell,另一个用于pygame程序。 第二个是从窗口获取输入而不是使用shell。 假设你初始化一个名为" number"的变量。在0,您可以将此代码改编为您的代码:
elif i.type == pygame.KEYDOWN:
if i.unicode in [str (i) for i in range(10)]:
number = number * 10 + int (i.unicode)