我正在尝试创建一个碰撞检测方法,以检查我的两个对象(两个椭圆形状的uiimages)是否相互碰撞。如果他们这样做了,它应该将BOOL值设置为是,否则它应该设置为否。
到目前为止,它只是检查Ruby1是否高于Ruby2的if语句。它不关心ruby1是否低于ruby2,甚至不关心它的左边或右边。它只会一直到那个IF语句。反之亦然。
-(void)CollisionDetect{
//can't be colliding because Ruby1 is too far left of Ruby2
if( rubin1.frame.origin.x + rubin1.bounds.size.width < rubin2.frame.origin.x){
CollisionRubies = NO;
NSLog(@"Collision left");
}
//can't be colliding because Ruby1 is too far right of Ruby2
if( rubin1.frame.origin.x > rubin2.frame.origin.x + rubin2.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision right");
}
//can't be colliding because Ruby1 is too far below Ruby2
if( rubin1.frame.origin.y + rubin1.bounds.size.width < rubin2.frame.origin.y){
CollisionRubies = NO;
NSLog(@"Collision below");
}
//can't be colliding because Ruby1 is too far above Ruby2
if( rubin1.frame.origin.y < rubin2.frame.origin.y + rubin2.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision above");
}
if( rubin2.frame.origin.x + rubin2.bounds.size.width < rubin1.frame.origin.x){
CollisionRubies = NO;
NSLog(@"Collision left");
}
//can't be colliding because Ruby2 is too far right of Ruby1
if( rubin2.frame.origin.x > rubin1.frame.origin.x + rubin1.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision right");
}
//can't be colliding because Ruby2 is too far below Ruby1
if( rubin2.frame.origin.y + rubin2.bounds.size.width < rubin1.frame.origin.y){
CollisionRubies = NO;
NSLog(@"Collision below");
}
//can't be colliding because Ruby2 is too far above Ruby1
if( rubin2.frame.origin.y < rubin1.frame.origin.y + rubin1.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision above");
}
//if we get here, the two rects MUST be colliding
CollisionRubies = YES;
NSLog(@"Collision detected");}
如果BOOL值为NO,那么ruby1将移动到该位置,如下面的代码所示,否则它将停止移动,直到检测到ruby2不在它前面。反之亦然。
-(void)dispatchTouchEvent:(UIView *)theView toPosition:(CGPoint)position{
// Check to see which view, or views, the point is in and then move to that position.
if (CGRectContainsPoint([rubin1 frame], position)) {
if(!CollisionRubies){
rubin1.center = position;
}
if (CGRectContainsPoint([rubin2 frame], position)) {
if(!CollisionRubies){
rubin2.center = position;
}
}碰撞检测方法是从触摸移动方法调用的。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self CollisionDetect];
NSLog(@"touchesMoved");
if(!GamePaused){
// Enumerates through all touch objects
for (UITouch *touch in touches) {
// Send to the dispatch method, which will make sure the appropriate subview is acted upon
[self dispatchTouchEvent:[touch view] toPosition:[touch locationInView:self.view]];
}
}我做错了什么?
**********UPDATE__*******************************
-(void)CollisionDetect{//不能碰撞,因为Ruby1离Ruby2太远
if( rubin1.framework.源.x+ rubin1.bounds.size.width
CollisionRubies = NO;
NSLog(@"Collision left");
}
//不能碰撞,因为Ruby1离Ruby2太远了
否则,如果(rubin1.framework.源.x>rubin2.framework.源.x+ rubin2.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision right");
}
//不能碰撞,因为Ruby1比Ruby2低得多
否则,如果(rubin1.framework.源.y+ rubin1.bounds.size.width
//不能碰撞,因为Ruby1比Ruby2高得多
否则,如果(rubin1.framework.源.y
if( rubin2.frame.origin.x + rubin2.bounds.size.width < rubin1.frame.origin.x){
CollisionRubies = NO;
NSLog(@"Collision left");
}
//不能碰撞,因为Ruby2离Ruby1太远了
否则,如果(rubin2.framework.源.x>rubin1.framework.源.x+ rubin1.bounds.size.width){
CollisionRubies = NO;
NSLog(@"Collision right");
}
//不能碰撞,因为Ruby2比Ruby1低得多
否则,如果(rubin2.framework.源.y+ rubin2.bounds.size.width
//不能碰撞,因为Ruby2比Ruby1高得多
否则,如果(rubin2.framework.源.y
否则{/如果我们到达这里,两个rects必须是碰撞CollisionRubies = YES;NSLog(@“检测到碰撞”);}
发布于 2011-06-30 14:09:42
顺便提一句,如果您使用的是其他代码,那么您的代码可能会更高效一些,特别是如果您经常调用CollisionDetect,我认为您是这样的。这样,如果前面的if语句之一为true,则可以忽略其余语句。
发布于 2011-06-30 13:44:11
在您的CollisionDetect方法中,您在不同的点上设置CollisionRubies = NO,但是不管刚刚发生的任何测试,您都是在最后设置CollisionRubies = YES。如果方法是一行的话,那就好了。
-(void)CollisionDetect{
CollisionRubies = YES;
}此外,在计算碰撞时似乎也有问题(在上面或下面计算时,宽度与y是混合的)。
我也建议你阅读目标-C编码风格指南。例如,对变量和方法名称使用小写首字母。例如,如果以标准方式编写代码,collisionRubies和-(void)collisionDetect可以帮助其他人更快地阅读代码。
发布于 2011-06-30 13:47:54
而不是从四个方向检查碰撞的四个函数,为什么不使用
if(CGRectIntersectsRect(ruby1.frame,ruby2.frame)
{
//your code
}当然,这只是当你不需要知道一个物体接近另一个物体的方向的时候。
https://stackoverflow.com/questions/6535173
复制相似问题