2013-03-05 126 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)。這樣你的半徑在旋轉物體的所有側面上更可能是均勻的。從物理的角度來看,這也更有意義,因爲我認爲物體只能真正自然地圍繞它們的加權中心旋轉。