2014-02-24 45 views
1

我無法弄清楚我的代碼出了什麼問題,但是我試圖實現的是讓塊的滾動區域滾過屏幕,玩家必須閃避。當每個塊熄滅屏幕的左側,它增加了「障礙值+1」嘗試索引字段'?' (一個零值) - 錯誤

我是,當我的「塊」對象熄滅屏幕,我得到這個錯誤的問題:

「嘗試索引字段'?' (一個零值)「

任何人都可以幫助我,因爲我真的被卡住了。 感謝

local yPos = {50,110,200} 
local speed = 6 
local block = {} 
local obstacles = 0 


function createBlock(event) 
    local rnd = math.floor(math.random() * 4) + 1 
    b = display.newImage('images/block3.png', display.contentWidth, yPos[math.floor(math.random() * 3)+1]) 
    b.x = 480 
    b.name = 'block' 
    physics.addBody(b, "static") 
    blocks:insert(b) 
    print(b.x) 

    return true 

end 

function gameLoop(event) 
    if(blocks ~= nil)then 
    for i = 1, blocks.numChildren do 
     blocks[i].x = blocks[i].x - speed -- ((THIS IS THE LINE WHICH GENERATES THE ERROR)) 
     if(blocks[i].x < -0) then 
     display.remove(blocks[i]) 
     blocks[i] = nil 
     print("+1!!") 
     obstacles = obstacles +1 
     end 
    end 
    end 
end 


timerSrc = timer.performWithDelay(900, createBlock, 0) 
Runtime:addEventListener("enterFrame", gameLoop) 

回答

2

在這裏,你在呼喚display.remove(blocks[i])這是很好的,但在該行要設置blocks[i]=nil之後。 corona docs沒有跡象表明這是一項有效的操作。

此外,一旦對象已被刪除,它不再在組中,所以肯定做blocks[i]=nil是不正確的:你可能會扼殺下一個塊!我不能在這裏查看,但在這個循環之前和之後,打印我被刪除的對象的id會很有趣。你可能會發現,在執行display.remove(blocks[4])(選擇i = 4因此示例更清晰)之前,塊[4]與之後的對象不是同一個對象,所以實際上您將刪除兩個對象(而第二個對象被錯誤地刪除)。

如果blocks是一個常規表格而不是用戶數據,問題會有所不同,但是您仍然有問題(超出問題範圍;但我建議您嘗試一下!)。

0

,如果你是「出界」,本身你會得到這個錯誤。如果您嘗試運行代碼,但嘗試訪問表nil中的索引,則會出現該錯誤。

我的猜測是它與你在那裏的numChildren有關。不太確定它來自哪裏,但我建議使用默認的#運算符來衡量表的大小。

例如:

for i = 1, #blocks do 
    ... 
end 

甚至使用一個迭代:

for i, block in ipairs(blocks) do 
    ... 
end 

另一種可能性是你的blocks:insert()方法沒有順序插入的值,從0開始的插入物,或不即使使用數字指數(儘管如此)。

在這種情況下,我會建議使用標準table.insert(blocks, b)

1

我認爲問題出在屏幕外的對象。當物體從可見組移出時,它變成零。所以你不能訪問該對象。 在移出可視屏幕之前,您需要定義該對象的alpha = 0或isVisible = false,然後才能訪問該對象。

相關問題