2014-05-20 3 views
0

저는 Corona SDK로 타일 기반의 플랫폼 게임을 만들고 있습니다. Box2D 물리 엔진을 여러 가지 이유로 스크랩하기로 결정했고, 필자는 자체 물리 시스템을 만들려고 시도하고 있습니다. 다시 말하지만, 내 게임은 가능한 충돌자를 쉽게 수집 할 수 있도록 타일로 제작되었습니다. 또한 타일과 충돌해야하는 유일한 객체는 내 플레이어이기 때문에 더 쉽게 만들 수 있습니다.Corona SDK가 포함 된 Box2D가 아닌 물리학

중력과 속도가 작동하고 있으며 이제 충돌로 시작합니다. 나는 그것을하는 방법을 여러 사이트에서 읽었지만 결코 나를 위해 일하는 것 같습니다. 내가 본 과정은 이런 식입니다 :

  1. 하여 (타일 기반 게임 쉬운) 충돌 (AABB의 내 경우)
  2. 계산 침투 깊이의 X 및 Y
  3. 에 대한
  4. 확인 가능 colliders 찾기 어떤 이유에 대한 침투
  5. 가 침투
  6. 나는 아래 1-3 단계를 가지고

에 따라 속도를 조정 금액 만에 의해

  • 이동 객체 4, 5 단계로 넘어 가기 시작합니다. 자습서에서 말하는 것처럼 작동하지 않습니다. 바닥과 충돌하면 플레이어가 즉시 왼쪽으로 이동합니다. 나는 그것이 왜 그렇게 하는지를 압니다. 플레이어의 너비를 침투 깊이로 계산합니다. 그러나 그것을 고치려고하면, 이상하게 느껴집니다.

    나는 (간단한 AABB 충돌 검사로 발견 된 후) 플레이어와 충돌되는 각 타일이 함수를 호출 :

    local resolveCollision = function(guy, tile) 
        local guyX, guyY, tileX, tileY = guy.x, guy.y, tile.x, tile.y 
        local guyHW, guyHH = guy.width * 0.5, guy.height * 0.5 
        local tileHW, tileHH = tile.width * 0.5, tile.height * 0.5 
    
        local distX = guyX - tileX 
        local minDistX = guyHW + tileHW 
    
        local absDistX = (distX < 0 and -distX) or distX 
    
        -- Calculate X penetration 
        local xPen = 0 
        if absDistX >= minDistX then 
         xPen = 0 
        else 
         xPen = (distX > 0 and minDistX - distX) or -minDistX - distX 
        end 
    
        local distY = guyY - tileY 
        local minDistY = guyHH + tileHH 
        local absDistY = (distY < 0 and -distY) or distY 
    
        -- Calculate Y penetration 
        local yPen = 0 
        if absDistY >= minDistY then 
         yPen = 0 
        else 
         yPen = (distY > 0 and minDistY - distY) or -minDistY - distY 
        end 
    
        local absXPen = (xPen < 0 and -xPen) or xPen 
        local absYPen = (yPen < 0 and -yPen) or yPen 
    
        -- Trim off larger penetration 
        if absXPen > absYPen and absYPen ~= 0 then 
         xPen = 0 
         guy.setYVel(0) 
        elseif absYPen > absXPen and absXPen ~= 0 then 
         yPen = 0 
         guy.setXVel(0) 
        end 
    
        guy:translate(xPen, yPen) 
    end 
    

    사람이 정확한 충돌 응답을하는 방법을 알고 있나요

    ?

    obj.setXVel(n)   - Set X-velocity 
    obj.setYVel(n)   - Set Y-velocity 
    obj.setVelocity(x, y) - Set both velocities at once 
    obj.xVel    - Read-only, X-velocity value 
    obj.yVel    - Read-only, Y-velocity value 
    
  • +0

    'enterFrame' 이벤트 중에 충돌을 확인 하시겠습니까? –

    답변

    1

    나는 문제가 당신의 운동 기능은 프레임 기반이며, 1 초에 여러 번 트리거 얻을 것이라고 생각 : 참고로, 내 "물리학"프레임 워크는 (다른 사람의 사이에서) 다음과 같은 방법/값을 제공합니다.

    시간 이동으로 변경하는 것이 좋습니다. 이렇게하려면 델타 시간 (프레임과 다음 시간 사이의 경과 시간)을 찾아 이동량만큼 곱해야합니다. deltaTime를 얻기 위해이 자습서를 사용 : DT가 있으면 http://coronalabs.com/blog/2013/06/18/guest-tutorial-delta-time-in-corona/

    는, 다음과 같이 사용 :

    moveAmount = velocity * deltaTime

    는 이동 속도가 일정에서 장치 있는지 확인합니다.

    관련 문제