我目前正在为Mac编写一个小小的乒乓球游戏,但我无法找到一种方法使桨运动平稳。我使用keyDown函数来检测某个键(例如W)何时被推送。这将执行一个run命令:
override func keyDown(with event: NSEvent) {
if event.keyCode == 126 {
pR.run(SKAction.move(by: CGVector(dx: 0, dy: 15), duration: 0))
}
}
问题是,当我按下箭头向上键(keyCode 126)时,我的sprite/paddle (pR)移动了一次,如果我一直按住按钮,它就开始连续移动。
另外,如果我有两个if -指令(例如两个乒乓球运动员的一个),似乎不能同时输入两个输入,也就是说,两个玩家都不能按一个按钮并期望得到响应。
我如何解决这些问题?所有的帮助都是感激的。
发布于 2020-04-28 09:05:13
问题1:为什么我的桨运动不平稳?
为什么要运行一个持续时间为0的移动SKAction?
这和改变它的y位置完全一样
你可以让持续时间延长到0.1
如果要这样做,每次单击W键时都应该删除p1的SKAction。为什么?您不希望它同时运行2 SKActions。(我假设pR是你的玩家1桨。我想是右边的意思吧。)
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:这是什么意思?
·斯威夫特使用你按下的第一个键运行keyDown。
·斯威夫特然后用你按下的第二个键运行keyDown。
(即使你认为你同时按了两个键,你也没有按。一个键可能在第二个键之前按了一微秒。这都是时间的问题。这对于SpriteKit on iOS来说是一样的,您不能同时拥有两个“touchesBegan”输入。这是相当罕见的。
如何修复:
您应该能够添加第二个'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,我刚刚意识到这个问题在上面这个小小的评论部分得到了回答。哦,好吧。
https://stackoverflow.com/questions/61479342
复制