My Problem can be seen through this video..
你可以在上面的链接中看到,直到我向下移动杆,每个东西都运行良好但是一旦我向下移动,汉堡就会卡在杆上。帮助我,我希望它只是偏离表面。乒乓球比赛......
对于偏转,我使用了以下代码片段。
let fr:NSFetchRequest<TestEntity>=TestEntity.fetchRequest()
do {
let searchResults=try context.fetch(fr)
if let results=searchResults {
for result in results {
print("testAtt = \(result.testAtt)")
}
}
} catch {
}
这里的游戏球是指汉堡,而杆是指顶部和底部的图像。
答案 0 :(得分:1)
似乎正在发生的事情是杆球比球在一帧中移动更重要更多。换句话说,如果球每帧移动3个像素但是物体重叠5个像素,则它们将不能通过简单地改变方向而脱离碰撞。你需要首先将球移出碰撞。
也就是说,碰撞检测和响应始终是难以编写的代码。关键是将检测代码与响应代码分开。
换句话说。对于每一帧:
你现在正在做的是在检测阶段搬家。当两个物体相互移动时,这会导致麻烦。
关于这个主题的方式比我能回答的更多。我建议四处寻找有关AABB碰撞检测的教程。
答案 1 :(得分:0)
你的CollisionRectangle是MonoGame / XNA中内置的Rectangle类吗?
假设它是并且循环在更新中,也许您可以尝试插入一个中断,以便它在第一次更改后立即停止更新游戏球速度。这是因为游戏每秒更新60次,当游戏更新时,情况可能会持续几毫秒左右。
foreach (Bar rod in bar)
{
if(rod.CollisionRectangle.Intersects(GameBall.CollisionRectangle))
{
GameBall.speed *= -1;
Console.WriteLine("game" + GameBall.speed);
break;
}
}
如果它不起作用,请告诉我,如果我有空,我可以在新项目中尝试。
答案 2 :(得分:0)
当球与杆相交时,你改变了方向,但碰撞仍在这里,所以你可以试试这个:
foreach (Bar rod in bar)
{
if(rod.CollisionRectangle.Intersects(GameBall.CollisionRectangle))
{
GameBall.speed *= -1;
// Reset position of the ball
// Something like :
// For the top bar
Gameball.y = rod.y + rod.height;
// For the bottom bar
// Gameball.y = rod.y - Gameball.height
Console.WriteLine("game" + GameBall.speed);
}
}