Iphone 当球击中跑道时,如何获得碰撞效果或反弹

Iphone 当球击中跑道时,如何获得碰撞效果或反弹,iphone,objective-c,math,physics,Iphone,Objective C,Math,Physics,我使用下面的公式来移动球,其中accelX和accelY是来自加速计的值,它工作正常 但该代码中的问题是mRadius(我将其值固定为50),我需要根据加速计值更改mRadius,并且当它接触轨道时,我需要反弹效果。目前,我正在开发代码,假设板上只有一个球 ** STILL NOT WORKING ** 以下是我想开发的游戏的快照: 更新:我正在发送更新的代码 float degrees = -atan2(accelX, accelY); in

我使用下面的公式来移动球,其中
accelX
accelY
是来自加速计的值,它工作正常

但该代码中的问题是
mRadius
(我将其值固定为50),我需要根据加速计值更改
mRadius
,并且当它接触轨道时,我需要反弹效果。目前,我正在开发代码,假设板上只有一个球

                        ** STILL NOT WORKING **
以下是我想开发的游戏的快照:

更新:我正在发送更新的代码

float degrees = -atan2(accelX, accelY);
int x = cCentrePoint.x + mRadius * cos(degrees);
int y = cCentrePoint.y + mRadius * sin(degrees);
在上面的代码中,我已将mRadius和mRange(指示轨迹)初始化为某个常数以进行测试,我没有得到球相对于加速度计的预期移动(与轨迹碰撞时的反弹效果)。请帮助我识别哪里出了问题,或者发送一些代码片段或链接,这些代码片段或链接可以完成类似的工作


如果你能与我分享,我正在寻找比我的代码更好的逻辑。

如果我正确理解了你的代码,那么球的位置直接由iPhone的方向(倾斜)控制。因此,向右倾斜iPhone会将球放在轨道的右侧(3点钟)。我相信你可能想要控制球的加速度(或者至少是速度)。然后,将加速度集成到“速度”和“放置速度”,同时考虑约束(轨迹墙)

现在的设置方式,我看不出你如何控制一个以上的球(根据你发布的图片)

然后,对于反弹效果:如果你的意思是通过轨迹的墙壁反弹,那么这将是对mRadius的一个小的调制。如果你的意思是被另一个球反弹,那么你需要调整两个球的角位置(通过角速度)来反映反应

编辑:对于加速度到速度再到位置的积分,对于本游戏的目的,可以使用一阶矩形积分。此外,使加速度与倾斜角度成比例将更为现实。给定iPhone本身的加速度值,您可以在球体加速度和设备读数之间指定1:1的关系。所以,你会喜欢这样的东西:

 mRadius = 5;
 mRange = NSMakeRange(0,60);

-(void) updateBall: (UIAccelerationValue) accelX 
                                  withY:(UIAccelerationValue)accelY
{

    float degrees = -atan2(accelX, accelY);
    int x = cCentrePoint.x + mRadius * cos(degrees);
    int y = cCentrePoint.y + mRadius * sin(degrees);

    //self.targetRect is rect of ball Object
    self.targetRect = CGRectMake(newX, newY, 8, 9);
    self.currentRect = self.targetRect;

    static NSDate *lastDrawTime;

    if(lastDrawTime!=nil)
    {
       NSTimeInterval secondsSinceLastDraw =
                    -([lastDrawTime timeIntervalSinceNow]);

       ballXVelocity = ballXVelocity + (accelX * secondsSinceLastDraw) 
               * [self isTouchedTrack:mRadius andRange:mRange];
       ballYVelocity = ballYVelocity + -(accelY * secondsSinceLastDraw) 
               * [self isTouchedTrack:mRadius andRange:mRange];

      distXTravelled = distXTravelled + secondsSinceLastDraw
                          * ballXVelocity * 50;
      distYTravelled = distYTravelled + secondsSinceLastDraw 
                          * ballYVelocity * 50;

      //Updating the ball rect  
      CGRect temp = self.targetRect;
      temp.origin.x += distXTravelled;
      temp.origin.y += distYTravelled;

      //calculating new radius after updating ball position
      int radius = (temp.origin.x - cCentrePoint.x) / 
                               cos(degreesToRadians(degrees));

     if( !NSLocationInRange(abs(radius),mRange))
     {
         //Colided with the tracks...Need a better logic here
      ballXVelocity = -ballXVelocity;
     }
     else
     {
           // Need a better logic here
       self.targetRect = temp; 
     }

  }

  [lastDrawTime release];
  lastDrawTime = [ [NSDate alloc] init];
}
注:上述速度和位置公式为一阶近似值,但应足以用于本游戏

Ka、Kv、Kp是一些比例系数。选择它们,使感测加速度和球运动之间的关系如您所愿。dT是球状态更新之间的时间差。函数Am_I_NOT_touch_a_wall_in_X_direction()如果球可以自由水平移动(倾斜方向),则返回1,否则返回0


Y轴运动的计算是对称的。

经过多次尝试,我认为不使用任何物理引擎就不容易产生实时效果。所以最好使用BOX2d、花栗鼠或任何其他物理引擎。

太模糊-试着问一个特定的问题?“触碰其他圆圈”的意思是“其他球”或“其他轨迹的圆圈”?我需要球触碰其他球时的两种效果以及轨迹。我不熟悉iPhone编程环境,但有两件事突然出现在我眼前:1。你的花括号看起来不平衡。你好像在做速度的二重积分。首先是DistxTraveled,然后是temp.origin.x。我认为在第一个例子中,你应该省略“distxtraveled+”部分。旁白:将弧度转换为度,然后再转换回弧度是愚蠢的。你能发送一些将加速度与速度相结合的示例代码吗?嗯,这真的取决于“不平滑”的含义。原因很多。在深入研究之前,坚持使用特定的“平滑算法”是没有意义的。
BallAccX = AccelX * Am_I_NOT_touching_a_wall_in_X_direction() * Ka
BallVelX = BallVelX + BallAccX * dT * Kv
BallPosX = BallPosX + BallVelX * dT * Kp