2014-02-07 3 views
0

удаления монет IM встречными йота кажется немного проблемно им получилось так:Удаление конкретных объектов на столкновения

local screenGroup = self.view 
local options2 = 
{ 
    --required parameters 
    width = 16, 
    height = 16, 
    numFrames = 8, 

    --optional parameters; used for dynamic resolution support 
    sheetContentWidth = 128, -- width of original 1x size of entire sheet 
    sheetContentHeight = 16, -- height of original 1x size of entire sheet 
} 

local imageSheet1 = graphics.newImageSheet("items/coin.png", options2) 
-- Example assumes 'imageSheet' is already created using graphics.newImageSheet() 

-- non-consecutive frames 
local sequenceData1 = 
{ 
    name="normal", 
    frames= {1,2,3,4,5,6,7,8}, -- frame indexes of animation, in image sheet 
    time = 600, --700   -- Optional, in milliseconds ; if not supplied, the animation is frame-based 
    loopCount = 0  -- Optional ; default is 0 
} 

local coin = {} 

local coinspawn = function() 
    local i = display.newSprite(imageSheet1, sequenceData1) 

    i.x = display.contentWidth/2 
    i.y = display.contentHeight/2 
    i:play() 
    i.collided = true 
    i.name = "coin" 
    physics.addBody(i, "dynamic", 
     {density=.1, bounce=0.1, friction=.2, shape= shape2 ,filter=playerCollisionFilter } 
    ) 
    --player.gravityScale = 0.5 
    coinIntro = transition.to(i,{time=2000, x=display.contentWidth/2-50 ,onComplete=jetReady , transition=easing.OutExpo }) -- 
    coin[#coin+1] = i 

end 
timer.performWithDelay(1000, coinspawn, 0) 

function coinPlus() 
    for i = #coin, 1, -1 do 
     if coin[i] ~= nil then 
      local function dellcoin() 
       if coin[i] ~= nil then 
        coin[i]:removeSelf() 
        coin[i] = nil 
       end 
      end 
      transition.to(coin[i], { time=100, alpha=0, onComplete = dellcoin}) 
      break 
     end 
    end 
end 

local function onCollision(event) 
    if event.phase == "began" and gameIsActive == true then 
     local obj1 = event.object1; 
     local obj2 = event.object2; 

     if obj1.name == "playerpop" then 
      if  obj2.name == "BGfrontFL1" then --helper() 
      elseif obj2.name == "BGfrontFL2" then --helper() 
      elseif obj2.name == "coin" then coinPlus() 
      end 
     end 
    end 
end 

Runtime:addEventListener("collision", onCollision) 

тетивами вроде работает, но он удаляет последний порождал монету и не один в столкновении, как может Я это исправить?

ответ

1

В coinspawn вы создаете монету и добавляйте ее в таблицу coin. Похоже, что ваша таблица coin будет содержать все порожденные монеты, которые не были столкнулись (в любом случае это ваше намерение). Затем, когда монета сталкивается, будет вызван onCollision(), который вызовет coinPlus(). Затем последний перебирает все монеты в таблице coin, начиная с последней порожденной (в конце таблицы), и если она не равна нулю, она начинает исчезать с удалением по завершении постепенного исчезновения. Это, конечно, не то, что вы намереваетесь: вы хотите удалить только монету.

Таким образом, самая большая проблема заключается в том, как монета, которая была вовлечена в столкновение, удаляется: перебирает все монеты, не думайте, что это необходимо. Вы должны попробовать прохождение монеты в качестве арг к coinPlus:

if obj1.name == "playerpop" then 
    if  obj2.name == "BGfrontFL1" then --helper() 
    elseif obj2.name == "BGfrontFL2" then --helper() 
    elseif obj2.name == "coin" then coinPlus(obj2) 
    end 
end 

function coinPlus(coinToRemove) 
    local function dellcoin() 
     coinToRemove:removeSelf() 
     for i, coin in ipairs(coin) do 
      if coin == coinToRemove then 
       coin[i] = nil 
       break 
      end 
     end 
    end 
    transition.to(coinToRemove, { time=100, alpha=0, onComplete = dellcoin}) 
end 

Другой проблемой является вашим использованием оператора «#»: это может быть использовано только с таблицами, которые не имеют «дыру», так что если вы действительно удалите отдельные записи из своего стола (создав таким образом дыры), тогда #coin больше не будет работать (поэтому я использовал ipairs).

Смежные вопросы