如何在不影响其他人的情况下冻结 pygame 中的特定实例
How to freeze specific instance in pygame without affecting others
我正在使用 pygame 开发一个火车模拟器(只使用一个矩形来表示火车)我有一个 class 火车并且这个 class 有一个停止功能来停止每个车站的列车(由 x 坐标定义):
def stop(self):
current_time = pg.time.get_ticks()
while pg.time.get_ticks() - current_time < self.stopping_Time:
continue
pass
这个实现适用于一个火车实例,但我的问题是,当添加更多火车时,如果一个实例停在它的车站,所有其他火车实例都会停止,即使它们不在那个车站!
我也试过这个实现,但没有用:
def stop(self):
while self.stopping_Time> 0:
self.stopping_Time -= 1
pass
这个答案对我也不起作用:
是不是多线程的问题?我是否需要为每个火车实例创建一个线程,以便它们可以独立执行停止功能?
或者我如何为这个函数使用多处理技巧?
这是我的整列火车class:
class train(object):
"""docstring for train"""
def __init__(self, x, y, width, height, vel):
self.x = x
self.y = y
self.width = width
self.height = height
self.vel = vel
self.right = True
self.left = False
self.headway = 20
self.stopping_Time = 2500
self.capacity = 200
self.start_time = pg.time.get_ticks()
def draw(self, win):
#trains
pg.draw.rect(win, (255,0,0), (self.x, self.y, self.width, self.height))
def stop(self):
self.current_time = pg.time.get_ticks()
while pg.time.get_ticks() - self.current_time < self.stopping_Time:
continue
pass
def move(self):
if self.right:
if self.x == 235 or self.x == 510 or self.x == 1295:
self.stop()
if self.x == 1295:
self.right = False
self.left = True
self.x -= self.vel
else:
self.x += self.vel
else:
self.x += self.vel
else:
if self.x == 235 or self.x == 510:
#train.stop = 3 * 100
self.stop()
if self.x == 235:
self.right = True
self.left = False
self.x += self.vel
else:
self.x -= self.vel
else:
self.x -= self.vel
我还有另一个函数,我在其中调用:
for train in op_trains:
train.move()
op_train 是一个包含所有火车实例的列表,一次由一列火车填充。
我强烈建议不要使用 multi-threading/processing 来解决您的这个问题。虽然 multi-threading/processing 可能能够解决您的问题,但引入它可能会使将来难以添加或改进代码,并且很可能会导致更多错误。这个问题可以通过调整代码的设计来解决。
之所以所有的列车同时停止,是因为stop函数中的while循环。
def stop(self):
current_time = pg.time.get_ticks()
while pg.time.get_ticks() - current_time < self.stopping_Time:
continue
pass
这个 while 循环阻塞了主线程,阻止了 pygame 处理其他列车。停止函数是从列车 class 中的移动函数调用的。现在的目标是用一种方法替换这个 while 循环,以跟踪保持火车停止多长时间而不阻塞主线程。
你需要做的是在你的火车中有一个状态class来表示火车是否停止。
def __init__(self, x, y, width, height, vel):
self.x = x
self.y = y
self.width = width
self.height = height
self.vel = vel
self.right = True
self.left = False
self.headway = 20
self.stopping_Time = 2500
self.capacity = 200
self.start_time = pg.time.get_ticks()
# new attributes
self.stopped = False
self.stopped_time = None
要停止火车,切换状态并记下停止开始的时间。
def stop(self):
self.stopped_time = pg.time.get_ticks()
self.stopped = True
在你的移动函数中,有一个 if 条件来检查这个标志是否为真,如果是,它停止了多长时间。如果它停止的时间足够长,请将标志设置为 False 并继续。我已经继续对函数重新排序并清理了条件。
def move(self):
if self.stopped and pg.time.get_ticks() - self.stopped_time < self.stopping_Time:
return
self.stopped = False
if self.right:
self.x += self.vel
else:
self.x -= self.vel
if self.x == 235 or self.x == 510 or self.x == 1295:
self.stop()
if self.x == 235:
self.right = True
self.left = False
elif self.x == 1295:
self.right = False
self.left = True
注意没有循环。
此代码假定您对 train.move()
的调用处于某种主事件循环中,它会不断被调用。
我正在使用 pygame 开发一个火车模拟器(只使用一个矩形来表示火车)我有一个 class 火车并且这个 class 有一个停止功能来停止每个车站的列车(由 x 坐标定义):
def stop(self):
current_time = pg.time.get_ticks()
while pg.time.get_ticks() - current_time < self.stopping_Time:
continue
pass
这个实现适用于一个火车实例,但我的问题是,当添加更多火车时,如果一个实例停在它的车站,所有其他火车实例都会停止,即使它们不在那个车站!
我也试过这个实现,但没有用:
def stop(self):
while self.stopping_Time> 0:
self.stopping_Time -= 1
pass
这个答案对我也不起作用:
是不是多线程的问题?我是否需要为每个火车实例创建一个线程,以便它们可以独立执行停止功能? 或者我如何为这个函数使用多处理技巧?
这是我的整列火车class:
class train(object):
"""docstring for train"""
def __init__(self, x, y, width, height, vel):
self.x = x
self.y = y
self.width = width
self.height = height
self.vel = vel
self.right = True
self.left = False
self.headway = 20
self.stopping_Time = 2500
self.capacity = 200
self.start_time = pg.time.get_ticks()
def draw(self, win):
#trains
pg.draw.rect(win, (255,0,0), (self.x, self.y, self.width, self.height))
def stop(self):
self.current_time = pg.time.get_ticks()
while pg.time.get_ticks() - self.current_time < self.stopping_Time:
continue
pass
def move(self):
if self.right:
if self.x == 235 or self.x == 510 or self.x == 1295:
self.stop()
if self.x == 1295:
self.right = False
self.left = True
self.x -= self.vel
else:
self.x += self.vel
else:
self.x += self.vel
else:
if self.x == 235 or self.x == 510:
#train.stop = 3 * 100
self.stop()
if self.x == 235:
self.right = True
self.left = False
self.x += self.vel
else:
self.x -= self.vel
else:
self.x -= self.vel
我还有另一个函数,我在其中调用:
for train in op_trains:
train.move()
op_train 是一个包含所有火车实例的列表,一次由一列火车填充。
我强烈建议不要使用 multi-threading/processing 来解决您的这个问题。虽然 multi-threading/processing 可能能够解决您的问题,但引入它可能会使将来难以添加或改进代码,并且很可能会导致更多错误。这个问题可以通过调整代码的设计来解决。
之所以所有的列车同时停止,是因为stop函数中的while循环。
def stop(self):
current_time = pg.time.get_ticks()
while pg.time.get_ticks() - current_time < self.stopping_Time:
continue
pass
这个 while 循环阻塞了主线程,阻止了 pygame 处理其他列车。停止函数是从列车 class 中的移动函数调用的。现在的目标是用一种方法替换这个 while 循环,以跟踪保持火车停止多长时间而不阻塞主线程。
你需要做的是在你的火车中有一个状态class来表示火车是否停止。
def __init__(self, x, y, width, height, vel):
self.x = x
self.y = y
self.width = width
self.height = height
self.vel = vel
self.right = True
self.left = False
self.headway = 20
self.stopping_Time = 2500
self.capacity = 200
self.start_time = pg.time.get_ticks()
# new attributes
self.stopped = False
self.stopped_time = None
要停止火车,切换状态并记下停止开始的时间。
def stop(self):
self.stopped_time = pg.time.get_ticks()
self.stopped = True
在你的移动函数中,有一个 if 条件来检查这个标志是否为真,如果是,它停止了多长时间。如果它停止的时间足够长,请将标志设置为 False 并继续。我已经继续对函数重新排序并清理了条件。
def move(self):
if self.stopped and pg.time.get_ticks() - self.stopped_time < self.stopping_Time:
return
self.stopped = False
if self.right:
self.x += self.vel
else:
self.x -= self.vel
if self.x == 235 or self.x == 510 or self.x == 1295:
self.stop()
if self.x == 235:
self.right = True
self.left = False
elif self.x == 1295:
self.right = False
self.left = True
注意没有循环。
此代码假定您对 train.move()
的调用处于某种主事件循环中,它会不断被调用。