当前位置: 首页 > 知识库问答 >
问题:

如何防止我的精灵在pygame中穿过对象?

封梓
2023-03-14

所以我一直在做一个游戏,到目前为止最大的问题是我们不能让玩家与球场上的任何物体相撞。相反,它们会直接穿过树。有人能告诉我为什么吗?以下是我尝试用于碰撞检测的代码:

for tree in treelist:


    if self.player.rect.x == tree.rect.x:
        self.player.rect.x == self.player.rect.x - 2
    if self.player.rect.x == tree.rect.x + tree.rect.width:
        self.player.rect.x == self.player.rect.x + 2

    if self.player.rect.y == tree.rect.y:
        self.player.rect.y == self.player.rect.y - 2
    if self.player.rect.y == tree.rect.y + tree.rect.height:
        self.player.rect.y == self.player.rect.y + 2

这是理论上的声音还是我完全错了?

共有2个答案

益思博
2023-03-14

几乎是合理的理论。您只检查玩家矩形位置是否与矩形位置的边界完全相同。这种情况很少发生。您还需要检查玩家是否在树的边界之间,更像这样:

# check if player is overlapping the tree
if tree.rect.x <= self.player.rect.x <= tree.rect.x + tree.rect.width:
    # decide on how to move player away from the tree depending on previous frame
    # if player is moving forward, send them backwards from tree
    if self.player.rect.prev_x < self.player.rect.x:
        self.player.rect.x -= 2
    # otherwise send them forwards from tree
    else:
        self.player.rect.x += 2

重叠检查的确切逻辑和重叠时的反应完全取决于你,但这种事情应该有效。请注意,你需要跟踪玩家在前一帧中的位置,否则你将不知道他们从哪个方向击中树。你可以这样做:

self.player.rect.prev_x = self.player.rect.x
self.player.rect.x += player_velocity
梁丘高朗
2023-03-14

你在用pygame吗?如果是这样,有内置的< code > collider CT 函数(文档在此)。

如果不是:

  • 这里有一个相对深入的讨论,设计时考虑了平台游戏
  • 这只是轴对齐(即未旋转)矩形的主干二维碰撞检测

请记住,快速移动的对象会使碰撞检测变得非常困难,因为它们在一帧的范围内“经过”对象!有更先进的技术来处理这一点,但现在,尽量让你的碰撞盒相对较大,事情进展相对较慢。

编辑:哎呀,我的第一句话听起来很粗鲁。不知何故,我忘记了这篇文章的标题...

 类似资料:
  • 我正在用Python pygame制作一个游戏,并制作了一个移动的背景,一个作为玩家的跳跃精灵和生成障碍物。现在我正在研究玩家和障碍物之间的碰撞,并编写了一些代码,但最终出现了错误: 我不知道,为什么那个类不是精灵,也不知道如何把它变成精灵。我希望修复这个错误后,碰撞工程。 播放器图像1 图像 2 背景图片3

  • 我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。

  • 我正在与Pygame一起练习,试图学习类,对象等的一些基本用法。 现在,在http://programarcadegames.com/的帮助下,我正在制作一个基本的平台 我有一个精灵播放器和精灵平台。这些平台也可以是移动平台,它应该在碰撞时移动玩家,但是当玩家移动到其他平台时,会发生一些奇怪的传送,我现在没有看到问题。 基本上,当被推时,玩家在逻辑上没有被移动(至少对我来说是这样)。 非常感谢任何

  • 对于我的pyplay塔防御计划,我试图弄清楚如何实现与地图上已经放置的其他塔的碰撞。 放置过程将创建一个48x48预览精灵,当它在游戏屏幕上时,该精灵将在玩家鼠标上的网格中移动。塔精灵保存在名为的组中。我有这段代码来检查精灵是否与某些地形瓷砖和塔精灵发生碰撞(这在精灵更新功能中): 循环前进部分是为了检查预览精灵是否与任何塔精灵矩形碰撞。如果是,它将变量设置为true或其他,False。 然后程序

  • 我试图做一个简单的游戏,玩家必须要么躲闪敌人,要么向他们射击。到目前为止,玩家和敌人的部分似乎很好,但我被困在导弹的事情。我正在试图弄清楚当鼠标左键被按下时,如何在玩家旁边产卵一枚导弹。所以我正在寻找一种方法来获得玩家当前的坐标,在这些坐标的右边加上一个,如果玩家按下左边按钮,导弹的坐标会是什么。

  • 问题内容: 在pygame中,有没有一种方法来寻找某一方之间的碰撞 一个精灵和另一个精灵的特殊一面?例如,如果 精灵A的顶部与精灵B的底部碰撞,返回True。 我肯定有办法做到这一点,但我找不到任何特别的方法 在文档中。 谢谢! 问题答案: 在PyGame中没有函数来获取侧面碰撞。 但你可以试着用 pygame.Rect.CollipePoint公司 测试是否,,, ,,,, 在里面 (pygam