1

所以我所做的是我为我的 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)]];
            }

        }
    }


}
4

1 回答 1

0

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

我假设你的小行星不是矩形,所以边界框在尝试检测碰撞时没有多大帮助。

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

为了增加此计算的复杂性和真实性,您可以使用根据您尝试检测碰撞的对象的角度而变化的半径。因此,如果物体与M_PI_4小行星成角度,您将计算该角度的半径(根据小行星的尺寸、锚点和旋转)。根据小行星旋转的速度,这可能有点过头了。

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

于 2013-03-05T17:24:18.887 回答