如何检测此JavaScript游戏的对象碰撞

How to detect object collision for this JavaScript game

本文关键字:游戏 JavaScript 对象 碰撞 何检测 检测      更新时间:2023-09-26

试图整理一个小游戏进行练习,我遇到了一个问题。 关键是抓住哥布林,但我不知道如何让游戏检测到玩家击中了哥布林。

到目前为止,只有当您的位置 Y 和 X 与敌人轴匹配时,您才能检测到触摸。 我怎样才能增加两者的宽度或更好的触摸检测方法。

在这里尝试一下:https://jsfiddle.net/acbkk7cs/4/

风格:

#map{
        margin: 0 auto;
        height: 510px;
        width: 510px;
        background-image:url(background.png);
    } 
    .character{
        background-image:url(character.png);
        z-index:1;
        position: relative;
        top: 150px;
        left: 150px;
        height: 32px;
        width: 33px;
    }
    .monster{
        background-image:url(monster.png);
        position: relative;
        height: 32px;
        width: 30px;
    }

Javascript:

 $(document).ready(function(){
            var char = { 
                player : $(".character"),
                x: 150,
                y: 150
            };
            var monster = {
                npc : $(".monster"),
                x: 100,
                y: 100
            };
            var keypush = {};

        $(document).on("keydown keyup", function(e){
            var keyN = e.which;
            keypush[keyN] = e.type === "keydown";

        });


    function moveCharacter(){
        if (keypush[37]) char.x -=2;
        if (keypush[38]) char.y -=2;
        if (keypush[39]) char.x +=2;
        if (keypush[40]) char.y +=2;
        char.player.css({transform:"translate3D("+ char.x +"px, "+ char.y +"px, 0)"});
        monster.npc.css({transform:"translate3D("+ monster.x +"px, "+ monster.y +"px, 0)"});

        var playerPosX = char.player.position().top;
        var monsterPosX = monster.npc.position().top;
        var playerPosY = char.player.position().left;
        var monsterPosY = monster.npc.position().left;

        if ( playerPosX === monsterPosX
            && playerPosY === monsterPosY 
           ){
            document.getElementById("pos").innerHTML="Touched"; 
        } else {
            document.getElementById("pos").innerHTML="Off";
        }


//backend logs
 console.log(char.x);            
    }



        (function engine(){
        moveCharacter();
        window.requestAnimationFrame(engine);
    }());    
  });

.HTML:

<div id = "map">
        <div class = "character">
        </div>
        <div class = "monster">
            <p id = "pos" style = "color:yellow;font-  weight:bold;position:relative;left:5px;font-size:20px;">Position: </p>
        </div>
    </div>

最简单快捷的方法是计算角色和怪物之间的距离:使用圆圈碰撞摆弄。

    var dx = playerPosX - monsterPosX,
        dy = playerPosY - monsterPosY,
        touchDistance = 30; 
    if ( Math.sqrt( dx * dx + dy * dy ) < touchDistance )           
       document.getElementById("pos").innerHTML="Touched";                
    else
       document.getElementById("pos").innerHTML="Off";

在这里,我盯上了touchDistance,但它的实际值应该是玩家精灵半径和怪物精灵半径之和。如果它们是圆圈,则效果最好:

/**
 * (ax,ay) and (bx,by) are the center positions, and ar, br their radii.
 */
function circleCollision( ax, ay, ar, bx, by, br ) {
    return Math.sqrt( (ax-bx)*(ax-bx) + (ay-by)*(ay-by) ) <= ar + br;
}

确定碰撞的第二种常见方法是使用"边界框",或者在本例中为矩形/正方形:使用矩形碰撞进行摆弄。

function rectangleCollision( pLeft, pTop, pRight, pBottom, mLeft, mTop, mRight, mBottom ) {
  return
     ( (pLeft   >= mLeft && pLeft   < mRight ) || (pRight >= mLeft && pRight < mRight ) )
  && ( (pBottom >= mTop  && pBottom < mBottom) || (pTop   >= mTop  && pTop   < mBottom) )
}