python - 我的 python 角色一次只移动 1 个像素

标签 python pygame game-physics pixel

我正在制作一个小型跑酷迷你游戏,其中角色从一个平台跳到另一个平台,但我似乎无法让角色正确移动。我制作了另一款游戏并且它运行正常,但这款游戏却没有。当我按住左/右箭头键时,它一次只移动 1 个像素。这是V

    Parkour_MoveLeft=Parkour_MoveRight=Parkour_Jump='no'
    Parkour_Speed=1
    Parkour_X=0
    Parkour_Y=0
    Parkour_Rows=0
    Parkour_Col=0

现在这是我遇到问题的游戏部分的代码:

    if location=='Parkour':
    Window.fill(Black)
    WindowW = 700
    WindowH = 700
    Window=pygame.display.set_mode((WindowW, WindowH),0, 32)
    pygame.draw.rect(Window, Blue, Parkour_Character)
    num=0
    for point in Parkour_Grids:
        mat=Parkour_Lvl_1[num]
        num+=1
        if mat=='a':
            point['collide']='no'
        if mat=='p':
            pygame.draw.rect(Window, Green, point['rect'])
            point['collide']='yes'

    for point in Parkour_Grids:
        if point['collide']=='yes':
            if Parkour_Character.colliderect(point['left']):
                Parkour_MoveRight='no'
            if Parkour_Character.colliderect(point['right']):
                Parkour_MoveLeft='no'
            if Parkour_Character.colliderect(point['bottom']):
                Parkour_MoveUp='no'
            if Parkour_Character.colliderect(point['top']):
                Parkour_MoveDown='no'

跑酷运动

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_RIGHT:
                Parkour_MoveRight='yes'
            if event.key == K_LEFT:
                Parkour_MoveLeft='yes'
        if event.type == KEYUP:
            if event.key == K_RIGHT:
                Parkour_MoveRight='no'
            if event.key == K_LEFT:
                Parkour_MoveLeft='no'
    if Parkour_MoveLeft=='yes':
        Parkour_Character.right-=Parkour_Speed
    if Parkour_MoveRight=='yes':
        Parkour_Character.right+=Parkour_Speed

关卡图

    Parkour_Lvl_1=['a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','p','p','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','a','a','a','a','p','p','p','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a',
           'a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a','a']

    while True:
for event in pygame.event.get():
    if event.type == QUIT:
        pygame.quit()
        sys.exit()
Parkour_Grids.append({'rect':pygame.Rect(Parkour_X, Parkour_Y, 80, 30),'right':1,'left':1,'top':1,'bottom':1,'type':'air','collide':'yes'})
Parkour_X+=80
Parkour_Col+=1
if Parkour_Col==40:
    Parkour_Col=0
    Parkour_X=0
    Parkour_Y+=70
    Parkour_Rows+=1
    if Parkour_Rows==10:
        break
    for point in Parkour_Grids:
        point['right']=pygame.Rect(point['rect'].left+70,point['rect'].top , 6, 70)
        point['left']=pygame.Rect(point['rect'].right-76,point['rect'].top , 6, 70)
        point['top']=pygame.Rect(point['rect'].left+6,point['rect'].top-15 , 58, 6)
        point['bottom']=pygame.Rect(point['rect'].left+6,point['rect'].bottom+6 , 58,6)

有人能帮我做什么吗?它与我制作的另一款游戏中的代码完全相同(具有不同的变量),但这款游戏似乎不起作用。

最佳答案

您需要提高跑酷速度。它设置为 1,因为它看起来不像您曾经将它相乘或执行过两次移动,所以这就是它将移动多少像素。增加这个数字将使它一次移动更多像素。但是,虽然不清楚这是否是您的问题,但也有可能是您按下按钮时它没有连续移动。如果事件查找器没有持续运行,这肯定会发生,但是因为检查事件是同时实现的,所以情况可能并非如此(代码越多越容易知道)。您必须重复实现以在屏幕上连续移动 Sprite 的另一件事是将 Parkour_X 和 Y 与屏幕同步。我看不到你在代码中的什么地方这样做,但我认为使用 move_ip 函数来解决你的问题应该是最简单的。如果屏幕正在更新,对代码的这种修改应该可以解决您的问题:

for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_RIGHT:
                Parkour_MoveRight='yes'
            if event.key == K_LEFT:
                Parkour_MoveLeft='yes'
        if event.type == KEYUP:
            if event.key == K_RIGHT:
                Parkour_MoveRight='no'
            if event.key == K_LEFT:
                Parkour_MoveLeft='no'
if Parkour_MoveLeft=='yes':
    Parkour_Character.move_ip(-Parkour_Speed,0)
if Parkour_MoveRight=='yes':
    Parkour_Character.move_ip(Parkour_Speed,0)

如果这也不能解决您的问题,那么其他一切似乎都很好,因此包含更多代码可能会有用。我知道您已经编写了很多代码,但是像这个这样的图形程序中的简单功能往往是非常相互关联的。

关于python - 我的 python 角色一次只移动 1 个像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20228649/

相关文章:

python - 在 pygame 的类/子类中设置和显示 Sprite 时遇到问题

python - 如何让 pygame 只识别一次鼠标点击?

ios - 在 Sprite Kit 中确定一个点是否位于物理体的边界内

xcode - fatal error : unexpectedly found nil while unwrapping an Optional value on physics contact

python - 字符串切片的时间复杂度

python - 处理不带参数但有时使用绑定(bind)事件调用的函数的最佳方法?

python - 将多个参数传递给 tf.data.Datasets.from_generator 中的生成器

python - 'not foo is none' 和 'foo is not none' 和有什么区别?

用于调用函数的 Python 管道符

swift - 对 SceneKit 物理体施加力?