Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pygame tilemap碰撞(使其返回碰撞的哪一侧)_Python_Pygame_Sprite_Tiles - Fatal编程技术网

Python Pygame tilemap碰撞(使其返回碰撞的哪一侧)

Python Pygame tilemap碰撞(使其返回碰撞的哪一侧),python,pygame,sprite,tiles,Python,Pygame,Sprite,Tiles,我有一个由精灵组中的精灵组成的关卡,这些精灵由一个二维数组放置,这是tilemap 我在另一个精灵组中有一个玩家精灵 你怎么用这个做一个2d平台呢?我只需要一段代码,可以告诉玩家的哪一边正在触摸一块瓷砖,然后返回它,这样我就可以创造条件,阻止他从一边到另一边移动,或者阻止他跳跃。 我尝试了很多不同的方法,但由于tilemap,我无法正确地实现这一点。我在这里为那些想学习编程的人回答问题。如果问题显然是一个gimmetehcodez,或者我从这里那里复制了一些代码;现在给我修一下!,我没有在答案上

我有一个由精灵组中的精灵组成的关卡,这些精灵由一个二维数组放置,这是tilemap

我在另一个精灵组中有一个玩家精灵

你怎么用这个做一个2d平台呢?我只需要一段代码,可以告诉玩家的哪一边正在触摸一块瓷砖,然后返回它,这样我就可以创造条件,阻止他从一边到另一边移动,或者阻止他跳跃。
我尝试了很多不同的方法,但由于tilemap,我无法正确地实现这一点。

我在这里为那些想学习编程的人回答问题。如果问题显然是一个gimmetehcodez,或者我从这里那里复制了一些代码;现在给我修一下!,我没有在答案上花费太多的编码努力。因此,我希望您能够理解为什么下面的答案基本上是理论性的,并且不包含经过测试和调试的代码

我假设你说的是一个有重力的2D游戏,玩家会在某种程度上跳跃和跌倒。如果你说的是2D自上而下的视图,没有重力,下面的一些术语可能有点偏离,但逻辑是一样的

基于平铺的贴图或标高可以视为一组图层。我会将可碰撞的精灵分成一个单独的精灵组,我们称之为这些平台。装饰瓷砖可以归入背景组。背景是一个较低的层,除了必须绘制,否则可以忽略。一张背景图片可能比一堆精灵更好

因此,每当玩家尝试移动时,在移动完成之前,需要测试平台是否与新的理论位置发生碰撞。在pygame.sprite.spriteCollizeAny中有一个方便的函数。这使您的代码可以非常轻松地检查单个精灵和while精灵组之间的冲突:

collided_with = player_sprite.spritecollideany( platform_sprite_group )
if ( collided_with != None ):
    print( "Player collided with sprite: " + str( collided_with ) )
另一个方便的功能是pygame.sprite.groupcollide,它非常适合将一组精灵与另一组精灵碰撞,就像一束箭与一群敌人碰撞一样。但是你也可以制作一个带有a的精灵群,并在奇异的物体上使用它

你真的不需要知道玩家的哪一边与平台发生碰撞。这是隐含的信息,因为你已经知道玩家移动的方向。碰撞测试的基础是意识到一次移动一个大于1像素的精灵可以将玩家移动到一个现有精灵的顶部,而不必接触任何一侧。假设玩家移动得非常快,它的下一个移动位置可能正好进入另一个精灵的中间!那么它击中了哪一边?球员离开的那一边

例如:如果玩家想向左移动10个像素,但平台边缘距离为5个像素,则玩家会碰撞,但不会触摸。一旦发生碰撞,代码需要确定可接受的移动是什么,并将移动调整到此增量。由于PyGame sprite对象基于a,因此这是一个相当简单的测试,使用Rect的x、y和宽度、高度。“x”和“y”表示左上角,因此我们需要考虑精灵的宽度:

# Player has tried to move delta_x and delta_y pixels
collided_with = player_sprite.spritecollideany( background_sprite_group )
if ( collided_with != None ):
    print( "Player collided with sprite: " + str( collided_with ) )
    if ( delta_x > 0 ):    # moving right
        # collides on right side
        distance_to_sprite_x = player_sprite.rect.x + player_sprite.rect.width - collided_with.rect.x
    elif ( delta_x < 0 ):  # moving left
        # collides on left side (take width of sprite into account)
        distance_to_sprite_x = player_sprite.rect.x - collided_with.rect.x + collided_with.rect.width
    else:                  # not moving horizontally
        distance_to_sprite_x = 0
    # Adjust the x-movement to make it rest against the sprite
    delta_x = distance_to_sprite_x

    # TODO: similarly for delta_y 
很明显,如果玩家的移动速度足够快,每帧有很多像素,理论上它可以跳过整个平台,而不会碰撞,直接通过。上面的代码存在这种潜在的bug。但大多数游戏都不需要担心这种情况


所以我希望上面给出的逻辑足以让你开始处理各种碰撞。只要试着让代码正常工作,这是最好的学习方法。写一些东西,测试它,犯错误,提出问题。我们随时准备提供帮助。很容易陷入这样的陷阱:只是复制和粘贴别人的代码,而这些代码的质量有时并不高,因此很快就能得到解决方案。但这并不能真正帮助你学习基础知识

你能给我这段代码吗?当然,这听起来并不意味着我需要一段代码,即使我以前尝试过类似的东西。