Хобрук: Ваш путь к мастерству в программировании

Как сделать так, чтобы объект не покидал экран в быстром режиме?

Я знаю, что есть пара других вопросов по этому поводу, но ни один из них, похоже, не работает, или все они неполные или наполовину завершенные. Мне нужно знать, как удерживать объект в пределах видимого экрана! Итак, у меня есть спрайт космического корабля, который использует наклон устройства и движение ядра, чтобы летать по экрану. Если я наклоню свое устройство, космический корабль в какой-то момент покинет мой экран и продолжит движение в том же направлении. Как сделать так, чтобы космический корабль оставался внутри моего экрана, чтобы, даже если я наклоняю его влево или вправо, он никогда не покидал видимого экрана? Вот часть моего кода для космического корабля.

class GameScene: SKScene, SKPhysicsContactDelegate {

var ship = SKSpriteNode(imageNamed:"Spaceship")
let manager = CMMotionManager()

override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    ship.xScale = 1/5
    ship.yScale = 1/5
    ship.position = CGPoint(x: self.frame.width/(2), y: self.frame.height/1.5)

    self.physicsWorld.contactDelegate = self

    manager.startAccelerometerUpdates()
    manager.accelerometerUpdateInterval = 0.1
    manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()){
        (data, error) in

        self.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)! * 15), CGFloat((data?.acceleration.y)! * 15))

    }

    ship.physicsBody = SKPhysicsBody()
    ship.physicsBody?.affectedByGravity = true

    self.addChild(ship)

}

Я уже пробовал self.view?.bounds и превращал его в физическое тело, но мой космический корабль так и не соприкоснулся с ним.


  • Вы хотите, чтобы он «отскакивал» от краев экрана или просто не выходил за границы экрана? 10.09.2016
  • Попробуйте заменить ship.physicsBody = SKPhysicsBody() на ship.physicsBody = SKPhysicsBody(circleOfRadius:ship.size.width/2) и добавить edgeLoopFromRect вокруг сцены. 10.09.2016
  • Я хочу, чтобы он не перемещался за границу экрана. 10.09.2016
  • Вам нужно установить свойство restitution корабля и края на 0. 10.09.2016
  • @ 0x141E Это сработало! Я попытался добавить edgeLoopFromRect, но это не сработало, поэтому я добавил следующий бит: let edgeFrame = CGRect(origin: CGPoint(x: self.frame.minX - 300,y: self.frame.minY), size : self.frame.size) self.physicsBody = SKPhysicsBody(edgeLoopFromRect: edgeFrame) Казалось, что это создает границу в верхней, правой и нижней частях моего представления. Единственная проблема была с левой стороной. Мой космический корабль все еще может пролететь через левую часть моего экрана. 10.09.2016
  • Подозреваю, что self (сцена) не соответствует размеру вида. Попробуйте изменить его размер, отредактировав GameScene.sks, а затем используйте self.frame в качестве аргумента для реберного цикла. 10.09.2016
  • @ 0x141E Нет, это не работает. Когда я пробую это с self.frame, есть только границы для верха и низа. 11.09.2016
  • Какое устройство (например, iPhone 6) вы используете для тестирования игры? 11.09.2016
  • Айпод. В любом случае я получил ответ 12.09.2016

Ответы:


1

Все, что мне нужно было сделать, это возиться с размером экрана в файле .sks. Я специально сделал свой 800x640, потому что я тестирую на I-Pod 5. Затем я добавил этот фрагмент кода:

let edgeFrame = CGRect(origin: CGPoint(x: ((self.view?.frame.minX)! + 200) ,y: (self.view?.frame.minY)!), size: CGSize(width: (self.view?.frame.width)! + 90, height: (self.view?.frame.height)! + 90))
    self.physicsBody = SKPhysicsBody(edgeLoopFromRect: edgeFrame)

Это создало правильную границу вокруг моего экрана и не позволило моему космическому кораблю покинуть экран. Лучше всего то, что это идеально подходит, поэтому, если вы тестируете на другом устройстве, просто отрегулируйте значения ширины и высоты по мере необходимости. Не забудьте также настроить размер экрана .sks.

Спасибо 0x141E за подсказку в правильном направлении.

11.09.2016
Новые материалы

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

Что в лицо
Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

Создание дизайна обуви с помощью машинного обучения
Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

GraalVM в 2022 году: итоги года
2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..

Быстрая разработка: волшебный мир больших языковых моделей
РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..