Групповые экранные объекты и таблицы в Corona Lua - PullRequest
2 голосов
/ 18 января 2012

Первый пост, и я искренне извиняюсь, если на этот вопрос был дан ответ в каком-либо другом посте, но я не смог найти решение проблемы, с которой я столкнулся на этом или любом другом сайте. Я - новый программист, самостоятельно обучающий с веб-учебниками и любым другим ресурсом, который я нашел. Я пытаюсь создать код, который будет порождать символы и позволять вам вызывать их. У меня были проблемы с назначением значения индекса для отдельных экземпляров, которые я создал с помощью функции for. Я попытался установить экземпляр как таблицу и как экранный объект группы. Если кто-то сможет указать мне какие-либо ресурсы, чтобы получить более глубокое понимание таблиц и групповых экранных объектов для реализации Lua в Corona SDK, я уверен, что моя проблема в том, что у меня недостаточно глубокое понимание из этих конкретных функций и как они работают. Вот код, который я написал до сих пор.

-- Character Game

require "sprite"

require "ui"

local background = display.newImage("Background Placeholder.png") 

halfW = display.viewableContentWidth / 2
halfH = display.viewableContentHeight / 2

local numCharacters = 20

local roundedRect = display.newRoundedRect( 365, 20, 110, 40, 8 )
roundedRect:setFillColor( 0, 255, 0, 80 )

score = 0

t = ui.newLabel{ bounds = { 370, 30, 100, 40 },
text = "Score " ..  score,
textColor = { 255, 0, 20, 255 },
size = 18,
align = "center"
}

local scoreboard = function ( event )
    t:setText( "Score " .. score )
end

Runtime:addEventListener( "enterFrame", scoreboard )


local group = display.newGroup()

local character = sprite.newSpriteSheetFromData( "Character Placeholder.png", require("Character Placeholder").getSpriteSheetData() )

local characterSet1 = sprite.newSpriteSet(character,1,8)

sprite.add(characterSet1,"character",1,8,1500,0)

local characterplay = function( event )
    score = score + group.points
    group[i]:removeSelf()
end

do  
    for i=1, numCharacters do
        group:insert(sprite.newSprite(characterSet1))
        group[i].xScale = .2
        group[i].yScale = .2
        group.points = 50
        group[i]:setReferencePoint ( display.BottomCenterReferencePoint )
        group[i]:translate( halfW + math.random( -100, 100 ), halfH + math.random( -130, -110 ) )
    end 

    timer.performWithDelay( 500, charactermovie )

    for i=1, 21 do
        timer.performWithDelay( math.random( 500, 5000 ) , charactermove )

        charactermove = function(event )
            transition.to( group[i], { time=10000, y = 580 } )
            transition.to( group[i], { time=8000, x = math.random( 0, 480 ) } )
            transition.to( group[i], { time=7000, xScale = 1.5} )
            transition.to( group[i], { time=7000, yScale = 1.5} )
            group[i]:prepare("character")
            group[i]:play()
        end

        group[i]:addEventListener( "tap", characterplay )
    end
end




charactermovie = function( event )
group[i]:prepare("character")
group[i]:play()
end

local function spriteListener( event )
    print( "Sprite event: ", event.sprite, event.sprite.sequence, event.phase )
end

for i, group in pairs(group) do print (group, i, v) end

Я сейчас получаю «попытку индексировать поле»? в строке, содержащей этот код "group [i]: addEventListener (" tap ", zombieplay)" при запуске, и в сообщении "group [i]: removeSelf ()" строка " zombieplay ". Я попытался переместить нарушающий код в различные места, чтобы увидеть, является ли это проблемой с ограничением объема, но я в основном сталкиваюсь с той же ошибкой и считаю, что не могу правильно понять индексы и ключи ... Я нашел что приложение функционирует так, как задумано, но мне нужно вызывать индексные клавиши с 1 по 21, чтобы заставить их всех двигаться, хотя я и вызываю только 20 символов, а ошибки выброса строки removeSelf не удаляют отдельные символы. Я собираюсь попробовать написать модуль для персонажей и посмотреть, поможет ли это прояснить ситуацию. Я скоро опубликую свои результаты.

1 Ответ

0 голосов
/ 09 апреля 2012

Ваши функции персонажа и персонажа пытаются использовать переменную i, это выходит за рамки функций.

Существует свойство события, называемое target, которое используется для получения вызываемого события. Вы хотите сделать что-то вроде этого:

local characterplay = function( event )
    score = score + group.points
    event.target:removeSelf()
end
...