2013-01-04 73 views
0

我想拋出一個有拋射體運動的球。我在屏幕中心有一隻猴子,onTouchBegin我在觸摸的起點和onTouchEnded我正在取得終點。從開始和結束點,我正在採取他們之間的角度值。像30度,45度或90度。 這是我的代碼,通過該我已經計算開始的角度向端點Cocos2d中的拋射物運動iphone

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

我現在用拋射體運動式拋與我已經從上面的公式計算角球。

init方法裏面

 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我已經叫火法,將拋出球

-(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扔到從開始到結束點的角度。

我可以扔它像紅色標記,但我想扔它刷藍色標記。但它不會像我一樣滑動屏幕。

enter image description here

+1

你爲什麼要在X和Y上加120和225? – bluestunt

+0

我從其他網站複製了這個等式。 – Zohaib

回答

1

我不是您正在使用要做到這一點有什麼數學一定,我覺得你的文檔,有點混亂。

一般來說,項目瓷磚運動,這是你需要做什麼:

找出起飛角是相對於水平。然後根據想要的物體的任何初始速度,使用該速度,然後觸發方程式將初始速度放入矩形分量。

例如:

如果初始速度爲10,在y方向上的初始速度將10sin(角度),並在x方向上這將是10cos(角度)。

然後,在更新應該使用運動學方程子畫面的位置:http://www.physicsclassroom.com/class/1dkin/u1l6c.cfm

首先更新速度:

速度在Y方向:V = V(初期)+重力*(Δ - 時間)

X方向的速度是恆定的,除非您想要考慮某種阻力以使事情變得複雜得多。

然後定位y = oldPositionY +速度(在Y方向上)*(Delta-time)+ 1/2(重力)(delta-time)^ 2。

和位置x = oldPositionX + Xvelocity *增量時間

我已經做了一些拋運動的東西,我發現你需要做的重力較大的常數,約500東西,使它看起來栩栩如生。讓我知道這是否令人困惑,或者你不知道如何實現它。

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

它向你展示瞭如何使用物理引擎,所以你不需要做太多的數學運算。本教程中的所有「子彈」也隨着拋射體運動而移動。

+0

我有點困惑,不知道如何實現它 – Zohaib

+0

我不知道如何在xcode中實現它。我havnt嘗試任何事情因爲我從哪裏開始,在哪裏結束 – Zohaib

+0

檢查我剛剛放入的教程 – bluestunt

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)才能獲得您要的外觀。

編輯:我的不好,我不得不重新在位置計算我的數學。我的差距有點生疏。