2012-05-01 3 views
0

그래서 저는이 게임을 조금만 진행해 왔습니다. 그러나 과거의 날에는 충돌 감지 작업 방법을 파악하지 못했습니다. 기본적으로타일 충돌 감지

스케일 플레이어가 64 * 스케일하여 41 * 스케일 2.

같다.

내 플레이어의 중심은 x 축과 y 축 모두 가운데에 있습니다.

플레이어가 가운데에 배치되어 있기 때문에 세계는 무엇이 움직이는 지, 그 변수는 worldx와 worldy입니다. 플레이어는 항상 화면 중앙에 있습니다.

내 타일 맵은 배열에 저장되며 이미지 픽셀 색상을 기반으로합니다. map [x] [y]에서 픽셀이 흰색 인 경우 값은 0으로 설정되고 그렇지 않으면 블록으로 설정됩니다. 블록이 렌더링되지 않는다는 것을 의미합니다.

for x = 0, w-1 do --draws the map 
    for y = 0, h-1 do 
     if amap[x][y] ~= 0 then 
     love.graphics.drawq(ImgBlocks, Blocks[amap[x][y]], 32*x*(3/bscale) + worldx, 32*y*(3/bscale) + worldy + jy, 0 , 3/bscale, 3/bscale) 
     end 
     if amap[x][y] == 4 then 
     end 
    end 
end --end function 

기능은 플레이어와 블록 사이의 충돌이있는 경우에 true 또는 false 기지를 반환해야지도를 그립니다

for x = 0, w-1 do --scans the image and builds the map array 
    amap[x] = {} 
    for y = 0, h-1 do 
     local r, g, b, a = source:getPixel(x, y) 
     if r == 255 and g == 255 and b == 255 then 
     block = 0 
     end 
     if r == 255 and g == 100 and b == 0 then 
     block = 1 
     end 
     if r == 130 and g == 125 and b == 0 then 
     block = 2 
     end 
     if r == 76 and g == 76 and b == 76 then 
     block = 3 
     end 
     if r == 255 and g == 0 and b == 255 then 
     --this is the spawn pixel yet to build 
     end 
     amap[x][y] = block 
    end 
end --end function 

기능.

답변

1

내 타일이 32 × 32이다 collission 다음, 맞습니까?

function pointCollisionTest(x, y) 
    -- find which tile the point is in 
    local tx, ty = math.floor(x/32), math.floor(y/32) 
    -- check the tile 
    if map[tx][ty] == solid then 
     return true 
    else 
     return false 
    end 
end 

당신은 당신이 단단한 타일을 결정하는 방법에 따라 if map[x][y] == solid 논리를 변경해야하지만,이 : 나는 당신이 점은 고체 타일에 있는지 확인하는 기능을 추천합니다 (drawq 전화에서) 코드가 제대로 작동해야합니다.

포인트 충돌이 발생하면 플레이어가 충돌하게하는 방법은 플레이어가 움직일 때마다이 기능에 대해 해당 히트 박스 (쉽게 결정할 수 있음)의 각 구석을 확인하는 것입니다. 이를 수행 할 수있는 몇 가지 방법이 있습니다. 플레이어의 새로운 위치를 계산하고 테스트 한 다음 충돌 테스트가 true를 반환하면 이동을 완전히 취소하는 비교적 간단한 방법을 사용합니다. 하지만 이동의 x와 y 구성 요소를 개별적으로 확인/취소해야하기 때문에 플레이어는 벽과 벽을 따라 이동할 수 있습니다.

0

기본 2d 충돌 감지를 요청하십니까?

단순화 화학식 : 경우 (playerx> blockminx) 및 (playery < blockmaxx) 및 (playery> blockminy) 및 (playery < blockmaxy)