Плавное движение объектов Sprite-Kit - PullRequest
0 голосов
/ 28 апреля 2020

Я сейчас программирую маленькую понг-игру для Ма c, но я не могу найти способ заставить плавно двигаться весла. Я использую функцию keyDown, чтобы определить, когда нажата клавиша (например, W). Это выполняет команду запуска:

override func keyDown(with event: NSEvent) {
        if event.keyCode == 126 {
            pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0))
        }
}

Дело в том, что когда я нажимаю sh кнопку со стрелкой вверх (keyCode 126), мой спрайт / весло (pR) перемещается один раз, и если я удерживайте кнопку нажатой, она начинает непрерывно двигаться.

Кроме того, если у меня есть две инструкции if (например, одна для обоих игроков в понг), кажется, что нельзя сделать два ввода одновременно, то есть оба игрока не могут sh кнопку и ожидайте ответа.

Как я могу решить эти проблемы? Вся помощь приветствуется.

1 Ответ

0 голосов
/ 28 апреля 2020

Вопрос 1: Почему мое весло не движется плавно?
Почему вы выполняете движение SKAction с продолжительностью 0?
Это то же самое, что и изменение позиции y
Вы можете увеличить длительность, например, 0,1

. Если вы хотите это сделать, вы должны удалять SKAction p1 каждый раз, когда нажимаете клавишу W. Почему? Вы не хотите, чтобы он запускал 2 SKActions одновременно. (Я предполагаю, что pR - ваше весло 1-го игрока. Полагаю, это означает Paddle Right.)

pR.removeAllActions()
pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0.1))

Или, если вы хотите, чтобы это было немедленно, вы можете сделать это вместо этого
(Хотя ваш весло будет двигаться довольно быстро в зависимости от частоты кадров)

pR.position.y += 15

Я рекомендую первый вариант.
Или, если вам нравится второй вариант, потому что он чище, вы заменяете 15 на 10 или 5.


Вопрос 2: Невозможно сделать два входа одновременно
• 1: Невозможно нажать 2 кнопки на «точно» время.
• 2: Что это значит?
• 3: Swift запускает keyDown с первой нажатой клавишей.
• 4: Swift затем запускает keyDown с второй нажатой клавишей.

(Даже если вы думаете, что вы нажали две клавиши одновременно, вы этого не сделали. Одна из них, вероятно, была нажата за микросекунду до второй. Все дело в синхронизации. Это то же самое, что SpriteKit на iOS, Вы не можете иметь два входа «touchesBegan» одновременно. uite редко.)

Как это исправить:
Вы должны быть в состоянии добавить второй оператор 'if' для другого ключа для игрока 2.
Пример кода (за исключением того, что я использовал переключатель для сохранения пробел)

override func keyDown(with event: NSEvent) {
        switch Int(event.keyCode) {

        // W Key
        case 13: // (Player 1 moves up)
        // S Key
        case 1: // (Player 1 moves down)

        // I Key
        case 34: // (Player 2 moves up)
        // K Key
        case 40: // (Player 2 moves down)

        // Someone clicked the wrong key
        default: return
        }
}

Угадай что! Этот код ^^^ почти работает. Я не ответил на ваш третий вопрос.


Вопрос 3: Весло перемещается один раз, останавливается, затем начинает непрерывно двигаться
Так работает функция keyDown. Вот что я рекомендую:

• Отслеживать в переменной, какие клавиши были нажаты
• Использовать функцию keyUp для удаления этих сохраненных значений.

Как это работает?

var keysPressed: Set<Int> = []

override func keyDown(with event: NSEvent) {
        keysPressed.insert(event.keyCode)
}
override func keyUp(with event: NSEvent) {
        keysPressed.remove(event.keyCode)
}
override func update(_ currentTime: TimeInterval) {
        for i in keysPressed {
           // Put my Movement Switch Statement In Here
        }
}

Надеюсь, это поможет! Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь отвечать.


Snap, я только что понял, что на этот вопрос был дан ответ в крошечном разделе комментариев выше. Ну хорошо.

...