【问题标题】:Best way to Drag an object off screen and immediately reappear - Corona将对象拖出屏幕并立即重新出现的最佳方法 - Corona
【发布时间】:2016-04-30 03:39:40
【问题描述】:

我试图找出将对象拖到一侧并让它立即重新出现在另一端的最佳方法,就像您正在拖动它的一个超大图像一样。

我设置了拖动控件,以便它们沿着整个 display.group 移动,但不知道大致正确的方法来完成这部分。

这是我的拖动功能

local baseGroup = display.newGroup()

function dragPlayer(e)
if gameIsActive == true then
    if(e.phase == 'began') then
        display.getCurrentStage():setFocus(baseGroup)
        lastX = e.x - baseGroup.x
        --print("DRAG")
    elseif(e.phase == 'moved') then
        baseGroup.x = e.x - lastX
    elseif(e.phase == 'ended') then 
        --print(player.x)
        --onScreenTouch()
    end
end
end

baseGroup:addEventListener("touch", dragPlayer)

【问题讨论】:

  • 如您希望它环绕屏幕?像吃豆人的游戏?还是别的什么?
  • 是的,就像吃豆子一样。几乎是无缝的,以至于你不会注意到它的循环。

标签: lua coronasdk


【解决方案1】:

您要查找的内容通常称为“无限背景”或“滚动背景”。这里有一些指南可以帮助您,第一个指南甚至可以帮助您设计图像本身:12

这是一个适用于单个图像的简单小块:

local landscape = display.newImageRect( "landscape-1.png", 1440, 320 )

-- landscape:setReferencePoint( display.TopLeftReferencePoint ) landscape_1.anchorX = 0 landscape_1.anchorY = 0 landscape_1.x = 0 landscape_1.y = 0

local function reset_landscape( landscape )     landscape.x = 0     transition.to( landscape, {x=0-1440+480, time=30000, onComplete=reset_landscape} ) end

reset_landscape( landscape_1 )

这个比较复杂,让您的设计更加棘手:

local function make_landscape( image, width, height, time )
    local landscape = display.newImageRect( image, width, height )

    -- landscape:setReferencePoint( display.TopLeftReferencePoint )
    landscape.anchorX = 0
    landscape.anchorY = 0   
    landscape.x = 0
    landscape.y = 320 - height
    landscape.time = time

    local function reset_landscape( landscape )
        landscape.x = 0
        transition.to( landscape, {x=0-landscape.width+480, time=landscape.time, onComplete=reset_landscape} )
    end

    reset_landscape( landscape )

    return landscape
end 

local landscape_group = display.newGroup()

local landscape_1 = make_landscape( "Landscape-1.png", 1440, 86, 10000 )
local landscape_2 = make_landscape( "Landscape-2.png", 1440, 168, 20000 )
local landscape_3 = make_landscape( "Landscape-3.png", 1440, 215, 30000 )

landscape_group:insert( landscape_3 )
landscape_group:insert( landscape_2 )
landscape_group:insert( landscape_1 )

当然,您必须根据需要进行自定义。希望对您有所帮助。

【讨论】:

  • 感谢 kirkpatt 的帮助,但我不想使用过渡和其他东西。对于我的特定游戏,我可以拖动屏幕对象并希望它环绕到另一端。
  • @DipeshDhanji 好的,很抱歉。您想要包装游戏环境本身,而不仅仅是背景。我会留下这个答案,以防其他人发现这个问题,但我会四处寻找,看看我能为物体本身找到什么。
  • 没关系,伙计。是的,只是显示组内的一些图形。我已经编辑了上面的帖子以显示我的拖动控件
【解决方案2】:

我不确定是否有另一种方法可以让 1 个物体缠绕在边界上。我猜不是。

我会想到的一种方法是在您的对象开始跨越一个边界时创建一个副本。然后这个副本将来自另一个寄宿生,做与原始对象完全相同的动作。 其中一个离开屏幕将导致其破坏,因此您再次只有一个对象。实现应该非常简单明了。

【讨论】:

  • 这听起来是个好主意。你将如何设置它?我之前在创建克隆的地方没有设置任何类似的东西。假设我有蓝色、红色、绿色的物体,它们包含特定的碰撞参数,我该如何设置它以便克隆也有这个参数?
  • @DipeshDhanji 我不是电晕专家。您应该了解是否有官方方法可以复制显示对象,例如 getCopy 函数并使用它。如果不是,您应该实现一个函数,通过创建一个新的显示对象并从原始对象复制所有属性(当然除了位置之外的所有属性)来复制它们。
  • 别担心,伙计,感谢您提供有关如何使其正常工作的建议。我应该能够从中得到一些工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2013-05-14
  • 1970-01-01
  • 2016-08-28
相关资源
最近更新 更多