love2d教程6--摄相机2边界和图层
2012-12-20 21:26
295 查看
接着上一篇的教程,我们现在可以四处移动了,但是地图是有限的,玩家在移动过程中
会走出地图外,我们可以加边界限定.
现在要实现当玩家超出限定时地图不动的效果.
这次的代码更改如下:
camera.lua里增加边界设置
更改设置偏移的函数,setY()和setX类似,完整的代码请看附件.
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
测试效果如图:
具体的代码请下载,有注释
http://pan.baidu.com/share/link?shareid=139826&uk=1913510140
会走出地图外,我们可以加边界限定.
现在要实现当玩家超出限定时地图不动的效果.
这次的代码更改如下:
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
相关文章推荐
- love2d教程5--摄相机1视角跟随玩家
- lua & love2d 简单入门教程
- love2d教程2--绘图和文字
- love2d教程17--物理引擎1
- love2d教程3--输入和音乐
- love2d教程24--碰撞跳跃
- Direct2D教程(十二)图层
- love2d教程22--金庸群侠资源格式解析1
- love2d教程8--动画
- Direct2D教程(十二)图层
- love2d教程9--角色移动
- love2d教程26--对话条
- love2d教程18--物理引擎2
- love2d教程34--thread模块
- love2d教程16--简单拼音中文输入法
- Direct2D教程(十二)图层
- love2d教程21--定时器
- love2d教程12--画布和批量绘图
- love2d教程4--材质和贴图
- love2d教程27--菜单