Как лучше всего давать падающий шар реальный мир

Я довольно новый разработчик приложений и очень новичок в Sprite Kit. Я создаю игру, в которой хочу, чтобы мяч всегда падал вниз, как если бы он находился в гравитации. Это всего лишь приложение 2d, поэтому все, что я хочу, это когда мяч падает, когда вы наклоняете телефон влево, мяч перемещается вниз и остается на экране, а если вы наклоняете телефон вправо, то мяч перемещается вниз и прямо на экране, Чтобы дать лучшее представление о том, что я хочу, я сделал быструю диаграмму в фотошопе:

Ball falling diagram

Мне бы хотелось, чтобы некоторые мнения о том, что это самый простой и лучший способ сделать это. Моя первая мысль заключалась в том, чтобы зафиксировать рывок и использовать его, чтобы диктовать, как далеко мяч перемещается влево или вправо. Это потребует некоторых вычислений, чтобы заставить мяч отлично упасть на 90 градусов, и хотя это кажется мне возможным, я не уверен, действительно ли это возможно.

Кто-нибудь думает, что это способ сделать это, или есть лучший способ этого?

Проблема, с которой я столкнулся, когда пыталась реализовать свою первую идею, была, когда я наклонял телефон, мяч двигался влево и вправо (без каких-либо правильных вычислений, так что это было совершенно неточно), я бы наклонил телефон влево (для пример), и чем дальше я наклонял его, тем менее чувствительным оно становилось, поэтому мяч двигался бы меньше. Это помешало бы моей идее работать, и я не уверен, есть ли там способ.

Большей проблемой, с которой я столкнулся, было то, что я вращался на своем месте, рыскание тоже изменилось бы! Я предполагаю, что это имеет какое-то отношение к компасу, поскольку ни рулон, ни шаг не изменились, как я сделал это. Я уверен, что что-то можно сделать, чтобы исправить это, потому что у меня никогда не было этой проблемы с играми, в которые я играю, которые используют гироскоп. Если бы кто-то мог указать мне в правильном направлении, я был бы благодарен, или я мог бы просто спросить об этом в отдельном новом вопросе. Ниже приведена еще одна диаграмма, которую я быстро разработал в Photoshop, чтобы помочь объяснить проблему. Диаграмма 1 - это способ, которым я хочу наклонять телефон, но когда вы поворачиваетесь (диаграмма 2), шар перемещается влево или вправо в зависимости от того, как далеко вы поворачиваете. (Да, это должно быть лицо, держащее телефон на диаграмме 2)

phone tilt diagram

Помощь будет принята с благодарностью!

Ответы

Ответ 1

Вот код, который я дернул из демонстрационного проекта, который я построил некоторое время назад. Это был кусок веревки, созданный путем соединения кучки взглядов с 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);
    });
}];

Надеюсь, это поможет!

Ответ 2

Здесь решение с SpriteKit:

1.Создайте новый проект SpriteKit enter image description here

2. Добавить Framework CoreMotion

enter image description here

3.Используйте новую структуру в своем классе "MyScene":

#import <CoreMotion/CoreMotion.h>

4. Пример оптимизирован для этой ориентации:

enter image description here

5. Добавьте этот код к методу "touchhesBegan" класса "MyScene"

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

6. Добавьте этот код к методу 'update' класса 'MyScene'

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

}

Вам нужно поиграть, чтобы найти оптимальные факторы для силы тяжести.

Надеюсь, что полезно