이 질문을 너무 구체적으로 생각하면 누구든지 삭제할 수 있습니다.충돌 감지 문제. 특정 조건에 대한 이상한 반응
내 충돌 감지에 문제가, 난 그러나 검출 모서리가 충돌하거나 문자 할 때 실패 할 것, 충돌되고있는 쪽 얘기를 적응하려고 다음 몇 가지 기본적인 충돌 탐지 기술을 보았고했다 충돌시 수직 및 수평 속도를 갖는다.
Heres는 내 충돌 감지 기능 : 또한 http://jsfiddle.net/v5hhpt57/1/
내가 사용하는 것이 좋습니다 :
this.checkCollision = function() {
var isGround = false;
var i;
/*Combines Platforms and Chars so Character Collide with Eachother*/
var x = platforms[level];
var y = chars[level];
var p = x.concat(y);
/* For Readability */
var top = this.y;
var bottom = this.y + this.h;
var left = this.x;
var right = this.x + this.w;
for (i = 0; i < p.length; i++) {
/* For Readability */
var pTop = p[i].y;
var pBottom = p[i].y + p[i].h;
var pLeft = p[i].x;
var pRight = p[i].x + p[i].w;
if (p[i] !== this) {
if (this.inverted) {
/*Vertical-Top*/
if ((bottom === pTop) && (right > pLeft && left < pRight)) {
this.vy = -gravity;
/*Vertical-Near-Top*/
} else if ((bottom + this.vy >= pTop && bottom <= pTop) && (right > pLeft && left < pRight)) {
this.vy = pTop - bottom;
/*Vertical-Bottom*/
} else if ((top === pBottom) && (right > pLeft && left < pRight) && (this.vy <= 0)) {
isGround = true;
this.onGround = true;
/*Vertical-Near-Bottom*/
} else if ((top + this.vy <= pBottom && top >= pTop) && (right > pLeft && left < pRight)) {
this.vy = pBottom - top + gravity;
}
} else {
/*Vertical-Top*/
if ((bottom === pTop) && (right > pLeft && left < pRight)) {
if (p[i].bouncy) {
this.vy = -(this.jumpVelocity * 1.2);
} else if (p[i] instanceof Char && !p[i].inverted) {
this.vx = this.current ? this.vx : p[i].vx;
if (p[i].onGround) {
isGround = true;
this.onGround = true;
} else {
this.vy = p[i].vy;
}
} else {
this.vx = this.current ? this.vx : 0;
isGround = true;
this.onGround = true;
}
/*Vertical-Near-Top*/
} else if ((bottom + this.vy >= pTop && bottom <= pTop) && (right > pLeft && left < pRight)) {
this.vy = pTop - bottom - gravity;
/*Vertical-Bottom*/
} else if ((top === pBottom) && (right > pLeft && left < pRight)) {
this.vy = gravity;
/*Vertical-Near-Bottom*/
} else if ((top + this.vy <= pBottom && top >= pTop) && (right > pLeft && left < pRight)) {
this.vy = top - pBottom;
}
}
/*Horizontal-Left*/
if ((right === pLeft) && ((top < pTop && bottom > pTop) || (top < pBottom && bottom >= pBottom) || (top >= pTop && bottom <= pBottom)) && (this.vx > 0)) {
this.vx = 0;
/*Horizontal-Left-Near*/
} else if ((right + this.vx >= pLeft && right <= pRight) && ((top < pTop && bottom > pTop) || (top < pBottom && bottom >= pBottom) || (top >= pTop && bottom <= pBottom)) && (this.vx > 0)) {
this.vx = pLeft - right;
/*Horizontal-Right*/
} else if ((left === pRight) && ((top < pTop && bottom > pTop) || (top < pBottom && bottom >= pBottom) || (top >= pTop && bottom <= pBottom)) && (this.vx < 0)) {
this.vx = 0;
/*Horizontal-Right-Near*/
} else if ((left + this.vx <= pRight && left >= pLeft) && ((top < pTop && bottom > pTop) || (top < pBottom && bottom >= pBottom) || (top >= pTop && bottom <= pBottom)) && (this.vx < 0)) {
this.vx = pRight - left;
}
}
}
if (!isGround) {
this.onGround = false;
}
};
코드의 나머지 부분은 여기 (그것의 모든 문자로 테스트 레벨을 입력 보도 T)를 JSFiddle입니다 캔버스의 전체 화면 결과가 JSFiddle 페이지에 적합하지 않은 것 같습니다 : http://tinyurl.com/twa-js (JSFiddle에서 어려움으로 인해 JSFiddle, Google Site Hosting)
특정 문제의 경우 테스트 레벨 엘이 파란색 위에서 빨간색을 제거하고, 오른쪽으로 핑크색을 조금 옮기고 파란색 위에 자주색을 반사 시키십시오.
마지막으로 바닥을 떠 다니고 침몰하는 것을 신경 쓰지 마세요. 충돌 처리 끝 부분에 있습니다.
다시 : 누구나이 질문을 너무 구체적으로 생각하면 삭제할 수 있습니다.
그래서 코드를 보는 것이 더 쉽다고 생각합니다. 게임에서 어떤 일이 벌어지는 지 알아 보려면 많은 버그가 탐지보다는 오히려 나쁜 충돌 처리에 기인하는 것일 수 있습니다. 그러나 충돌 탐지는 분명히 최고 수준에 이르며 문제가 상당 부분 있습니다. 어떤 도움이 "누가 이것을 썼습니까? 2 살입니까?" 등 ... 나는 코드가 실제로 얼마나 나쁜지를 알게 될 것이다. 시간 주셔서 감사합니다 –