Как лучше всего давать падающий шар реальный мир
Я довольно новый разработчик приложений и очень новичок в 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);
}
Вам нужно поиграть, чтобы найти оптимальные факторы для силы тяжести.
Надеюсь, что полезно