0

有没有人能看到这个用于 Corona 的 lua 代码中的逻辑缺陷?

这个概念是您创建一个新的“扩展”显示对象(例如 MyGroup:new(...)),然后您可以使用百分比将对象插入到它在父对象中的位置(因此无需使用像素计数) .

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

主程序.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
4

1 回答 1

0

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

那是:

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

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

以 anscamobile 为案例 #14049

于 2012-05-04T00:05:18.530 回答