CGRectIntersectsRect无法正常工作

时间:2014-02-06 13:22:04

标签: cocos2d-iphone cgrect

感谢您抽出宝贵时间查看我的菜鸟问题,我们将非常感谢您的帮助。

首先,我试图使用bezier曲线(从不想使用box2d)将对象从屏幕的一侧“反弹”到另一侧(

)。

对象有4个状态代表4个动作,当对象击中(反应)从前一个状态移动到新状态的地板时,请参见下图...

enter image description here

**我的问题是我无法正确使用CGRect从状态1转换到状态4。我现在可以让对象移动状态,但随后发生了两件事之一......

1)以下代码将允许对象正确地从状态1更改为状态2,但是在状态2结束时它将不会与地板(它只是通过它)发生反应,因此不会更改为状态3

 -(void)updateStateWithDeltaTime:(ccTime)deltaTime andListOfGameObjects:(CCArray *)listOfGameObjects {


    [self setDebugLabelTextAndPosition];


    if ([self isOutsideOfScreen])
        return;

   CGPoint currentSpitePosition = [self position];

    floorCharacter = (GameCharacter*)[[self parent]
                                       getChildByTag:kfloorSpriteTagValue];

    CGRect floorBoudingBox = [floorCharacter adjustedBoundingBox];
    CGRect ballBoundingBox = [self adjustedBoundingBox];

    CGRect characterBox = [character adjustedBoundingBox];
    if (CGRectIntersectsRect(floorBoudingBox, ballBoundingBox)) {

        if (characterState == kStateTravelling) {
            [self changeState:kStateTravellingPoint2];
        }

        if (characterState == kStateTravellingPoint2) {
            [self changeState:kStateTravellingPoint3];

        }

    }

2)下面的代码会在第一次撞击地板时停止对象,但是如果我在程序运行时移除了地板一秒钟,则对象将移动到状态3并在它撞到地板时再次停止,如果我再次移除地板,它将再次移动到状态4,这是没有添加其他状态(如下所示),所以它只是每次重复状态2。我猜这是因为它一碰到底就会返回TRUE,而当它为真时它就不会动作。

-(void)updateStateWithDeltaTime:(ccTime)deltaTime andListOfGameObjects:(CCArray *)listOfGameObjects {

    [self setDebugLabelTextAndPosition];

    if ([self isOutsideOfScreen])
        return;

   CGPoint currentSpitePosition = [self position];
   floorCharacter = (GameCharacter*)[[self parent]
                                       getChildByTag:kfloorSpriteTagValue];

    CGRect floorBoudingBox = [floorCharacter adjustedBoundingBox];
    CGRect ballBoundingBox = [self adjustedBoundingBox];

    isfloorWithinBoundingBox =
    CGRectIntersectsRect(floorBoudingBox, ballBoundingBox) ?
    YES : NO;

    if (isfloorWithinBoundingBox) {

        [self changeState:kStateTravellingPoint2];

    }

我想要它做的是在4个状态之间移动,如果地板在“反弹”运动中处于活动状态,那么只要状态1完成它就会撞到地板并进入状态2直到它完成曲线移动并再次击中地板然后进入状态3等。


对,我已经完成了上述工作,但并不完全理解我是如何做到的!

我尝试使用screenSize来确定对象的位置并将CGRect作为基础,但它起初并不起作用。然后我保留了代码,但添加了'CGSize screenSize = [CCDirector sharedDirector] .winSize;'方法,然后对象执行我想要的方式。

我现在使用screenSize时出现以下错误。 ''screenSize'的本地声明'隐藏实例变量'

我想知道的是为什么在我在方法中声明它之前它不使用screenSize(因为它已经在导入到这个中的另一个类中声明了)。

再次感谢任何花时间阅读此内容的人。

我的代码在下面......

-(void)updateStateWithDeltaTime:(ccTime)deltaTime andListOfGameObjects:(CCArray *)listOfGameObjects {

    [self setDebugLabelTextAndPosition];

    if ([self isOutsideOfScreen])
        return;

   CGPoint currentSpitePosition = [self position];

    floorCharacter = (GameCharacter*)[[self parent]
                                       getChildByTag:kfloorSpriteTagValue];

    CGRect floorBoudingBox = [floorCharacter adjustedBoundingBox];
    CGRect ballBoundingBox = [self adjustedBoundingBox];

    CGPoint floorPosition = [floorCharacter position];


    *Below is where I have added screenSize*
    CGSize screenSize = [CCDirector sharedDirector].winSize;

    isfloorWithinBoundingBox =
    CGRectIntersectsRect(floorBoudingBox, ballBoundingBox) ?
    YES : NO;

    if ((characterState == kStateTravelling) && (isfloorWithinBoundingBox == YES)) {{

                [self changeState:kStateTravellingPoint2];
    }

        return;
    }

    if ((characterState == kStateTravellingPoint2)&&(isfloorWithinBoundingBox == YES) && (floorPosition.x > screenSize.width*0.32f) && (floorPosition.x < screenSize.width*0.45f)) {{

                [self changeState:kStateTravellingPoint3];  
    }

        return;
    }

    if ((characterState == kStateTravellingPoint3)&&(isfloorWithinBoundingBox == YES) && (floorPosition.x > screenSize.width*0.45f) && (floorPosition.x < screenSize.width*0.55f)) {{

        [self changeState:kStateTravellingPoint4];
    }

        return;
    }

0 个答案:

没有答案