love2d教程6--摄相机2边界和图层

接着上一篇的教程,我们现在可以四处移动了,但是地图是有限的,玩家在移动过程中

会走出地图外,我们可以加边界限定.

现在要实现当玩家超出限定时地图不动的效果.

这次的代码更改如下:

camera.lua里增加边界设置

--左上角,右下角的坐标
function camera:setBounds(x1, y1, x2, y2)
  self._bounds = { x1 = x1, y1 = y1, x2 = x2, y2 = y2 }
end

更改设置偏移的函数,setY()和setX类似,完整的代码请看附件.

--设置摄相机的x偏移,如果value在左右边界之间,那么设置
--摄相机的x偏移为value;若value小于左边界设置x偏移为左边界;
--若value大于右边界,设置x偏移为右边界
function camera:setX(value)
   if self._bounds then
    self._x = math.clamp(value, self._bounds.x1, self._bounds.x2)
  else
    self._x = value
  end
end
--把x,y固定到 min , max之间 画个坐标轴就明白了
function math.clamp(x, min, max)
  return x < min and min or (x > max and max or x)
end

--[[ 上面的代码等价与下面的
function math.clamp(x, min, max)
    if x < min then
        return min
    elseif x > max then
        return max
    else
        return x
    end
end
]]

main.lua里在 love.load()里添加

camera:setBounds(tilemap._X-player.X,tilemap._Y-player.Y,880-player.X,780-player.Y)

这里的边界实际相当于(地图左时角x坐标,地图左时角y坐标,地图右下角x坐标,地图右下角y坐标)
因为后面整体向左,和向上偏移了,所以减了偏移.

效果如图,玩家移动到地图外后,地图将不再移动.

 

下面接着说图层,一个游戏上的所有元素,肯定不是一幅图片,都是由很多不同的

图片合成的,这些图片显示时肯定有先后关系,要不然前面的会把后面的遮住.

而且不图的图片也会有不同的绘制函数.我们可以把在图片分层,把具有相同显示

顺序的图片放在一个图层里,在对这个图层操作,那样就易管理.

现在我们把camera里新增一个layers成员.

--layers里面存放绘图函数和缩放系数
camera.layers = {}

创建图层的函数newLayer()

--创建图层,  scale是此层的缩放系数,func是用来绘图的函数
function camera:newLayer(scale, func)
    table.insert(self.layers, { draw = func, scale = scale })
    table.sort(self.layers, function(a, b) return a.scale < b.scale end)
end

绘图函数draw

function camera:draw()
    local bx, by = self._x, self._y

    --即偏移=原偏移*缩放,因为要形成近大远小的效果
    for _, v in ipairs(self.layers) do
    self._x = bx * v.scale
    self._y = by * v.scale

    --设置摄相机
    camera:set()
    v.draw() --调用layer 里的draw函数
    camera:unset()
    end
end

测试效果如图:

具体的代码请下载,有注释

http://pan.baidu.com/share/link?shareid=139826&uk=1913510140

 

 

posted @ 2012-12-20 21:26  半山th  阅读(1243)  评论(2编辑  收藏  举报