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