Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何最好地给予落下的球真实世界的重力_Ios_Objective C_Sprite Kit_Game Physics_Core Motion - Fatal编程技术网

Ios 如何最好地给予落下的球真实世界的重力

Ios 如何最好地给予落下的球真实世界的重力,ios,objective-c,sprite-kit,game-physics,core-motion,Ios,Objective C,Sprite Kit,Game Physics,Core Motion,我是一个相当新的应用程序开发人员,对Sprite工具包非常陌生。我正在创造一个游戏,我希望一个球总是向下落,就像它在重力作用下一样。这只是一个2d应用程序,所以我想要的只是当球落下时,当你将手机向左倾斜时,球在屏幕上向下和向左移动,如果你将手机向右倾斜,球在屏幕上向下和向右移动。为了更好地了解我想要什么,我在photoshop中制作了一个快速图表: 我只是想听听关于哪种方法最简单最好的意见。我的第一个想法是记录偏航并用它来指示球向左或向右移动的距离。这需要一些计算才能让球完美地落在90度角上,

我是一个相当新的应用程序开发人员,对Sprite工具包非常陌生。我正在创造一个游戏,我希望一个球总是向下落,就像它在重力作用下一样。这只是一个2d应用程序,所以我想要的只是当球落下时,当你将手机向左倾斜时,球在屏幕上向下和向左移动,如果你将手机向右倾斜,球在屏幕上向下和向右移动。为了更好地了解我想要什么,我在photoshop中制作了一个快速图表:

我只是想听听关于哪种方法最简单最好的意见。我的第一个想法是记录偏航并用它来指示球向左或向右移动的距离。这需要一些计算才能让球完美地落在90度角上,虽然我觉得这是可能的,但我不确定这是否真的是可能的

有人认为这是一种方法吗?或者有更好的方法吗

我在尝试我的第一个想法时遇到的一个问题是,当我倾斜手机时,球会左右移动(没有任何适当的计算,所以它完全不准确),我会将手机向左倾斜(例如),倾斜越远,它的灵敏度越低,球向左移动的距离就越小。这会妨碍我的想法发挥作用,我不确定是否有办法

我遇到的一个更大的问题是,当我在座位上旋转时,偏航也会改变!我想这与指南针有关,因为我这样做时,横摇和俯仰都没有改变。我确信可以做些什么来纠正这一点,因为我玩的游戏中使用陀螺仪从来没有遇到过这个问题。如果有人能给我指出正确的方向,我将不胜感激,或者我可以用一个单独的新问题来提问。下面是我在photoshop中快速绘制的另一个图表,帮助解释这个问题。图1是我希望能够倾斜手机的方式,但当你转身时(图2),球会向左或向右移动,这取决于你转身的距离。(是的,在图2中是指一个人拿着电话)


非常感谢您的帮助

这里是我从不久前构建的演示项目中提取的一些代码。它是通过将一组视图与UIKit Dynamics连接起来而创建的一条绳索。根据你的描述,我相信你的行为和你想要的是一样的

需要注意的是,此代码遵循真实的重力方向,因此如果您将手机平放,平行于屏幕的平面上的重力将为0或接近0,因为其完整大小将沿z轴。您可能希望对其进行规格化,以便改变方向,但幅值保持不变

在本示例中,
self.gravity
是一个
UIGravityBehavior
,但是您可以使用相同的代码来提供任何类型的重力模拟。只需注销“运动管理器”处理程序中的值,即可查看您可能获得的值的类型

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);
    });
}];

我希望这有帮助

以下是SpriteKit的解决方案:

1.创建一个新的SpriteKit项目

2.添加CoreMotion框架

3.在“MyScene”类中导入新框架:

#import <CoreMotion/CoreMotion.h>
6.将此代码添加到“MyScene”类的“update”方法中

    sprite.size = CGSizeMake(20, 20);
    sprite.physicsBody= [SKPhysicsBody bodyWithCircleOfRadius:sprite.size.width/2];
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);

}
你必须四处玩转,找到最适合重力的因素


希望是有用的

Swift代码:

 if motion.isDeviceMotionAvailable {
            self.motion.deviceMotionUpdateInterval = 1.0 / 60.0
            self.motion.showsDeviceMovementDisplay = true
            self.motion.startDeviceMotionUpdates(using: .xMagneticNorthZVertical)
            // Configure a timer to fetch the motion data.
            self.timer = Timer(fire: Date(), interval: (1.0/60.0), repeats: true,
                               block: { (timer) in
                                if let data = self.motion.deviceMotion {
                                  let gravityData = data.gravity
                                  scene.physicsWorld.gravity = CGVector(dx: 9.8 * (gravityData.x), dy: 9.8 * (gravityData.y))
                                }
            })
            // Add the timer to the current run loop.
            RunLoop.current.add(self.timer, forMode: .defaultRunLoopMode)
          }

非常感谢你的帮助。我的项目中有你的代码,但我不确定如何让它移动球,因为我不能将屏幕宽度乘以x值,所以你有什么建议?我相信这比我想象的要简单,但我想不出一个办法。我知道你是从一个听起来很不一样的项目中提取代码的,但是比我更有经验的人可能会比我做得更好!谢谢也许下落物体位置的公式会有所帮助?位移=1/2 g t^2,其中g是刚找到的重力向量,t是经过的时间。更多。哦,我忘了你在用SpriteKit。我不熟悉API,但是有没有重力行为可以插入该向量?非常抱歉回复太晚。非常忙!非常感谢你的帮助。我保证我会把你的答案标为“已回答”。不管怎样,关于你提到的重力行为,你知道我在哪里可以找到更多关于它的信息吗?谷歌搜索并没有显示任何我认为有用的结果。如果你能帮上忙的话,不用担心,因为我知道你不熟悉SpriteKit。我相信我最终会找到答案的,否则我会放弃并找到一个更简单的想法。。。(万不得已)啊,好的。这对我来说已经足够解决剩下的问题了。谢谢你的帮助!祝你度过愉快的一天。谢谢Stefan的支持。看到不同的解决方案很有帮助。我已经意识到,利用重力来影响球的侧向运动是不现实的,因为当你转动设备时,会有一个延迟,然后是一个加速度。这不是真实世界的物理,我目前正在研究如何在不使用重力的情况下控制侧向运动。嗨,大卫。如果你能找到一个解决方案,如果你能在这里分享,那就太好了。我想很多人(包括我)也尝试过同样的方法。