如何使用Lua在触摸屏上绘制可变大小的圆形

在空白.png(800 X 800)上,可绘制大小不同的圆形,并在触摸和运行时显示。触摸时,坐标(在运行时触摸下的x轴和y轴坐标位置)将在开始事件中存储在两个变量myCoordx和myCoordy中。当用户在屏幕上滑动手指时,将基于计算半径和坐标绘制圆形。现在错误一直出现,请帮我调试这段代码。

运行时错误
d:\ corona项目\ enterframeevent\ main.lua:14:尝试索引全局变量'drawCircle'(空值)
堆栈跟踪:
d:\ corona项目\ enterframeevent\ main.lua:14:在主块中

这是我的main.lua文件。

local screen = display.newImage(“blank.png”)

function drawCircle:touch(event)
    if event.phase ==“began”then
        local myCoordx = event.x
        local myCoordy = event.y

    elseif event.phase ==“moved”then
        local rad =(event.x- myCoordx)^ 2
        local myCircle = display.newCircle(event.x,event.y,rad)
        myCircle:setFillColor(1,0,1)

    end
end

Runtime:addEventListener(“touch”,drawCircle)
点赞
用户936986
用户936986

显然,您尝试向 drawCircle 添加 :touch 方法,但是您没有在任何地方进行定义。您至少应将其初始化为一个空表——即 {} 或者使用相关的 Corona 方法进行创建。

2014-10-02 12:30:58
用户608097
用户608097

我认为你应该使用以下代码:

-- 我认为你应该在函数之外定义这些变量,因为它们在“moved”阶段将超出作用域
local myCoordx = 0
local myCoordy = 0

-- 把这个声明移到函数外面,
-- 这样它可以被重用,而且移除了
local myCircle

function onTouch(event)
    if event.phase == "began" then

        myCoordx = event.x
        myCoordy = event.y

    elseif event.phase == "moved" then

        local rad = (event.x - myCoordx) ^ 2

        -- 请记住这一行代码将在每个“移动”阶段绘制一个新圆,保留旧的圆。
        -- 如果我理解正确,这不是你想要的
        -- local myCircle = display.newCircle(event.x, event.y, rad )

        -- 相反的,改为移除旧的显示对象...
        if myCircle then
            myCircle:removeSelf()
            myCircle = nil
        end

        -- ...然后再次添加
        myCircle = display.newCircle(event.x, event.y, rad )
        myCircle:setFillColor( 1, 0, 1 )

    end
end

-- 由于“drawCircle”未定义,直接将其指向一个函数(在本例中为“onTouch”)。
-- Runtime:addEventListener( "touch", drawCircle )
Runtime:addEventListener( "touch", onTouch )

我没有在模拟器上测试代码,稍后我会尝试并在需要时更新答案。

更新: 已经测试,它像我预期的那样工作。

2014-10-03 14:41:54
用户869951
用户869951

根据我的评论,发布的代码无法编写,或者错误消息是错误的。我会假设错误是错误的,因为语句 function drawCircle: touch(event) 在第3行尝试将一个叫做 touch(self) 的方法添加到一个 drawCircle 表中;然而,该代码没有在任何地方创建此表。您可能会漏掉 drawCircle = display.newSomething...,或者您可以简单地使用一个函数而不是一个方法:

function touch(event)
    ...
end

Runtime:addEventListener( "touch", touch)

后者之所以能够工作,是因为您的 touch 函数不使用关键字 self,这是一个为方法隐含创建的变量。

2014-10-05 02:25:25