2014-11-15 4 views
1

이 질문을 너무 구체적으로 생각하면 누구든지 삭제할 수 있습니다.충돌 감지 문제. 특정 조건에 대한 이상한 반응

내 충돌 감지에 문제가

, 난 그러나 검출 모서리가 충돌하거나 문자 할 때 실패 할 것, 충돌되고있는 쪽 얘기를 적응하려고 다음 몇 가지 기본적인 충돌 탐지 기술을 보았고했다 충돌시 수직 및 수평 속도를 갖는다.

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)

특정 문제의 경우 테스트 레벨 엘이 파란색 위에서 빨간색을 제거하고, 오른쪽으로 핑크색을 조금 옮기고 파란색 위에 자주색을 반사 시키십시오.

마지막으로 바닥을 떠 다니고 침몰하는 것을 신경 쓰지 마세요. 충돌 처리 끝 부분에 있습니다.

다시 : 누구나이 질문을 너무 구체적으로 생각하면 삭제할 수 있습니다.

+0

그래서 코드를 보는 것이 더 쉽다고 생각합니다. 게임에서 어떤 일이 벌어지는 지 알아 보려면 많은 버그가 탐지보다는 오히려 나쁜 충돌 처리에 기인하는 것일 수 있습니다. 그러나 충돌 탐지는 분명히 최고 수준에 이르며 문제가 상당 부분 있습니다. 어떤 도움이 "누가 이것을 썼습니까? 2 살입니까?" 등 ... 나는 코드가 실제로 얼마나 나쁜지를 알게 될 것이다. 시간 주셔서 감사합니다 –

답변

0

캔버스에서도 게임을 만들고 있습니다. 나는 초보자이지만 온라인 웹 기반 게임에 대한 기본 사항을 만들었습니다. 내가 생각하는 충돌은 내 게임 마우스와 거의 비슷합니다.

Xerror = 2 
Yerror = 3 
monster_width = 20 
monster_height = 20 
mouseX = evt.clientX-Xerror //My mouse X position in canvas map 
mouseY = evt.clientY-Yerror //My mouse Y position in canvas map 

for monster in all_monsters //looping trough all monsters 
if mouseX > monster.x_position[monster.id]-monster_width/2+Xerror*4 and mouseX< 
      monster.x_position[monster.id]+monster_width/2+Xerror*4 and mouseY> 
      monster.y_position[monster.id]-monster_height/2+Yerror*2 and mouseY< 
      monster.y_position[monster.id]+monster_height/2+Yerror*4  
// then my mouse is over one of the monsters 

이러한 X- 오류는 캔버스 테두리가 거의 없어서 알 수 없지만 잘못된 결과가 나오는 것은 아닙니다. 그러나 또한 메신저 너비/높이 2에서 빼기, 센터 얻을. (나의 괴물은 큐브에 불과하다).

내 게임은 gamegame.herokuapp.com, ID testeris, PWD testeris입니다. 저에게 연락하고 싶다면 [email protected]입니다. 나는 캔버스, Ruby on rails, Backbone.js, coffeescript로 온라인 게임을 열정적입니다. 캔버스로 게임을 만드는 것을 좋아하는 사람들과 이야기하는 것이 흥미로울 것입니다.

+0

이게 무슨 질문과 관련이 있는지 모르겠지만 ...... 멋진 게임 같네요. 멋진 게임입니다. –

-1

무덤 레이더의 경우 얼굴 또는 정점에 연결된 구 목록이 있습니다. 구와 삼각형 사이의 탐지는 간단하므로 많은 작은 구가 거의 완벽한 충돌을 제공합니다. 움직이는 물체 (모든 공)와 깃발이있는 배경 (등반 가능) 사이. 나는 그 동안 C64 일간의 트릭을 사용했다. 2D 쿼드가있는 방을 사용한다. 그런 다음 인접한 룸의 객체를 사각형 내부/사각형 (단순 4x4 행렬)으로 확장 한 경우에만 객체를 렌더링해야합니다.