如何阻止Pygame线程引起故障

问题描述 投票:0回答:1

[我正在使用Python和Pygame在Raspberry Pi上创建一个基本上复制1987年NES田径比赛的游戏。

[如果您不熟悉该游戏,只需观看100m的玩法,以了解我在做什么:

[https://youtu.be/_08bJMj21D4?t=34(为方便您在适当的时间设置)]

前进:

[代码和资产主要基于Tech,而Tim则制作了一款侧滑游戏的YouTube视频-我刚刚添加了自己的背景,使其看起来像是精灵在轨道上运行。

https://www.youtube.com/watch?v=PjgLeP0G5Yw

[有一个精灵(代表我)在原地运行(它的x值保持不变),但是背景向左移动/滚动以使该精灵实际上在运行。

[我想做的是使用控制器与以设定速度运行的计算机进行竞争,但是,我想保存来自该竞赛的运行数据,并将其用于计算机,以便下次我玩游戏时,我基本上是在竞速自己。

对于熟悉Mario Kart的人,尤其是时间考验的人,我想与我的幽灵赛跑。

对于那些不是的人,我基本上是想要这个,但是在2D游戏中:https://youtu.be/GzsNfPB6osM?t=19

为了使图片更清晰,我将NES田径运动与Mario卡丁车幽灵数据相结合。在游戏的最终版本中,我将在其中运行1条车道,并且幽灵精灵将与我重叠,并且具有较小的不透明度。

现在,它的工作方式再次表明我运行得更快,我不会改变我的精灵的x位置,而只是增加背景滚动的速度。

另一方面,计算机的x值将不断变化(因为它正在使用我的数据)。我会将这些x值存储在一个列表中,并使用for循环来检索它们,以便当背景由于我的速度而移动时,计算机将在same时间移动,并且如果我不在屏幕上,则可能运行太快或太慢。

为了实现这一点,我不得不在程序中引入线程,这就是我遇到的问题。目标是同时更改背景的速度和计算机的x值,而线程化似乎是最合乎逻辑的解决方案。

[同样,使用Tech和Tim的视频:https://www.youtube.com/watch?v=cdPZ1pJACMI(真是个天才),我设法使计算机精灵在原地运行的同时移动到另一个位置,但是,计算机精灵看起来像是小故障。看看我到目前为止有什么:

https://1drv.ms/v/s!AguDeCI3_EL_5EAThKCAFYAuDq7a

底部的精灵是我以恒定的速度移动,顶部的是幽灵精灵,它不断地改变其x位置。如您所见,我的人运行良好但是计算机出现故障,这是一个问题

[我使用Text Mechanic:https://textmechanic.com/text-tools/numeration-tools/generate-list-numbers/生成了一个大的数字列表,从100到400,将其存储到列表中,并使用for循环不断更改子画面的x位置。实际上,该List会更大,因为我将收集每毫秒(或尽可能多)的行进距离。

我很惊讶地做到了这一点,没有提出问题,但现在我觉得我必须这样做。

[基本上,在我发送的YouTube视频末尾,我只需要将Tim的完成文件添加到Tech中,这就是我的主题:

x = threading.Thread(target=MyThread, args=())
x.start()

def redrawWindow():

win.blit(bg, (bgX, 0)) # bgX = x position of background 1
win.blit(bg, (bgX2, 0)) # bgX2 = x position of the same background 1 used for the loop

win.blit(bg2, (bgX_2, 152)) # bgX_2 = x position of background 2
win.blit(bg2, (bgX2_2, 152)) # bgX2_2 = x position of the same background 2 used for the loop

win.blit(bg3, (bgX_3, 265)) # bgX_3 = x position of background 3
win.blit(bg3, (bgX2_3, 265)) # bgX2_3 = x position of background 3 used for the loop

runner.draw(win)
pygame.display.update()

def MyThread():

list = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400]

对于数组中的i:

length = len(list)
for i in range(length):
    print(list[i])
    runner2 = player(list[i], 175,64,64) # X position of sprite, Y position of sprite, Width of sprite, height of sprite
    clock.tick(speed)
    runner2.draw(win)
    #redrawWindow()
    pygame.display.update()

让我知道这是否有意义。 [我需要帮助找出如何修复计算机的故障。可能的话,我认为观看上面链接的视频可以使您清楚地了解自己在做什么,并且不必添加到目前为止,我对基本代码的了解不多。我愿意改变我应该如何处理。请让我知道你的想法。非常感谢你。 如果有帮助,我正在Raspberry Pi 3 B +上运行它。

python multithreading raspberry-pi pygame python-multithreading
1个回答
0
投票

我为为什么您认为需要使用线程来使单独的精灵以与主精灵不同的速度移动而感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.