SpriteKit碰撞多次调用

时间:2019-03-07 16:24:25

标签: swift sprite-kit

我是SpriteKit的新手,正在通过制作一个飞扬的鸟形游戏来学习。

我正在使用一个PhyshicsBody绑定到纹理的鸟节点。

问题在于,当小鸟击中得分节点时,偶尔会记录到多次碰撞。我在第一次调用该函数时添加了一个if来删除节点,但是我仍在注册多个冲突。

如果使用该语句,我本可以认为这可以防止问题发生,为什么仍会发生这种情况?

感兴趣的功能:

function encryption() {
    switch (document.getElementById("methods").value) {
        case "Encrypt":
            var str = document.getElementById("text_encode").value;
            // store the original string in a hidden field
            document.getElementById("text_HiddenField").value = str;

            var amount = Number(prompt("Number of shift"));
            var output = "";

            for (var i = 0; i < str.length; i++) {
                var c = str[i];
                var code = str.charCodeAt(i);

                if ((code >= 65) && (code <= 90))
                    c = String.fromCharCode(((code - 65 + amount) % 26) + 65);
                else if ((code >= 97) && (code <= 122))
                    c = String.fromCharCode(((code - 97 + amount) % 26) + 97);

                output += c;
            }
            document.getElementById("text_decoded").value = output;
            break;
    }
}

function decryption() {
    switch (document.getElementById("methods1").value) {
        case "Decrypt":
            str = document.getElementById("text_HiddenField").value;
            document.getElementById("text_decoded").value = str;
            break;
    }
}

完整代码:

<label for="methods">Select your methods : </label>
<br>
<br>
<select name="methods" id="methods">

    <option value="Encrypt">Encrypt</option>


</select>
<br>
<br>
<input type="button" value="Encrypt" onClick=encryption()>


<br>
<br>
<textarea name="text" id="text_decoded" style="width: 10%;height: 40px"></textarea>

<textarea name="text" id="text_encode"> Enter message here: That you wish to decrypt</textarea>
<textarea name="text" id="text_HiddenField"></textarea> <!--Hide This-->
<br>
<br>

<label for="methods1">Select your methods : </label>
<br>
<br>
<select name="methods" id="methods1">

    <option value="Decrypt">Decrypt</option>


</select>
<br>
<br>
<input type="button" value="Decrypt" onClick=decryption()>

1 个答案:

答案 0 :(得分:1)

对于刚开始使用物理学进行游戏开发的人来说,这是一个常见问题。

func didBegin(_ contact:SKPhysicsContact)每秒被调用60次(最佳)。因此,这意味着当您的“鸟”与某个物体碰撞时,它每秒会被检测到60次。您需要在某处放置一个标志来确定该鸟是否已与某个物体碰撞,因此如果该标志为真,则不再进行碰撞检查。

看到自己没有鸟,您可以在GameScene中放置一个变量来存储此碰撞。

private var isDead = false

然后,当对象与管道碰撞时,将其设置为true

isDead = true

最后在检查碰撞时使用它

if moving.speed > 0 && !isDead {
}

或者,我希望您在didBegin函数的开头。这样可以节省您的代码,并在代码中嵌套“如果”

guard moving.speed > 0, !isDead else { return }