Corona SDK Lua,如何制作手指绘图/绘画应用程序?

时间:2015-01-19 09:11:21

标签: ios sdk lua drawing corona

我是Lua的新手,我写了以下代码。

   display.setStatusBar(display.HiddenStatusBar)

--Create the 'brush'
function paint(event)
    locationX = event.x
    locationY = event.y
    brush = display.newCircle(locationX, locationY, 5)
end

Runtime:addEventListener("touch", paint)

只要点击/保持鼠标,每次调用paint函数时,它都会在屏幕上放置一个圆圈。但是,我移动鼠标的速度越快(我使用的是Corona SDK),圆圈的间距越大,它就会中断线条的流动。

我怎么能改变这一点,以便画出流畅的线条,没有休息?

1 个答案:

答案 0 :(得分:0)

根据您的代码,您在那里做的只是在触发触摸事件时放一个圆圈(因此display.newCircle)。当您开始触摸屏幕时(在模拟器中单击鼠标),当您在屏幕上移动手指,以及当您松开手指或将手指从屏幕上移开时,会触发touch event

在您的情况下,您将在第一次触摸屏幕时放置一个5像素的圆圈,手指在哪里移动,以及将手指/鼠标从屏幕上抬起的位置。您的问题出现在手指移动阶段或event.phase ="移动"。发生这种情况的原因是,您在移动过程中获得的触摸事件数量受限于您使用的硬件。因此,如果移动足够大,您的放置圆圈之间将放置触摸事件或您的情况下的函数paint,因为此限制而未调用。

如果您只想要一条线,可以采用newLine方法而不是newCircle方法。您必须将您的触摸输入分为不同的阶段,然后开始","移动","结束"。在"开始期间"阶段你会发起你的新行。在"移动"或"结束"阶段,您创建(使用newLine函数)或使用append函数添加到现有行。

我没有测试过这段代码,但它可能看起来像这样:

local line                      --variable to hold the line object
local initX                     --initial X coordinate of touch
local initY                     --initial Y coordinate of touch
local lineCreated = false       --Flag to check if line is already created 

--Create the 'brush'
function paint(event)
    locationX = event.x
    locationY = event.y
    if event.phase == "began" then   --first touch
        --Delete previous line (in this case no multiple lines)
        if(line) then
            line:removeSelf()
            line = nil
        end

        --Set initX and initY with current touch location           
        initX = locationX       
        initY = locationY
    elseif event.phase == "moved" then   --during touch movement
        if lineCreated then
            --line has been created, just append to existing line
            line:append(locationX, locationY)
        else
            --Line has not been created
            --Make new line object, set color, and stroke width
            line = display.newLine(initX, initY, locationX, locationY)
            line:setStrokeColor( 0, 0, 1 )
            line.strokeWidth = 5

            --set line created flag to true
            lineCreated = true
        end     
    elseif event.phase == "ended" or event.phase == "cancelled" then --touch lifted
        --append last touch location to the line
        line:append(locationX, locationY)   
    end
    return true
end

Runtime:addEventListener("touch", paint)

这是一条基本线,因此角落可能不平滑。要制作流畅的线条,您需要应用比较复杂的算法,例如贝塞尔曲线。对于其他编程语言有很多讨论(重要的是算法,当你更熟悉Lua时,你可以很容易地将它用于Corona,Lua是一种相对容易学习的语言)。您可以获得数学路径here,并且可以找到Corona的一个来源here