HTML5 / kineticJS getIntersection function implementation

后端 未结 1 1744
孤城傲影
孤城傲影 2020-12-19 14:10

I am learning kineticjs through tutorials provided at http://www.html5canvastutorials.com, things are good and easy to understand but, I am having issue in unde

相关标签:
1条回答
  • 2020-12-19 14:44

    Ok, the developer of KineticJS is working on improving the .getIntersections() function... or at least he said he is. But until the function is improved you have to make your own collision detection function. Assuming that your objects are rectangles or can be broken into a series of points you should go with something like this:

    Create a function which determines if a point is in a shape (if the corner of a rectangle is inside another rectangle) like so:

     function checkCollide(pointX, pointY, objectx, objecty, objectw, objecth) { // pointX, pointY belong to one rectangle, while the object variables belong to another rectangle
          var oTop = objecty;
          var oLeft = objectx; 
          var oRight = objectx+objectw;
          var oBottom = objecty+objecth; 
    
          if(pointX > oLeft && pointX < oRight){
               if(pointY > oTop && pointY < oBottom ){
                    return 1;
               }
          }
          else
               return 0;
     };
    

    then you can do a big loop which iterates through all objects in a layer to check collision, like so:

     var children = layer.getChildren();
     for( var i=0; i<children.length; i++){  // for each single shape
         for( var j=0; j<children.length; j++){ //check each other shape
             if(i != j){ //skip if shape is the same
                if(checkCollide(children[i].getX(), children[i].getY(), children[j].getX(), children[j].getY(), children[j].getWidth(), children[j].getHeight()))
                    alert('top left corner collided');
             }
         }
     }
    

    the checkCollide function I provided only checks the collision for the top left corner on each shape, so you have to modify the function to check all corners, it's not a long rewrite, and there are plenty tutorials even here on stackoverflow which deal with 'bounding rectangles collision detection'

    This may seem like it is a very heavy function, but surprisingly it is still faster than .getIntersections(). Also, you should throw in extra if statements so that the function doesn't run through all the checks all the time.

    I created a game myself and was using .intersects() and was having a lot of slow down. I switched over to this type of 'simpler' collision detection and now my game runs around 60FPS. http://cs.neiu.edu/~tsam/physics/index.phtml (test/test) if you want to check it out. You can view page source to see how I structured the collision detection to be more efficient (such as in checkIntersectsGoal() function.

    0 讨论(0)
提交回复
热议问题