【问题标题】:Corona SDK object follows "swipe" direction?Corona SDK 对象遵循“滑动”方向?
【发布时间】:2014-08-02 03:16:46
【问题描述】:

我正在尝试做一些非常简单的事情,因为我是 Corona SDK 的新手,但我遇到了很多问题。

我想要完成的是当用户“滑动”、“甩动”、“甩动”屏幕的某个区域(设置为屏幕一半的图像)时,屏幕中间的球会移动以设定的速度向那个方向。没有物理或任何特别的东西。所以基本上,如果您以某个角度滑动图像,球将移动到该角度并最终离开屏幕除非您再次向不同方向“滑动”球。

我目前拥有的是:

physics.addBody( ball, "dynamic" )

function flick(event)
    if event.phase == "moved" then
        ball:applyForce( (ball.x) * 0.5, (ball.y) * 0.5, ball.x, ball.y )
    end
end

目前,当您移动球时,它只会朝一个方向(0.5)射门,我如何获得“投掷”的方向?

我是电晕新手,仍在尝试找出触摸事件。我还是有点困惑。

感谢任何帮助和建议!谢谢大家!

【问题讨论】:

  • 这个问题似乎离题了,因为它缺少基本的代码示例。

标签: lua coronasdk


【解决方案1】:

您需要跟踪触摸的开始和结束位置:这就是轻弹。沿 x 和 y 的起点和终点之间的差异将给出球的运动方向。如果球速取决于用户轻弹的速度,那么您也需要跟踪时间。另外,我不确定为什么要使力与对象的位置成正比:这意味着如果对象处于 0,0 就没有力,那可能不是您想要的。您只需要与轻弹矢量成比例的力。时间的长短将决定时间。它看起来像这样:

local flickStartTime = 0

local function touch(event)
    if event.phase == "began" then
        flickStartTime = system.timer()

    elseif event.phase == "ended" then
        local flickDuration = system.timer() - flickStartTime 
        if flickDuration <= 0 then return end -- ignore flick

        local speedX = (event.xStart - event.x)/flickDuration 
        local speedY = (event.yStart - event.y)/flickDuration 
        local coef = 0.1 -- adjust this via "trial and error" so moves at "reasonable" speed
        -- only react to flick if it was large enough
        if math.abs(event.xStart - event.x) > 10 or math.abs(event.yStart - event.y) > 10 then
            ball:applyForce( coef * speedX, coef * speedY, ball.x, ball.y )
        end
    end
end

但是你说你不想要任何物理,但你施加力,你的意思是你只想设置速度?然后你会调用setLinearVelocity(speedX, speedY)而不是applyForce

local speedX = (event.xStart - event.x)/flickDuration 
local speedY = (event.yStart - event.y)/flickDuration 
local coef = 0.1 -- adjust this via "trial and error" so moves at "reasonable" speed
-- only react to flick if it was large enough
if math.abs(event.xStart - event.x) > 10 or math.abs(event.yStart - event.y) > 10 then
    ball:setLinearVelocity( coef * speedX, coef * speedY )
end

【讨论】:

  • 我的答案是第一个,代码逻辑几乎一样,但没有得分。我想我很糟糕。
【解决方案2】:

从表面上看,flick 是一个触摸监听器。您必须过滤传递的事件,并确定用户滑动的方向。阅读更多关于touch listeners here

您感兴趣的是xStartyStart 属性,并测量用户移动了多少,如下所示:

local function flick(event)
    if event.phase == "moved" then
        local diffX = event.xStart - event.x
        local diffY = event.yStart - event.y
        if math.abs(diffX) > 10 or math.abs(diffY) > 10 then
            ball:applyForce( (ball.x) * diffX, (ball.y) * diffY, ball.x, ball.y )
        end
    end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 2011-12-18
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多