0

我想扔一个有抛射运动的球。我在屏幕中心有一只猴子,onTouchBegin 我正在获取触摸的起点,而 onTouchEnded 我正在获取终点。从起点和终点我取它们之间的角度值。比如 30 度、45 度或 90 度。这是我的代码,我通过它计算了起点到终点的角度

    float angleRadians = atan2(startTouchPoint.x - touchPoint.x, startTouchPoint.y -    touchPoint.y);
    float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);
    float cocosAngle = -1 * angleDegrees;

现在我正在使用抛射运动公式以我根据上述公式计算的角度投掷球。

内部初始化方法

        gravity = 9.8; // metres per second square
        X = 0;
        Y = 0;
        V0 = 50; // meters per second -- elevation
        VX0 = V0 * cos(angle); // meters per second
        VY0 = V0 * sin(angle); // meters per second
        gameTime = 0;

并且 onTouchEnded 我已经调用了会扔球的 fire 方法

-(void)fire:(ccTime) dt
{

    CCLOG(@"Angle 1: %.2f",angle);
    gameTime += dt*6;

    // x = v0 * t * cos(angle)
    X = (V0 * gameTime * cos(angle))/2+120;

    // y = v0 * t * sin(angle) - 0.5 * g * t^2
    Y = (V0 * gameTime * sin(angle) - 0.5 * gravity * pow(gameTime, 2))/2+255;

    if (Y > 50)

    {
        sprite_webfire.position = ccp(X,Y);
        flag = true;
    }

    else
    {

        //angleValue += 15;
        angleValue = angle;
        angle = [self DegreesToRadians:angleValue];
        gravity = 9.8; // metres per second square
        X = 0;
        Y = 0;
        V0 = 50; // meters per second -- elevation
        VX0 = V0 * cos(angle); // meters per second
        VY0 = V0 * sin(angle); // meters per second
        gameTime = 0;

        // [self pauseSchedulerAndActions];
    }

    if (Y < 50)

    {
        [self unschedule:@selector(fire:)];        
    }

    NSLog(@"ball (%lf,%lf), dt = %lf angle value %d", X, Y, dt,angleValue);
}

此代码正在运行。通过这段代码,我可以以弹丸运动的方式扔球,但我不能把它扔到我想扔的地方。我不能从起点到终点将 wrt 扔到给定的角度。

我可以像红色标记一样扔它,但我想用刷卡扔它蓝色标记。但它不像我在刷屏幕那样扔。

在此处输入图像描述

4

2 回答 2

1

我不确定您使用什么数学来执行此操作,我发现您的文档有点混乱。

通常,对于项目瓷砖运动,这是您需要做的:

找出相对于水平面的起飞角度。然后根据您希望对象具有的任何初始速度,使用它并触发方程将您的初始速度放入矩形分量中。

例如:

如果初速度为 10,则 y 方向的初速度为 10sin(angle),x 方向的初速度为 10cos(angle)。

然后在更新精灵的位置时,您应该使用运动学方程:http ://www.physicsclassroom.com/class/1dkin/u1l6c.cfm

首次更新速度:

Y方向的速度:V = v(初始)+重力*(增量时间)

X 方向的速度是恒定的,除非您想考虑某种阻力以使事情变得更加复杂。

然后位置 y = oldPositionY + 速度(在 Y 方向)*(增量时间)+ 1/2(重力)(增量时间)^2。

和位置 x = oldPositionX + Xvelocity*delta-time

我做了一些抛射运动的东西,我发现你需要将重力设为一个很大的常数,大约 500 以使其看起来栩栩如生。让我知道这是否令人困惑或者您不知道如何实现它。

我建议你看看下面的教程:http ://www.raywenderlich.com/4756/how-to-make-a-catapult-shooting-game-with-cocos2d-and-box2d-part-1 .

它向您展示了如何使用物理引擎,因此您不需要做太多的数学运算。教程中的所有“子弹”也随着弹丸运动而移动。

于 2013-01-04T23:45:15.763 回答
0

我将在已经说过的内容中添加一些内容(这很好)。首先,您不应该浪费时间计算任何角度。坚持使用矢量来提高速度。换句话说,从触摸开始和结束位置获取初始速度矢量,这将是您的 (v0x, v0y)。例如:

CGPoint initialVelocity = ccpSub(touchPoint, startTouchPoint);
float v0x = initialVelocity.x;
float v0y = initialVelocity.y;

如果您希望为初始速度矢量分配不同的大小,只需对其进行归一化,然后将其乘以一个新的大小。

CGPoint unitVelocity = ccpNormalize(initialVelocity);
float magnitude = 200; // or whatever you want it to be
CGPoint velocity = ccpMult(unitVelocity, magnitude);

无论如何,正确设置此速度后,您可以像以前一样在位置计算中使用它,但不会增加计算角度的复杂性。

-(void) fire:(ccTime)dt
{
    .
    .
     gameTime += dt;
     // if x(t) = x0 + v0x*t, then dx = v0x*dt
     x += v0x*dt;

     // if y(t) = y0 + v0y*t - 0.5t^2, then dy = v0y*dt - g*t*dt
     y += (v0y * dt - g*gameTime*dt);
     .
     .
}

你也不应该设置v0 = 50. 按照我的建议计算矢量的速度。

需要考虑的重要一点是,您正在计算基于米单位的物理世界中的运动应该是什么。屏幕以点而不是米为单位运行,因此您可能必须将缩放因子应用于新位置 (x,y) 以获得您想要的外观。

编辑:我的错,我不得不在位置计算中重新审视我的数学。我的差速器有点生锈了。

于 2013-01-05T10:22:25.423 回答