E: using debugging I’ve found out the collisionMarker is always 0. The rabbit doesn’t sink if timeVector is incrementing, but does when it starts decrementing.
What I believe I’m doing wrong is instead of splicing, I should be doing something else. But I have no clue what, this is infuriating. I’ve been working on it a few days and trying different things.
The rabbit does what its supposed to, except when moving across tiles left or right too quickly it starts to sink into the ground and ultimately falls through completely.
The first two blocks of code are for reference.
//this is a function fired by my main loop;
private function updateCollisions(){
var i:int = 0;
while(i < ground_a.length){
solveCollision(i);
trace(i);
i++;
}//end of for loop
findTOC();
}
//solveCollision();
public function solveCollision(i) {
squareX2 = ground_a[i].x;
squareY2 = ground_a[i].y;
squareWidth2 = ground_a[i].width;
squareHeight2 = ground_a[i].height;
var velocityY = squareY - prevSq1Y;
var velocityX = squareX - prevSq1X;
var distanceX1;
var distanceY1;
var distanceX2;
var distanceY2;
if(velocityX < 0){
distanceX1 = squareX2 + squareWidth2 - prevSq1X;
distanceX2 = squareX2 - prevSq1X - squareWidth;
var movingLeft = true;
trace("Moving Left!");
} else {
distanceX1 = squareX2 - prevSq1X - squareWidth;
distanceX2 = squareX2 + squareWidth2 - prevSq1X;
var movingRight = true;
}
if(velocityY < 0){
distanceY1 = squareY2 + squareHeight2 - prevSq1Y;
distanceY2 = squareY2 - prevSq1Y - squareHeight;
var movingUp = true;
trace("Moving UP!");
} else {
distanceY1 = squareY2 - prevSq1Y - squareHeight;
distanceY2 = squareY2 + squareHeight2 - prevSq1Y;
var movingDown = true;
}
var timeX = distanceX1/velocityX;
var timeY = distanceY1/velocityY;
var actualTime = Math.max(timeX,timeY);
var disjointTimeX = distanceX2/velocityX;
var disjointTimeY = distanceY2/velocityY;
var actualDisjointTime = Math.min(disjointTimeX, disjointTimeY);
if (timeX < 0 && timeY < 0){
//trace("COLLISION FOUND UNWORTHY");
return;
}
if(timeX > 1 || timeY > 1){
//trace("COLLISION FOUND UNWORTHY");
return;
}
if(timeX == timeY){
trace("timeX has the same value as timeY");
}
if(actualTime < actualDisjointTime){
//trace("COLLISION FOUND WORTHY~~~~>>>>>");
var tOC = getTimer();
timeVector.push(tOC);
timeXV.push(timeX);
timeYV.push(timeY);
actualTimeV.push(actualTime);
velocityYV.push(velocityY);
velocityXV.push(velocityX);
}
}
//self explanatory;
public function findTOC(){
if(timeVector.length > 0){
minTOC = Math.min.apply(null,timeVector);
var collisionMarker = timeVector.indexOf(minTOC);
if(collisionMarker != 0)
trace("COLLISION MARKER = " + collisionMarker);
var tx = timeXV[collisionMarker];
var ty = timeYV[collisionMarker];
var at = actualTimeV[collisionMarker];
var vy = velocityYV[collisionMarker];
var vx = velocityXV[collisionMarker];
player.y = player.y - ((1-at) * vy);
if(tx < 1 && tx > 0){
player.x = player.x - ((1-at) * vx);
}
if(timeXV.length > 0)
timeXV.splice(collisionMarker, 1);
if(timeYV.length > 0)
timeYV.splice(collisionMarker, 1);
if(actualTimeV.length > 0)
actualTimeV.splice(collisionMarker, 1);
if(velocityYV.length > 0)
velocityYV.splice(collisionMarker, 1);
if(velocityXV.length > 0)
velocityXV.splice(collisionMarker, 1);
timeVector.splice(collisionMarker, 1);
}
}
