Я придумал очень подходящую реализацию, используя itertools.product в этом случае (это реализация, где вы хотите все комбинации
unique_perm_list = [''.join(p) for p in itertools.product(['0', '1'], repeat = X) if ''.join(p).count() == somenumber]
, это по существу комбинация (n над k) с n = X и somenumber = k itertools.product () итерации от k = 0 до k = X, последующая фильтрация с подсчетом гарантирует, что в список будут внесены только перестановки с правильным количеством единиц. Вы можете легко увидеть, что это работает, когда вы вычислить n над k и сравнить его с len (unique_perm_list)
Используйте SKAction.playSoundFileNamed
. Когда вы создаете экземпляр SKAction
раньше времени, он выполняет всю необходимую подготовку для выполнения действия (в данном случае, воспроизведения звука) без запаздывания во время игрового процесса. Чтобы запустить действие (воспроизвести звук), вызовите runAction
на узле - это может быть любой узел, даже сама сцена.
Так как не имеет значения, какой узел вы используете для звуковых целей, используйте то, что наиболее удобно. Например, если вы просто воспроизводите звук, вы можете называть runAction
на сцене. Но если ваш звук является частью группы действий или последовательности, которые, скажем, оживляют спрайт, вы можете сделать звук частью действия этой последовательности и воспроизвести ее на спрайте, который вы анимации.
См. Руководство по программированию SpriteKit .
Не связанный свиток Swift: используйте let
вместо var
для ссылок, которые не будут меняться. Это может помочь вам избежать появления ошибок позже, и, вероятно, это поможет компилятору оптимизировать ваш код.
вы не должны вызывать prepareToPlay при столкновении, prepareToPlay устанавливает звуковой буфер, делайте это в своей функции didMoveToView
runAction:withKey:
иremoveActionForKey:
. Для последнего проверьте, мертв ли герой, прежде чем воспроизводить звук. – rickster 12 April 2015 в 17:56