这是一个问题:我正在使用Corona SDK制作一个简单的物理游戏和非常简单的模块:http://developer.coronalabs.com/code/move-camera所以我有物理体和每个帧中的鱼对象(enterFrame事件)我居中相机就可以了
camera.x = -fish.x + screenWidth / 2
我有两个背景bg1和bg2,它们逐个平铺(bg1 bg2 bg1 bg2等)会产生很好的移动世界效果而用户不知道只有2个背景。问题是我无法正确计算他们的位置以产生这样的效果。我google了很多,但找不到任何符合我需求的东西。
这是一个我正在使用的免费艺术http://www.vickiwenderlich.com/2013/02/free-game-art-flying-goldfish/在那里你可以找到这两个背景。
鱼也可能在相反的方向上略微移动(通常它向右移动,以使世界移动的效果背景必须向左移动)所以如果它在计算中会很好。
我想出了类似的东西(但它不起作用,但也许我很接近):
local function updateFrame(event)
local m
local dfx = lfx - fish.x
lfx = fish.x
camera.x = -fish.x + screenWidth / 2
--print("dfx = " .. dfx)
bg1.x = bg1.x + dfx
bg2.x = bg2.x + dfx
s = s + dfx
if mAbs(s) > screenWidth then
m = sgn(s)
if m ~= 0 then
s = s - m * screenWidth
if m < 0 then
bg1.x = bg1.x - 2 * m * screenWidth
else
bg2.x = bg2.x - 2 * m * screenWidth
end
end
end
end
Runtime:addEventListener( "enterFrame", updateFrame );
s = screenLeft - screenWidth
其中s是移动的像素之和,如果它超过screenWidth,我会跳过其中一个背景,lfx是最后一个fish x位置,dfx是最后一个和当前鱼位置之间的差异,就是它。
如果你可以帮我计算或给我新的计算或者只是给一些有趣的链接,请在这里写下来。
任何帮助将不胜感激, 此致
答案 0 :(得分:1)
local road = display.newImageRect( "Images/roadBg1.png",2247/4,559/4 )
road:setReferencePoint( display.CenterLeftReferencePoint )
road.x = 0
road.y = baseline - 20
local road2 = display.newImageRect( "Images/roadBg1.png",2247/4,559/4 )
road2:setReferencePoint( display.CenterLeftReferencePoint )
road2.x = 2247/4
road2.y = baseline - 20
local tPrevious = system.getTimer()
local function move(event)
local tDelta = event.time - tPrevious
tPrevious = event.time
local xOffset = ( 0.2 * tDelta )
road.x = road.x - xOffset
road2.x = road2.x - xOffset
if (road.x + road.contentWidth) < 0 then
road:translate( 2247/4 * 2, 0)
end
if (road2.x + road2.contentWidth) < 0 then
road2:translate( 2247/4 * 2, 0)
end
Runtime:addEventListener( "enterFrame", move )
或查看丛林场景游戏的示例代码。
位置:SampleApps / Sprites / JungleScene
答案 1 :(得分:0)
试试这个:
local bg1 = display.newImageRect( "bg_1.png" ,480 ,320)
bg1.x = display.contentWidth/2; bg1.y = display.contentHeight/2
local bg2 = display.newImageRect( "bg_2.png" ,480 ,320 )
bg2.x = bg1.x + bg1.width; bg2.y = display.contentHeight/2
local speed = 30
function move()
bg1.x = bg1.x-speed;
bg2.x = bg2.x-speed;
if(bg1.x + bg1.width/2 < 0)then bg1.x = bg1.width*3/2-speed
elseif(bg2.x + bg2.width/2 < 0)then bg2.x = bg2.width*3/2-speed end
end
Runtime:addEventListener( "enterFrame", move )
继续编码............:)
答案 2 :(得分:0)
谢谢@krs和@Malar,结合你的答案,我想出了如何做到这一点:
local function updateFrame(event)
local speed = fish.x - lfx
lfx = fish.x
camera.x = -fish.x + screenWidth / 2
bg1.x = bg1.x - speed
bg2.x = bg2.x - speed
if bg1.x + bg1.width < 0 then
bg1.x = bg1.x + screenWidth * 2
end
if bg2.x + bg2.width < 0 then
bg2.x = bg2.x + screenWidth * 2
end
if bg1.x - bg1.width > 0 then
bg1.x = bg1.x - screenWidth * 2
end
if bg2.x - bg2.width > 0 then
bg2.x = bg2.x - screenWidth * 2
end
end
Runtime:addEventListener( "enterFrame", updateFrame );
起始位置:
bg1.x = screenLeft
bg2.x = bg1.x + bg1.width
最后一个最重要的变化: 我将bg1,bg2和相机放入一组,将其他物体放入相机组:
local camera = require("camera")
group = display.newGroup()
group:insert(bg1)
group:insert(bg2)
camera:insert(fish)
camera:insert(ground)
group:insert(camera)
所以我们有地面和鱼,可以永远移动,但背景只是从-screenWidth移动到screenWidth。
所有这些结合起来就像一个魅力!