Animation 在if语句中使用精灵表移动图像

Animation 在if语句中使用精灵表移动图像,animation,if-statement,lua,coronasdk,Animation,If Statement,Lua,Coronasdk,我有一只海狸,打算跟随用户frog。它以较慢的速度向青蛙的方向移动。但是,我希望海狸有一个左右动画。所以我有动作,只是没有动画 local BidoofSheetData = { width = 32, height = 48, numFrames = 8, sheetContentWidth = 128, sheetcontentheight = 96 } --Set File Actual size bidoofSheet = graphic

我有一只海狸,打算跟随用户
frog
。它以较慢的速度向青蛙的方向移动。但是,我希望海狸有一个左右动画。所以我有动作,只是没有动画

local BidoofSheetData = 
{   
    width = 32,
    height = 48,
    numFrames = 8,
    sheetContentWidth = 128,
    sheetcontentheight = 96
}

--Set File Actual size
bidoofSheet = graphics.newImageSheet ("BidoofSpriteSheet.png", BidoofSheetData)

--Set the sequences
local bidoofsequenceData = {
    {name = "bstop", start = 1, count = 1, time = 300},
    {name = "bleft", start = 2, count = 3, time = 300},
    {name = "bright", start = 5, count = 3, time = 300} 
}

--frog mask
local physicsData = (require "bidoofdefs").physicsData(1.0)

--Link sheet data to previous settings
beaver = display.newSprite(bidoofSheet, bidoofsequenceData)
beaver.x = display.contentWidth/2
beaver.y = 284
physics.addBody( beaver, "static")
beaver.isFixedRotation = true

--
function moveBeaver ()
    if frog.x > beaver.x then
        beaver.x = beaver.x + 0.5
    elseif frog.x < beaver.x then
        beaver.x = beaver.x - 0.5
    elseif frog.x == beaver.x then
        beaver.x = beaver.x
    end
end
Runtime:addEventListener("enterFrame", moveBeaver)
本地BidoofSheetData=
{   
宽度=32,
高度=48,
numFrames=8,
sheetContentWidth=128,
高度=96
}
--设置文件的实际大小
bidoofSheet=graphics.newImageSheet(“BidoofSpriteSheet.png”,BidoofSheetData)
--设定顺序
本地bidoofsequenceData={
{name=“bstop”,开始=1,计数=1,时间=300},
{name=“bleft”,开始=2,计数=3,时间=300},
{name=“bright”,开始=5,计数=3,时间=300}
}
--青蛙面具
本地物理数据=(需要“bidoofdefs”)。物理数据(1.0)
--将图纸数据链接到以前的设置
beaver=display.newSprite(bidoofSheet,bidoofsequenceData)
beaver.x=display.contentWidth/2
海狸y=284
physics.addBody(海狸,“静态”)
beaver.isFixedRotation=true
--
函数moveBeaver()
如果frog.x>beaver.x,那么
海狸.x=海狸.x+0.5
如果青蛙.x<海狸.x那么
beaver.x=beaver.x-0.5
elseif frog.x==beaver.x那么
beaver.x=beaver.x
结束
结束
运行时:addEventListener(“enterFrame”,moveBeaver)
我试图将它添加到
moveBeaver
函数中,但它不起作用

编辑: 我尝试添加
beaver:setSequence(“bleft”);海狸:在不同区域播放()。如果你在各自的方向上移动,它会播放一帧左,一帧右。如果移动到最左边或最右边并停止,它将不断播放左边和右边的帧


但它没有播放我想要的3帧动画

首先,我注意到您的工作表数据不一致

local BidoofSheetData = 
{   
    width = 32,
    height = 48,
    numFrames = 8,
    sheetContentWidth = 128,
    sheetcontentheight = 96 -- Shouldn't this be sheetContentHeight ?
}
我不确定
sheetContentHeight
的大小写是否合适,但我想我会提出来。我想我现在知道你的动画有什么问题了。您将其设置为在海狸需要移动时随时播放,这会将其重置为动画的第一帧

local BidoofSheetData = 
{   
    width = 32,
    height = 48,
    numFrames = 8,
    sheetContentWidth = 128,
    sheetcontentheight = 96
}

--Set File Actual size
bidoofSheet = graphics.newImageSheet ("BidoofSpriteSheet.png", BidoofSheetData)

--Set the sequences
local bidoofsequenceData = {
    {name = "bstop", start = 1, count = 1, time = 300},
    {name = "bleft", start = 2, count = 3, time = 300},
    {name = "bright", start = 5, count = 3, time = 300} 
}

--frog mask
local physicsData = (require "bidoofdefs").physicsData(1.0)

--Link sheet data to previous settings
beaver = display.newSprite(bidoofSheet, bidoofsequenceData)
beaver.x = display.contentWidth/2
beaver.y = 284
physics.addBody( beaver, "static")
beaver.isFixedRotation = true

--
function moveBeaver ()
    if frog.x > beaver.x then
        beaver.x = beaver.x + 0.5
    elseif frog.x < beaver.x then
        beaver.x = beaver.x - 0.5
    elseif frog.x == beaver.x then
        beaver.x = beaver.x
    end
end
Runtime:addEventListener("enterFrame", moveBeaver)
请尝试以下方法:

function updateAnim(who, seq)
    if who.sequence == seq then
        -- We're already animating the way we need to be.
        return
    end

    who:setSequence(seq)
    who:play()
end

function moveBeaver()
    -- Get the distance from beaver to frog's position.
    local d = frog.x - beaver.x

    -- This will allow the beaver to stop precisely on the frog's position,
    -- without exceeding a distance of +/- 0.5 per move.
    if d == 0 then
        updateAnim(beaver, "bstop")
    elseif d > 0 then
        beaver.x = beaver.x + math.min(d, 0.5)
        updateAnim(beaver, "bright")
    else
        beaver.x = beaver.x + math.max(d, -0.5)
        updateAnim(beaver, "bleft")
    end
end

首先,我注意到您的工作表数据不一致

local BidoofSheetData = 
{   
    width = 32,
    height = 48,
    numFrames = 8,
    sheetContentWidth = 128,
    sheetcontentheight = 96 -- Shouldn't this be sheetContentHeight ?
}
我不确定
sheetContentHeight
的大小写是否合适,但我想我会提出来。我想我现在知道你的动画有什么问题了。您将其设置为在海狸需要移动时随时播放,这会将其重置为动画的第一帧

local BidoofSheetData = 
{   
    width = 32,
    height = 48,
    numFrames = 8,
    sheetContentWidth = 128,
    sheetcontentheight = 96
}

--Set File Actual size
bidoofSheet = graphics.newImageSheet ("BidoofSpriteSheet.png", BidoofSheetData)

--Set the sequences
local bidoofsequenceData = {
    {name = "bstop", start = 1, count = 1, time = 300},
    {name = "bleft", start = 2, count = 3, time = 300},
    {name = "bright", start = 5, count = 3, time = 300} 
}

--frog mask
local physicsData = (require "bidoofdefs").physicsData(1.0)

--Link sheet data to previous settings
beaver = display.newSprite(bidoofSheet, bidoofsequenceData)
beaver.x = display.contentWidth/2
beaver.y = 284
physics.addBody( beaver, "static")
beaver.isFixedRotation = true

--
function moveBeaver ()
    if frog.x > beaver.x then
        beaver.x = beaver.x + 0.5
    elseif frog.x < beaver.x then
        beaver.x = beaver.x - 0.5
    elseif frog.x == beaver.x then
        beaver.x = beaver.x
    end
end
Runtime:addEventListener("enterFrame", moveBeaver)
请尝试以下方法:

function updateAnim(who, seq)
    if who.sequence == seq then
        -- We're already animating the way we need to be.
        return
    end

    who:setSequence(seq)
    who:play()
end

function moveBeaver()
    -- Get the distance from beaver to frog's position.
    local d = frog.x - beaver.x

    -- This will allow the beaver to stop precisely on the frog's position,
    -- without exceeding a distance of +/- 0.5 per move.
    if d == 0 then
        updateAnim(beaver, "bstop")
    elseif d > 0 then
        beaver.x = beaver.x + math.min(d, 0.5)
        updateAnim(beaver, "bright")
    else
        beaver.x = beaver.x + math.max(d, -0.5)
        updateAnim(beaver, "bleft")
    end
end

您说过您试图将它添加到
moveBeaver
函数中,但它没有起作用。你到底尝试了什么?你说你试图将它添加到
moveBeaver
函数中,但没有成功。你到底试了什么?谢谢你它很管用!!但是如果我向左(或向右)移动并停止。一旦海狸达到与青蛙相同的x坐标。对不起,我对这一切还是很陌生的。我不明白你的意思。编辑:如果我向右或向左移动一点,它将播放停止序列,但如果移动超过100像素,则它不会播放停止序列,而是同时播放左右。对不起,没有,我已将精灵表更改为正确的大小。我认为这是做if语句的一件事,事实上,if一个接一个地运行第一个到ifs。但我不知道我会修好它。编辑:它就像青蛙。x不能和海狸相等。如果你走得太远了,谢谢你,它能工作!!但是如果我向左(或向右)移动并停止。一旦海狸达到与青蛙相同的x坐标。对不起,我对这一切还是很陌生的。我不明白你的意思。编辑:如果我向右或向左移动一点,它将播放停止序列,但如果移动超过100像素,则它不会播放停止序列,而是同时播放左右。对不起,没有,我已将精灵表更改为正确的大小。我认为这是做if语句的一件事,事实上,if一个接一个地运行第一个到ifs。但我不知道我会修好它。编辑:这就像青蛙。如果你走得太远,x不能等于海狸