python - Pygame中的墙逻辑
问题描述
我正在用 Pygame 制作游戏,现在我坚持如何处理玩家和墙壁之间的碰撞。这是带有单元格的 2D RPG,其中一些单元格是墙壁。你从顶部看世界,就像吃豆子一样。
所以,我知道我可以获取碰撞列表,pygame.spritecollide()
它会返回玩家碰撞的对象列表。我可以得到“碰撞矩形” player.rect.clip(wall.rect)
,但是我怎样才能让玩家从墙上回来呢?
所以,我有很多想法。第一种是反方向推玩家,但如果玩家去,例如,向右和底部方向并与自身右侧的垂直墙发生碰撞,玩家就会卡住,因为它只需要向左推,而不是向上推。
第二个想法是实现像一左一底的对角线移动。但是这种方式我们现在不知道,如何先移动:向左或向下,顺序成为最重要的因素。
所以,我不知道我应该使用什么算法。
解决方案
如果您知道单元格中心的位置和玩家的位置,您可以计算出该时间点与墙壁的 x 距离和 y 距离。是否有可能在那个时候取每个距离的绝对值,然后取最大值作为推动玩家进入的方向。
例如,玩家与墙的右侧发生碰撞,因此在 y 方向上到墙中心的距离应该小于在 x 方向上的距离。因此,您知道玩家与墙壁的左侧或右侧而不是顶部相撞,这意味着应该向右或向左推动。
如果玩家的运动以 [x, y] 的形式存储,那么知道是向左还是向右推动并不重要,因为在 x 轴上翻转运动方向会给出正确的结果。
因此,在本例中,推送应该在 x 方向,例如 player.vel_x = -player.vel_x。这将使 y 轴上的运动保持不变,因此希望不会导致您提到的问题。
这有帮助吗?
推荐阅读
- angular - 从 Cloud Firestore 读取数据时,我是否需要使用带有 .valueChanges() 的订阅?
- python - Python & 排序:按数组中子元素的顺序对元素进行排序
- javascript - 在 ng2-chart 中,setTimeOut 函数在使用 angular 7 的 firefox 上不起作用
- java - Eclipse tomcat java.lang.ClassNotFoundException:com.web.servlets.SearchServiceServlet
- javascript - 用 window[string]() 实例化一个类对象
- android - 带有默认值的 Kotlin-moshi 代码生成继承
- cordova - Ionic 3:onSMSArrive 事件未触发(在 android 上读取短信)
- python-3.x - 在多线程池中传递 groupby 时内存泄漏
- java - 更新 java.nio.file.DirectoryNotEmptyException 后出现 jenkins 错误:/var/lib/jenkins/users/admin
- unity3d - 将 GameObject Unity 导出为 .fbx 或 .obj