2013-03-05 129 views
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)]]; 
      } 

     } 
    } 


} 

回答

0

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

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

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

要增加此计算的复杂性和真实感,您可以使用根据您试图检测碰撞的对象的角度而改变的半径。因此,如果物体与小行星的角度为M_PI_4,则可以计算半径应该在该角度(根据小行星尺寸,锚点和旋转)的内容。这可能是矫枉过正,取决于小行星旋转的速度。

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