Pygame窗口冻结与shell输入

时间:2015-03-24 15:43:42

标签: python pygame python-3.4

所以,我有一个由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()

2 个答案:

答案 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)