所以我所做的是我的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 :(得分:0)
移动锚点会使其变得困难,因为锚点也可以被认为是该精灵位置的基础。
我假设你的小行星不是矩形,所以当尝试检测碰撞时,边界框也无济于事。
如果小行星在随机锚点上旋转,它基本上会创建一个围绕锚点的圆形碰撞区域,半径将是从锚点到小行星边缘的最长距离。这可以非常容易地计算,您只需使用ccpDistance()
来计算与其他对象的距离。您还需要将计算碰撞对象的半径添加到计算中。基本上是if ( ccpDistance ( point1, point2 ) <= asteroid.radius + collisionObject.radius ) { // collide
。
要为此计算添加复杂性和真实感,可以使用根据您尝试检测碰撞的对象的角度而改变的半径。因此,如果物体位于小行星的M_PI_4
处,则可以计算该角度的半径(根据小行星的尺寸,锚点和旋转)。根据小行星旋转的速度,这可能有点过分。
另一种选择可能是简化游戏,并始终制作定位点ccp( .5, .5 )
。这样,您的半径在旋转对象的所有侧面上更可能是均匀的。从物理学的角度来看,这也更有意义,因为我认为物体只能自然地围绕它们的加权中心旋转。