gpt4 book ai didi

objective-c - cocoa 碰撞检测问题

转载 作者:行者123 更新时间:2023-12-03 16:55:41 27 4
gpt4 key购买 nike

我得到了用于碰撞检测的NSIntersectionRect的概念,但似乎无法考虑如何为我的项目实现它。没关系,单击按钮,将调用视图子类,并在窗口中的任意位置放置一个圆圈。在该视图中单击,然后圈出脉冲(这使其成为活动视图)。如果您有一个活动视图,则在其外部的任何地方(但不在另一个圆圈上)单击鼠标都会将该视图移至点击点。

我正在使用[activeView动画器setFrame:NSMakeRect(x,y,w,h)]移动活动视图。我可以将其用于碰撞检测还是必须与CABasicAnimation一起使用?基本上,我想做的是检测与其他圆的碰撞(此时无需任何物理操作,只需停止运动即可)和/或与应用程序窗口的边界发生碰撞。

如果有人可以向正确的方向(教程链接,代码段)推动我,我将不胜感激。

编辑:基于以下详细的答案,我需要更加清楚。我对在哪里实现碰撞检测感到困惑。视图类的动画师方法是一行代码。如何遍历屏幕上的每个静态圆以进行碰撞检查?这就是为什么我首先想知道,如果我需要使用CoreAnimation,OpenGL或Chipmunk之类的东西,然后我能否得到推动或协助,那将是很棒的。

最佳答案

稍后..回答您最近的问题:

这就是为什么我首先想知道,如果我需要使用CoreAnimation,OpenGL或Chipmunk之类的东西,然后我能否得到推动或协助,那将是很棒的。

答案-您绝对不需要OpenGL :)接下来,您绝对不需要像Box2D或Chipmunk这样的物理库...如果您愿意,可以这样做,但是,这将是大量不必要的工作。需要说明的是:在您完全熟悉DrawRect之前,像Chipmunk之类的东西对您来说都是无用的,所以就算了。

核心动画不会真正帮助您。明确地说,您可能想在动画发生时中断它。那是对的吗?

我对在哪里实现碰撞检测感到困惑。视图类的动画师方法是一行代码。如何遍历屏幕上的每个静态圆以进行碰撞检查?

坏消息……如果您真的想中断动画,如果发生碰撞,请忘了Core Animation。 Core Animation将让您将其作为动画的“一个单位”从A发送到B。它不会让您在中间停止它(如果发生碰撞)。就是这样。

要明确的是,这就是您想要做的对吗?您使圆运动,如果它在途中碰到某物,则希望它停止。它是否正确?如果是这样,请完全忘记Core Animation,并丢弃到目前为止所做的任何工作。

您将不得不深入“真正的”编程(无论这意味着什么),然后开始使用drawRect。你准备好了吗?

在这一点上,我可能只提到:考虑购买一份Corona拷贝(大约100美元,我确定演示是免费的)。使用Corona,您可以在五分钟内完成您描述的所有操作。 (写这篇文章的时间是1/10的时间??)我总是向iPhone好奇的人推荐这个。如果您真的不想花6到18个月的时间成为一名iPhone程序员,只需单击可用于iPhone的Corona,然后在使用Stack Overflow花费的时间的一小部分中,您的圈子就会在iPhone上狂跳屏幕。

因此,如果不这样做,您将必须开始工作并学习如何启动计时器(NSTimer)并在UIView中使用drawRect。

创建一个名为MyFirstView的新类(.h和.m文件),它是UIView的子类(不是UIViewController,这是w夫!)。您将需要在MyFirstView中使用drawRect方法,然后从那里开始!



原始答案..

我不确定我是否理解您的意思,但请注意:

您要检测两个圆之间的碰撞。在您的情况下,所有圆都具有相同的直径。那是对的吗?

如果是这样,幸运的是它很容易做到。

编写获取两个CGPoint之间距离的例程。 (如果您不知道该怎么做,我在下面列出了它。)

下一步,您必须知道圈子的直径。假设该示例为50.0。

接下来,这是一个检查两个圆是否碰撞的例程:

static inline bool areTwoCirclesColliding( CGPoint aa, CGPoint bb )
{
return ( distanceBetweenTwoCGPoints(aa,bb) < 50.0 );
}


(注意:如果您不熟悉Objective C,请注意上面的代码是完全有效的代码。只需将其粘贴到文件顶部即可。可以吗?)

最后,您只需要检查所有圈子,一个对另一个,看看是否有任何冲突。

如果您有一个简单的固定数量的圆,比如说三个左右,只需写出所有代码行来检查是否有任何组合发生冲突,因此:

areTwoCirclesColliding(a,b)
areTwoCirclesColliding(a,c)
areTwoCirclesColliding(b,c)


如果您有一个数组或某种类型的圈子列表,则只需要遍历所有圈子并检查每个圈子是否彼此接触即可。用伪代码可能是这样的...

for n in 1 to numberCircles
oneCircle = circles[n]
for m in n+1 to numberCircles
anotherCircle = circles[m]
if ( areTwoCirclesColliding(oneCircle,anotherCircle) )
.. break, you found a collision


另外,您也可以这样写,没有区别。

for each aa in circles
for each bb in circles
if (aa != bb) if (areTwoCirclesColliding(aa,bb)) .. break, found collision


{此外-为了记录在案,在伪代码中检查每对两次是完全不重要的,没问题。}

对我来说,我无法为您编写实际的代码,因为我不知道您使用的是什么结构。

当然,如果您的圈子是一个对象,则可以明智地使它与所有其他圈子进行相同的测试。如果您有一个圈子的SQL数据库,请相互进行测试。

因此,幸运的是,您可以看到一两行代码来检查两个圆是否碰撞。检查所有圈子是否有碰撞,大约需要3或4行代码。因此,幸运的是总共共有5条线!

所以,这是一个非常简单的视频游戏物理教程,第1.1.1.1部分!!!!希望能帮助到你!如果这不是您要实现的目标,那完全是在浪费输入! :)

作为记录,下面是获取两个CGPoint之间距离的例程:

static inline float rawDistance(float x, float y, float p, float q)
{
return sqrt( ((x-p)*(x-p)) + ((y-q)*(y-q)) );
}
static inline float distanceBetweenTwoCGPoints( CGPoint a, CGPoint b )
{
return rawDistance( a.x, a.y, b.x, b.y );
}


(注意:如果您不熟悉Objective C,请注意上面的代码是完全有效的代码。只需将其粘贴到文件顶部即可。好吗?这就像使用Apple提供的任何日常功能,例如x = CGLayerGetContext (),例如。尽情享受吧!)

后来..并根据大众的需求,对一个物体Circle ...

-(bool)isTouchingOtherCircle:(circle)c
{
return areTwoCirclesColliding(self.center, c.center);
}
-(bool)isTouchingAnyOtherCircle
{
for oc in yourCircles
if (oc != self)
if ( [self isTouchingOtherCircle:oc] )
return false;
return true;
}

关于objective-c - cocoa 碰撞检测问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051921/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com