2014-12-11 2 views
0

특정 충돌에 대해 테이블의 모든 개체를 감지하는 데 문제가 있습니다. 테이블의 첫 번째 오브젝트가 눈덩이처럼 치는 경우에만 점수를 올릴 수 있습니다. 다음은 객체의 생성 및 충돌에 사용하는 코드입니다. 버튼을 누른 후 createSnowBall()에 대한 함수 호출이 있습니다. 그 부분은 잘 작동합니다.코로나를 사용하여 lua로 충돌 감지

local physics = require("physics") 
physics.start() 
physics.setGravity(0, 0) 

local snowBalls = {} 
local ornaments = {} 
local score = 0 

local scoreText = display.newText("Score: " .. score, 70, 25, native.systemBoldFont, 32) 

function createSnowBall() 
    snowBall = display.newImageRect("snowball.png", 20, 20) 
    snowBall.x = gun.x 
    snowBall.y = HEIGHT - 110 
    physics.addBody(snowBall, { density = 1.0, friction = 1, bounce = 0, radius = 20 }) 
    snowBall.isSnowBall = true 
    snowBalls[#snowBalls+1] = snowBall 
    moveSnowBall(snowBall) 
    return snowBall 
end 

function createOrnament(num) 
     if num == 1 then 
      ornament = display.newImageRect("blueO.png", 30, 40) 
     elseif num == 2 then 
      ornament = display.newImageRect("redO.png", 30, 40) 
     elseif num == 3 then 
      ornament = display.newImageRect("greenO.png", 30, 40) 
     end 
    ornament.isOrnament = true 
    ornaments[#ornaments+1] = ornament 
    ornament.x = math.random(50, 270) 
    ornament.y = 3 
    local radius = 15 
    physics.addBody(ornament, { density = 1.0, friction = 1, bounce = 1, radius = radius }) 
    ornament:applyForce(35, 70, ornament.x + 4, ornament.y + 4) 
    return ornament 
end 
createOrnament(math.random(1, 3)) 

function snowBallCollision(event) 
    if event.phase == "began" then 
     local target = event.other 
      if target.isSnowBall then 
       score = score + 5 
       scoreText.text = "Score: " .. score 
      end 
    end 
end 

ornament:addEventListener("collision", snowBallCollision) 
+0

, 기능 장식 코딩 유지 : snowBallCollision (이벤트)를 눈덩이로 :하여 addEventListener ("충돌", 장식)하지만, 내가 가지고있는 문제는 버튼을 눌렀을 때 snowBall이 생성되어 미리 만들어지지 않는다는 것입니다. – jeppy7

답변

1

이 문제 때문에 라인에 발생합니다 여기

ornament:addEventListener("collision", snowBallCollision) 

당신은 단지 한 번만 객체에 리스너를 추가하고, 그 이전에 생성 아직 파괴되지 않은 객체에 할당 얻을 것이다 .

그래서, 당신의 코드에서 그 라인을 삭제하고 선을 호출 할 때마다 :

local myOrnament = createOrnament(math.random(1, 3)) -- Since 'createOrnament' returns the object 
myOrnament:addEventListener("collision", snowBallCollision) -- assign listener to the newly created object 

이 모든 'myOrnament에 리스너를 할당합니다 :

createOrnament(math.random(1, 3)) 

는로 교체 ' 사물.

............. : 내가 사용 해봤

+0

그래, 나는 이것을 2am 경 밖으로 계산했다. 리스너를 createOrnament 함수 안에 포함 시켰습니다. 다른 모든 장식 테이블 필드가 함수 내에서 작동하는 단순한 논리. 이제 개체에 충돌이있을 때 내 점수가 업데이트됩니다. 나는 모든 코드의 맨 아래에 리스너를 배치하는 데 익숙하다. 당신은 크리슈나를 흔들어! – jeppy7