Corona SDK显示组问题 - 此代码中的错误在哪里?

时间:2012-05-03 06:49:35

标签: corona

有人能够看到Corona的这个lua代码中的逻辑缺陷吗?

这个概念是你创建一个新的“扩展”显示对象(例如MyGroup:new(...)),之后你可以使用它在父级中的位置的百分比插入对象(所以不需要使用pixcels计数)。

问题 - 问题是对象绘制大致在正确的位置,但只是一点点?我有一种感觉,这可能是由于在“self:insert(displayO)”行中父母坐标发生了变化?

main.lua

------------------------------------------------------------------------------
-- HELPERS 
------------------------------------------------------------------------------
function rpadString (str, len, char)
    if char == nil then char = ' ' end
    return  (str .. string.rep(char, len - #str))
end

function drawBorder(obj)
    local b = obj.contentBounds 

    local myRectangle = display.newRect(b.xMin, b.yMin, obj.contentWidth, obj.contentHeight)
    -- print ("Rect X,Y,Width,Height: ", b.xMin, b.yMin, obj.contentWidth, obj.contentHeight)
    myRectangle.strokeWidth = 1
    myRectangle:setFillColor(140, 140, 140, 1)
    if obj.gcGroupName then
        -- Group
        myRectangle:setStrokeColor(100, 250, 180)
        myRectangle.strokeWidth = 1
    else
        -- Image/Rect
        myRectangle:setStrokeColor(250, 180, 180)
        myRectangle.strokeWidth = 2
    end


end

function dumpDisplayObjects(doParent, level)
    drawBorder(doParent)
    if doParent.numChildren then
        for i=doParent.numChildren,1,-1 do
            local doChild = doParent[i]
            dumpDisplayObjects(doChild, level + 1)
        end
    end
end

------------------------------------------------------------------------------
-- MAIN 
------------------------------------------------------------------------------
require "MyGroup"

print "RUNNING ........................................."
display.setStatusBar( display.HiddenStatusBar )

-- Create Toolbar Area at Bottom
local mainGroup = MyGroup:new("Main Group", 0, 0, display.contentWidth, display.contentHeight)
local toolbarArea = MyGroup:new("Inventory", 0,0,0,0)
mainGroup:GcInsertLRTB(toolbarArea, 0, 100, 80, 100, "Inventory")    -- Percentages Used

-- Draw Rectangle 1
local toolbarAreaImage = display.newImage( "toolbarArea_button.png", 0, 0)
toolbarArea:GcInsertLRTB(toolbarAreaImage, 0, 20, 0, 100, "Inventory Button")

-- -- Setup Toolbar Group
-- local toolbarAreaToolbar = MyGroup:new("InventoryToolbar", 0, 0, 1, 1)
-- toolbarArea:GcInsertLRTB(toolbarAreaToolbar, 20, 100, 0, 100, "Toolbar")
--  -- 
-- -- Draw Rectangle 2
-- local rect2 = display.newRoundedRect(0, 0, 1000, 1000, 5)
-- rect2.strokeWidth = 1
-- rect2:setStrokeColor(140, 140, 140)
-- rect2:setFillColor(140, 140, 140, 100)
-- toolbarAreaToolbar:GcInsertLRTB(rect2, 0, 100, 0, 100, "Rect2")

-- Debug Display
dumpDisplayObjects(toolbarArea, 1)

MyGroup.lua

MyGroup = {}

function MyGroup:new(name, left, top, targetWidth, targetHeight)
    -- Inherit from Group
    myGroup = display.newGroup()

    -- Work Around (Dummy Display Object Insertion) (See Note 1)
    myGroup.dummyDO = display.newCircle( myGroup, 10, 10, 1 )
    myGroup.dummyDO:setFillColor(1,1,1,1)
    myGroup.dummyDO.debugComment = "Dummy Display Object"
    myGroup:insert(myGroup.dummyDO)

    myGroup.myGroupName = name      
    myGroup.debugComment = name
    myGroup.targetWidth = targetWidth
    myGroup.targetHeight = targetHeight
    myGroup.x = left
    myGroup.y = top


    function myGroup:GcInsertLRTB(displayO, leftP, rightP, topP, bottomP, debugComment)
        self:insert(displayO)   -- <=== DOES THIS UPSET THINGS FOR THE PARENT???

        -- Remove Work Around Dummy Display Object (See Note 1)
        if self.dummyDO then 
            self.dummyDO:removeSelf() 
            self.dummyDO = nil
        end

        displayO:setReferencePoint(display.TopLeftReferencePoint)
        displayO.x = leftP * 0.01 * self.targetWidth
        displayO.y =  (topP * 0.01) * self.targetHeight

        -- Scale Display Object (or set target's if adding another MyGroup)
        if not displayO.myGroupName then
            -- Not a MyGroup
            local xScale = (self.targetWidth * (rightP - leftP)/100) / displayO.width  
            local yScale = (self.targetHeight * (bottomP - topP)/100) / displayO.height
            displayO:scale(xScale, yScale)
        else
            -- Inserted object is a MyGroup
            displayO.targetWidth = self.targetWidth * (rightP - leftP)/100
            displayO.targetHeight = self.targetHeight * (bottomP - topP)/100 
            displayO:scale(1,1)  -- TODO: Probably don't need this
        end

    end

    return myGroup
end

-- Class Variables

-- Class Methods

return MyGroup

1 个答案:

答案 0 :(得分:0)

我认为问题可能是一个错误:“myGroup:setReferencePoint(display.TopLeftReferencePoint)导致项目移动”

那是:

  • AnscaMobile博客指出:“主要区别在于组的默认参考点是display.TopLeftReferencePoint,...
  • 将已存在的默认值应用于组会更改组中不应包含的项目的位置:例如代码:“myGroup:setReferencePoint(display.TopLeftReferencePoint)

因此,解决方法可能必须在类中进行if / then检查以确保setReferencePoint仅应用于非组。

与anscamobile一起提升为案例#14049