Corona SDK Display Group Problema: ¿dónde está el error en este código?

¿Alguien puede ver la falla lógica en este código lua para Corona?

El concepto es crear un nuevo objeto de visualización "extendido" (por ejemplo, MiGrupo: nuevo (...)), después de lo cual puede insertar objetos en este usando porcentajes para su posición en el elemento principal (por lo que no es necesario usar conteos de píxeles) .

Problema: el problema es que los objetos dibujados están aproximadamente en los lugares correctos, pero ¿solo un poco fuera? Tengo la sensación de que es algo debido a que quizás las coordenadas cambien en el padre en la línea "self: insert (displayO)".

principal.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)

MiGrupo.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

preguntado el 03 de mayo de 12 a las 07:05

Acabo de crear un nuevo proyecto usando este código, reemplazando el activo toolbarArea_button.png. Realmente no puedo entender cuál es el problema, ¿puedes crear un ejemplo más claro y preciso? (comience eliminando el código comentado, no estoy seguro de si eso es lo que está causando el problema o qué?). -

Estoy empezando a pensar que el concepto podría ser defectuoso. Es decir, si uno de los grupos cambia, no habrá un evento desencadenante para restablecer mis objetos en función de los porcentajes. ¿Qué piensas? ¿Quizás necesite seguir con la configuración Corona a través de distancias de píxeles? -

1 Respuestas

Creo que el problema es probablemente un error: "myGroup:setReferencePoint(display.TopLeftReferencePoint) hace que los elementos se muevan"

Esto es:

  • El blog de AnscaMobile afirma: “La principal diferencia es que el punto de referencia predeterminado para un grupo es display.TopLeftReferencePoint,…
  • Aplicar el valor predeterminado ya existente a un grupo cambia las ubicaciones de los elementos en el grupo donde no debería: por ejemplo, el código: "myGroup:setReferencePoint(display.TopLeftReferencePoint)

Por lo tanto, es posible que la solución alternativa tenga que estar en la clase para hacer una verificación si/entonces para asegurarse de que setReferencePoint solo se aplique a los que no son grupos.

Criado con anscamobile como caso #14049

contestado el 04 de mayo de 12 a las 01:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.