** STILL NOT WORKING **
我使用以下公式来移动球形圆形,其中accelX
和accelY
是加速度计的值,它工作正常。
但是这段代码中的问题是mRadius
(我将其值固定为50),我需要根据加速度计值更改mRadius
,并且在触及轨道时我还需要弹跳效果。目前我正在开发代码,假设只有一个球在板上。
float degrees = -atan2(accelX, accelY);
int x = cCentrePoint.x + mRadius * cos(degrees);
int y = cCentrePoint.y + mRadius * sin(degrees);
以下是我想开发的游戏:
Balls Game http://iphront.com/wp-content/uploads/2009/12/bdece528ea334033.jpg.jpg
更新:我发送更新的代码......
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];
}
在上面的代码中,我已经将mRadius和mRange(指示轨道)初始化为某个常量进行测试,我没有按照我的预期(与碰撞轨道碰撞时的弹跳效果)相对于加速度计进行移动。帮助我识别出错的地方或发送一些代码片段或链接来完成类似的工作。
我正在寻找比我的代码更好的逻辑,如果你找到了我的分享。
答案 0 :(得分:2)
如果我正确理解你的代码,那么球的位置直接由iPhone的方向(倾斜)控制。因此,将iPhone向右倾斜会将球放在轨道的右侧(3点钟位置)。我相信你可能希望控制球加速(或者至少是它的速度)。然后,将加速度与速度和放置速度相结合,同时考虑约束条件(轨道墙)。
现在设置的方式,我看不出你如何控制多个球(根据你发布的图像)。
然后,对于弹跳效果:如果你的意思是在轨道的墙壁上弹跳,那么这将是mRadius的一个小调制。如果你的意思是通过其他球弹跳,那么你将调整两个球的角度位置(通过角速度)来反映反应。
编辑:为了将加速度加速到速度然后定位,为了这个游戏的目的,你可以使用一阶矩形积分。而且,使加速度与倾斜角度成比例将更加真实。给定来自iPhone本身的加速度值,您可以在球加速度和设备读数之间分配1:1的关系。所以,你喜欢这样的东西:
BallAccX = AccelX * Am_I_NOT_touching_a_wall_in_X_direction() * Ka
BallVelX = BallVelX + BallAccX * dT * Kv
BallPosX = BallPosX + BallVelX * dT * Kp
注意:上面的速度和位置公式是一阶逼近,但是对于这个游戏来说应该足够了。
Ka,Kv,Kp是一些比例系数。选择它们可以根据需要建立感应加速度和球运动之间的关系。 dT是球状态更新之间的时间差。如果球可以自由地水平移动(在倾斜方向上),则函数Am_I_NOT_touching_a_wall_in_X_direction()返回1,否则返回0。
Y运动的计算是对称的。
答案 1 :(得分:0)
经过多次尝试后,我认为不使用任何物理引擎就不容易产生实时效果。所以最好使用BOX2d或Chipmunks或任何其他物理引擎。