如何在不影响其他人的情况下冻结pygame中的特定实例

巴基亚克

我正在使用pygame开发火车模拟器(仅使用rect来代表火车),我有一个班级火车,这个班级具有停止功能,可以在每个站上停止火车(由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

这个答案也对我不起作用:https : //stackoverflow.com/a/46801334/11334093

是多线程问题吗?我需要为每个火车实例创建一个线程,以便他们可以独立执行停止功能吗?或者如何为该功能使用多处理技巧?

这是我的整个火车课:

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是一个包含所有火车实例的列表,并且一次填充一列火车。

wxker

我强烈建议您不要使用多线程/处理这个问题。尽管多线程/处理可能能够解决您的问题,但引入多线程/处理可能会使其将来很难添加或改进代码,并且很可能会导致更多错误。只需调整代码设计即可解决此问题。

所有列车立即停止的原因是由于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处理其他火车。在火车课程中,从移动功能调用停止功能。现在的目标是用一种跟踪火车保持多长时间而不会阻塞主线程的方式来替换while循环。

您需要做的是在火车班级中设置一个状态,以表示火车是否已停止。

    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条件检查此标志是否为True,如果为True,则将其停止多长时间。如果停止时间足够长,请将标志设置为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()处于某个主事件循环中,在该循环中不断对其进行调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在其他情况下与其他人一起使用variabels

来自分类Dev

在班级中应用样式而不影响其他人LI?

来自分类Dev

在不接触其他人的情况下反应 setState

来自分类Dev

使用ggplot2,如何在高于特定值的情况下裁剪线而又不影响R中的其他线?

来自分类Dev

如何在不影响其他元素的情况下增加中间元素的文字字符

来自分类Dev

如何在不影响其他div的情况下隐藏/显示匿名div

来自分类Dev

每年如何在特定日期向其他人发送提醒

来自分类Dev

在不更改其他人的类的情况下,如何要求它使用我的Scanner版本(作为内部类掩埋)而不是java.util.Scanner?

来自分类Dev

如何在不影响其他浏览器的情况下向IE 10添加<br/>

来自分类Dev

MySQL:如何在不影响其他列的情况下从一列中选择非重复项?

来自分类Dev

如何在不影响具有相同状态的其他元素的情况下更改一个元素的状态?

来自分类Dev

XML中具有相同的前缀和多个名称空间-如何在不影响Python中其他元素的情况下添加元素属性

来自分类Dev

如何在张量流中显式广播张量以匹配其他人的形状?

来自分类Dev

如何在不影响其他绘图的情况下在 html 5 中翻译和旋转绘图?

来自分类Dev

如何在不影响其他表列的情况下调整单个JTable列的大小

来自分类Dev

如何在不影响Javascript其他参数的情况下设置默认参数

来自分类Dev

如何在不影响其他控件(例如gridview)的情况下调用Page.Databind()

来自分类Dev

如何在不影响其他表列的情况下调整单个JTable列的大小

来自分类Dev

如何在不影响文本的情况下删除 <a> </a> 标签?

来自分类Dev

我可以在不授予自己GENERIC_WRITE的情况下拒绝其他人使用FILE_SHARE_WRITE吗?

来自分类Dev

为什么这个Bootstrap不会在打开一个部分的情况下将其他人折叠起来呢?

来自分类Dev

我可以在不影响其他键盘的情况下将特定设备的按键绑定到Linux中的快捷方式吗?

来自分类Dev

无论如何要在同一功能中的其他人之前运行特定的等待动作?

来自分类Dev

如何在不延迟所有其他功能的情况下延迟 Pygame 中的事件?

来自分类Dev

如何在不影响其他行的情况下,使一个物料表列的编辑模式字段类型取决于另一列的值?

来自分类Dev

如何在不影响Primefaces中的输出标签的情况下将inputText设置为必填?

来自分类Dev

如何在不影响非暂存更改的情况下丢弃git中的暂存更改

来自分类Dev

如何在不影响原始数组元素的情况下更改ArrayList中的元素?

来自分类Dev

如何在不影响双击缩放的情况下禁用WebView中的内容触摸。

Related 相关文章

  1. 1

    如何在其他情况下与其他人一起使用variabels

  2. 2

    在班级中应用样式而不影响其他人LI?

  3. 3

    在不接触其他人的情况下反应 setState

  4. 4

    使用ggplot2,如何在高于特定值的情况下裁剪线而又不影响R中的其他线?

  5. 5

    如何在不影响其他元素的情况下增加中间元素的文字字符

  6. 6

    如何在不影响其他div的情况下隐藏/显示匿名div

  7. 7

    每年如何在特定日期向其他人发送提醒

  8. 8

    在不更改其他人的类的情况下,如何要求它使用我的Scanner版本(作为内部类掩埋)而不是java.util.Scanner?

  9. 9

    如何在不影响其他浏览器的情况下向IE 10添加<br/>

  10. 10

    MySQL:如何在不影响其他列的情况下从一列中选择非重复项?

  11. 11

    如何在不影响具有相同状态的其他元素的情况下更改一个元素的状态?

  12. 12

    XML中具有相同的前缀和多个名称空间-如何在不影响Python中其他元素的情况下添加元素属性

  13. 13

    如何在张量流中显式广播张量以匹配其他人的形状?

  14. 14

    如何在不影响其他绘图的情况下在 html 5 中翻译和旋转绘图?

  15. 15

    如何在不影响其他表列的情况下调整单个JTable列的大小

  16. 16

    如何在不影响Javascript其他参数的情况下设置默认参数

  17. 17

    如何在不影响其他控件(例如gridview)的情况下调用Page.Databind()

  18. 18

    如何在不影响其他表列的情况下调整单个JTable列的大小

  19. 19

    如何在不影响文本的情况下删除 <a> </a> 标签?

  20. 20

    我可以在不授予自己GENERIC_WRITE的情况下拒绝其他人使用FILE_SHARE_WRITE吗?

  21. 21

    为什么这个Bootstrap不会在打开一个部分的情况下将其他人折叠起来呢?

  22. 22

    我可以在不影响其他键盘的情况下将特定设备的按键绑定到Linux中的快捷方式吗?

  23. 23

    无论如何要在同一功能中的其他人之前运行特定的等待动作?

  24. 24

    如何在不延迟所有其他功能的情况下延迟 Pygame 中的事件?

  25. 25

    如何在不影响其他行的情况下,使一个物料表列的编辑模式字段类型取决于另一列的值?

  26. 26

    如何在不影响Primefaces中的输出标签的情况下将inputText设置为必填?

  27. 27

    如何在不影响非暂存更改的情况下丢弃git中的暂存更改

  28. 28

    如何在不影响原始数组元素的情况下更改ArrayList中的元素?

  29. 29

    如何在不影响双击缩放的情况下禁用WebView中的内容触摸。

热门标签

归档