我正在开发一款平台游戏,我想做一些基本的平台碰撞,遗憾的是我还是做不到。玩家的移动是这样计算的:
velocity += acceleration
position += velocity + 0.5 * acceleration
所有变量都是具有< code>x和< code>y值的向量。这和预期的一样,问题是有冲突。我的规则是:
检查底部是否与平台碰撞非常简单,但棘手的部分是检测哪一侧与平台碰撞,并能够为玩家设置适当的位置。
我试图从每边检测角落和中间,但由于我的速度不是每帧1px,有时播放器会快速下降,并且也会被检测到为侧面。
检测哪一侧碰撞的好方法是什么?
好吧,这里有一些代码可以帮助检测您何时可以从平台跳转:
self.rect.y += 2
platform_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
self.rect.y -= 2
# If it is ok to jump, set our speed upwards
if len(platform_hit_list) > 0:
velocity += acceleration
position += velocity + 0.5 * acceleration
然后编写代码来检测您何时跌落到平台上:
if self.rect.y >= constants.SCREEN_HEIGHT and self.change_y >= 0:
self.change_y = 0
self.rect.y = constants.SCREEN_HEIGHT
最后是碰撞代码:
block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
for block in block_hit_list:
# If we are moving right,
# set our right side to the left side of the item we hit
if self.change_x > 0:
self.rect.right = block.rect.left
elif self.change_x < 0:
# Otherwise if we are moving left, do the opposite.
self.rect.left = block.rect.right
# Move up/down
velocity += acceleration
position += velocity + 0.5 * acceleration
# Check and see if we hit anything
block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
for block in block_hit_list:
# Reset our position based on the top/bottom of the object.
if self.change_y > 0:
self.rect.bottom = block.rect.top
elif self.change_y < 0:
self.rect.top = block.rect.bottom
# Stop our vertical movement
self.change_y = 0
希望这一切都能以某种方式帮助您提供所需的答案。请注意,这些块指的是平台,并将检查给定列表中的每个平台,我使用 rects,因为它是检查冲突的最佳方法之一。至于change_x和change_y它只是变量,用于存储玩家将要移动多少。
我有几个类似平台的javascript游戏,这是我实现collision的方法:
1.落地平台时停止下落:可以给你的sprite一个矩形作为边界区域,然后用Pygames内置的Rect类检测相交。当这个交叉点出现在你的精灵击中框(矩形)和平台矩形(另一个矩形)之间时,你应该把你的玩家的Y速度设置为0。
2.跑离平台时开始下落。我通常有一个专门用于重力的变量,并简单地不断地将它应用于精灵以将其向下推。这样,你不再和一个平台相交后,它就会往下掉。
3.在跳跃过程中碰到平台时停止向上移动:与相交前相同的事情只是在矩形碰撞后将Y速度设置为0,并让玩家因重力不变而下落。
4.撞墙时停止向侧面移动,但能够移动到相反的方向:同样的事情,但这次将X速度设置为0。(如果你被困在墙上,你总是可以把X设置为大于0,以推动你回到游戏中)
还有一点需要注意的是,如果你只想在你的精灵碰到平台的某个边缘时做点什么,你可以创建一个与精灵侧面对齐的矩形。例如,如果我想查看某个物体是否与精灵的左侧相交,我可以使用-height:same height-width:1-x:x width-y:same y
关于矩形的文献:https://www.pygame.org/docs/ref/rect.html
我计划一个独立游戏项目已经有一段时间了。我会为你总结一下,这样我就可以直接回答这个问题。 它是通过Visual Studio完全使用最新版本的XNA完成的。希望将其放在360和PC上,但目前我只是在真正寻找面向PC的解决方案。 这是一个2D侧向滚动射击游戏(想想大都会风格,甚至是Terraria)。它最终将包括一个游戏中的地图编辑器,地图是基于图块的(16x16)。会有向上和向下滚动。我希望在开发
我下面的碰撞方法有问题。问题是当游戏中有两个敌人时。它与循环中的一个敌人相交,然后返回true进行碰撞。但是如果在这个数组列表中有第二个敌人,它将不会与第二个物体碰撞,因此导致它返回false,玩家继续行走。有什么办法可以让他在接触任何敌人时停下来,而不是因为他没有接触到所有的敌人而继续下去吗?谢谢,这是密码。
我的2D平台游戏有问题。由于我刚刚开始使用c,因此我在瓷砖碰撞方面遇到了麻烦。我能够阻止玩家进入图块,并且能够远离它,但不知何故,他不能沿着图块移动。 此功能用于检查新位置是否位于实心瓷砖内: 空地图::drawColMap(播放器 } 以下是移动播放器的代码: void Player::update() { } 感谢任何帮助! //编辑1 我试着记录碰撞,它显示即使我不按任何键,玩家仍然在碰撞区
我在一个2D平台上工作在Java为一个任务。赋值指定我必须使用抽象形状类来绘制形状。我遇到的问题是让我的碰撞检测与多个矩形对象一起工作,我使用这些对象作为平台--我将它们存储在一个列表中。目前,我的碰撞检测将移动我的玩家,不管我撞到了哪个平台,所以如果我从右边撞到了一个平台,它会把我移到那个平台的顶部,因为它仍然在检查我下面的另一个平台,并假设我撞到了那个平台,因此把我移到平台的顶部。我想知道如何
如何让我的球从屏幕上的物体上反弹? 下图是一个很好的例子,说明一旦球碰到障碍物,程序应该如何工作。 我让球从墙上反弹,但剩下的是让它也从物体上反弹。谢谢你的帮助! 以下是源代码:
首先,这里有一些背景: 我正在开发一个2D游戏作为一个个人项目,可能会在移动设备上发布。我计划创建一个基于瓷砖的拼图/平台与许多视觉元素。 我以前从未生产过这种规模的东西,我想知道如何在一个相对较大的项目中坚持良好的OO原则。 我想要一些建议,如何结构我的一些代码,以不同类型的冲突与不同的瓦片类型。 我的播放机对象可以放置在其上的实体瓷砖 仍可检测碰撞但允许玩家游泳的水瓦 没有任何冲突检测的背景元