2014-03-27 15 views
16

我是一個相當新的應用程序開發者,並且對於Sprite Kit來說是非常新的。我正在創造一個遊戲,我想要一個球始終向下墜落,就好像它在重力狀態下一樣。這只是一個2D應用程序,所以我想要的是當球落下時,當您將手機向左傾斜時,球向下移動並離開屏幕,如果您將手機向右傾斜,則球向下並在屏幕上向右移動。爲了得到更好的畫面是什麼我想我在Photoshop做了一個快速圖:如何最好地給出落球實際世界萬有引力

Ball falling diagram

我只是想一些意見上這是最簡單的和最好的方式。我的第一個想法是記錄偏航並用它來決定球向左或向右移動多遠。這需要進行一些計算才能使球完全落入90度,雖然聽起來對我來說是可能的,但我不確定這是否可行。

有沒有人認爲這是做到這一點或有沒有更好的辦法呢?

當我嘗試出我的第一個想法時遇到的一個問題是當我傾斜手機,球左右移動(沒有任何適當的計算,因此完全不準確),我會將手機向左傾斜(例如),我越傾斜它,它變得越不敏感,所以球就會少走。這將阻止我的想法工作,我不確定是否有辦法解決它。

我遇到的一個更大的問題是當我坐在座位上轉動時,偏航也會改變!我認爲這與指南針有關,因爲我沒有這樣做,所以滾動或音高都不會改變。我相信可以做些什麼來糾正這一點,因爲我從來沒有使用陀螺儀玩的遊戲出現這個問題。如果有人能夠用正確的方向指出我的意思,我會很感激,或者我可以在另外一個新問題中提問。下面是我在photoshop中快速繪製的另一個圖表,以幫助解釋問題。圖1是我希望能夠傾斜手機的方式,但當您轉身時(圖2),球會左右移動,具體取決於您轉身的距離。 (是的,這意味着是一個人拿着手機在圖2)

phone tilt diagram

幫助將不勝感激!

回答

10

這是我從前一個演示項目中抽取的一些代碼。這是通過將一些視圖與UIKit Dynamics連接而創建的一條繩索。根據您的描述,我相信這種行爲與您所尋找的行爲相同。

需要注意的是,該代碼遵循重力的真實方向,因此如果將手機放平,重力將在平行於屏幕的平面上爲0或接近0,因爲其完整的大小將沿着z軸。您可能需要將其歸一化,以便方向改變,但幅度保持不變。

在本示例中,self.gravityUIGravityBehavior,但您可以使用相同的代碼來提供所需的任何類型的重力模擬。只需註銷Motion Manager處理程序中的值即可查看您可能獲得的值。

self.motionManager = [[CMMotionManager alloc] init]; 
[self.motionManager startDeviceMotionUpdatesToQueue:self.motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) { 
    CMAcceleration gravity = motion.gravity; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.gravity.gravityDirection = CGVectorMake(gravity.x, -gravity.y); 
    }); 
}]; 

我希望這有助於!

+0

非常感謝您的幫助。我的代碼在我的項目中工作,但我不確定如何讓它移動球,因爲我不能只乘以x值的屏幕寬度,所以你會建議什麼?我相信這比我想象的要簡單,但我想不出一個辦法。我知道你從一個聽起來非常不同的項目中抽取了代碼,但比我更有經驗的人可能能比我更好地工作!謝謝! –

+0

也許墜落物體的位置公式會有所幫助?位移= 1/2g t^2,其中g是剛剛找到的重力矢量,t是經過的時間。更多[這裏](http://en.m.wikipedia.org/wiki/Equations_for_a_falling_body)。 –

+0

哦,我忘了你正在使用SpriteKit。我對API不熟悉,但是不存在可以插入該向量的重力行爲? –

2

下面是SpriteKit的解決方案:

1。創建一個新的SpriteKit項目 enter image description here

2.增加了CoreMotion框架

enter image description here

3.進口在你的 'MyScene' 類的新框架:

#import <CoreMotion/CoreMotion.h> 

4.Example是針對此方向進行了優化:

enter image description here

5.Add此代碼到 'MyScene' 類

sprite.size = CGSizeMake(20, 20); 
    sprite.physicsBody= [SKPhysicsBody bodyWithCircleOfRadius:sprite.size.width/2]; 

6.增加這個代碼的 'MyScene' 的 '更新' 方法的 '的touchesBegan' 方法類

CMMotionManager *_motionManager; 
-(void)update:(CFTimeInterval)currentTime { 
    /* Called before each frame is rendered */ 
    if (_motionManager== nil) { 
     _motionManager=[[CMMotionManager alloc]init]; 
     _motionManager.deviceMotionUpdateInterval=0.025; 
     [_motionManager startDeviceMotionUpdates]; 
    } 

    CMAcceleration gravity= _motionManager.deviceMotion.gravity; 
    self.physicsWorld.gravity = CGVectorMake(gravity.y*4, -gravity.x/4); 

} 

你必須四處尋找重力的最佳因素。

希望是有用的

+0

謝謝Stefan您的意見。看到不同的解決方案很有幫助。我已經意識到,使用重力來影響球的橫向移動是不現實的,因爲當你打開設備時,會有延遲,然後是加速。這不是真實世界的物理學,我目前正在研究如何在不使用重力的情況下控制橫向運動。 –

+0

嗨大衛。如果你找到解決方案,如果你能在這裏分享,這將是非常棒的。我想很多人(包括我)都嘗試過。 – Stefan