与锚点碰撞

时间:2013-03-05 01:47:49

标签: iphone objective-c cocos2d-iphone collision-detection

所以我所做的是我的CCSPRITE瓷砖的随机锚点和旋转速度,但这会破坏我的碰撞。如何在锚点上旋转旋转时计算对象的边界框。

-(void)rotateTiles
{
    int aheadcount = [asteroids count];
    CCSprite *tileonPos[aheadcount];
    NSValue *tilecoord1;
    NSValue *spin;
    //NSLog(@"%d",aheadcount);
    for(int v=0; v<aheadcount; v++)
    {
        tilecoord1 = [self.asteroids objectAtIndex:v];
        spin = [self.spinvalues objectAtIndex:v];
        CGPoint spinint = [spin CGPointValue];

        CGPoint cgp = [tilecoord1 CGPointValue];
        tileonPos[v] = [bglayer tileAt:cgp];


        tileonPos[v].rotation+=spinint.x;
        tileonPos[v].anchorPoint=ccp(0,spinint.y);
    }

}
-(void)findTiles
{
    CGPoint tilecoord1;
    int tileGid1;

    for(int x = 0; x<30; x++)
    {
        for(int y = 0; y<20; y++)
        {
            tilecoord1 = ccp(x+(480*currentlevel),y);
            tileGid1 = [bglayer tileGIDAt:tilecoord1];
            if(tileGid1 == 1)
            {
                int randomanchorx = ( (arc4random() % (5+5+1)) -5 );
                int randomspin = ( (arc4random() % (5+5+1)) -5 );

                [self.asteroids addObject:[NSValue valueWithCGPoint:CGPointMake(x,y)]];
                [self.spinvalues addObject:[NSValue valueWithCGPoint:CGPointMake(randomspin,randomanchorx)]];
            }

        }
    }


}

1 个答案:

答案 0 :(得分:0)

移动锚点会使其变得困难,因为锚点也可以被认为是该精灵位置的基础。

我假设你的小行星不是矩形,所以当尝试检测碰撞时,边界框也无济于事。

如果小行星在随机锚点上旋转,它基本上会创建一个围绕锚点的圆形碰撞区域,半径将是从锚点到小行星边缘的最长距离。这可以非常容易地计算,您只需使用ccpDistance()来计算与其他对象的距离。您还需要将计算碰撞对象的半径添加到计算中。基本上是if ( ccpDistance ( point1, point2 ) <= asteroid.radius + collisionObject.radius ) { // collide

要为此计算添加复杂性和真实感,可以使用根据您尝试检测碰撞的对象的角度而改变的半径。因此,如果物体位于小行星的M_PI_4处,则可以计算该角度的半径(根据小行星的尺寸,锚点和旋转)。根据小行星旋转的速度,这可能有点过分。

另一种选择可能是简化游戏,并始终制作定位点ccp( .5, .5 )。这样,您的半径在旋转对象的所有侧面上更可能是均匀的。从物理学的角度来看,这也更有意义,因为我认为物体只能自然地围绕它们的加权中心旋转。