Html5斜45度地图+3D模型ARPG系列教程(2)-- 相机更随及平滑
来源:互联网 发布:mmm互助平台源码下载 编辑:程序博客网 时间:2024/05/21 10:31
实现目标:
1.游戏场景管理器
如果是U3D的话相机更随就一个脚本直接挂主角上就搞定,但是LayaAir没有自带的2d相机,于是我用scrollRect来实现了一个,让主角不管怎么移动都保持在屏幕的中心,但是为了让相机移动起来相对平滑,加入了一个ease参数来进行调整。
地图边界处理的意思就是,当主角移动到地图边界的时候,只主角移动而摄像机不移动。很简单判断下scrollRect的坐标是否在(0,0,地图宽度,地图高度)范围内就ok了。
1.游戏场景管理器
2.摄像机跟随及平滑
3.地图边界处理
1.游戏场景管理器
不管你做什么游戏,首先呈现给用户的都是一个场景,对于用户来说他永远看到的是一个2d画面,而对于我们来说,一个场景分成了多个层。抛开UI暂且不谈,在这里我把游戏场景分成了,地图层,角色层,特效层,提示层,调试层(不够再加)
package com.gameLogic.scene{import com.gameLogic.utils.ObjDictionary;import laya.d3.core.Camera;import laya.d3.core.Sprite3D;import laya.d3.core.scene.Scene;import laya.display.Node;import laya.display.Sprite;import laya.maths.Point;public class SceneManager{private var _camera:Camera2D;public function get camera():Camera2D{return _camera;}private var _camera3d:Camera;public function get camera3d():Camera{return _camera3d;}private var _scene:Sprite;public function get scene():Sprite{return _scene;}private var _scene3d:Scene;public function get scene3d():Scene{return _scene3d;}private var _container3d:Sprite3D;private var _layer_map:Sprite;private var _layer_actor:Sprite;private var _layer_effect:Sprite;private var _layer_tip:Sprite;private var _layer_debug:Sprite;private var _layerDic:ObjDictionary;public function SceneManager(){}public function init():void{init2dScene();}private function init2dScene():void{_scene = new Sprite();_layer_map = new Sprite();_layer_actor = new Sprite;_layer_effect = new Sprite;_layer_debug = new Sprite;_layer_tip = new Sprite();_layer_debug.mouseEnabled = false;_layerDic = new ObjDictionary(Sprite);_layerDic.add(LayerEnum.MapLayer, _layer_map);_layerDic.add(LayerEnum.ActorLayer, _layer_actor);_layerDic.add(LayerEnum.EffectLayer, _layer_effect);_layerDic.add(LayerEnum.DebugLayer, _layer_effect);_layerDic.add(LayerEnum.TipLayer, _layer_tip);_scene.addChild(_layer_map);_scene.addChild(_layer_actor);_scene.addChild(_layer_effect);_scene.addChild(_layer_debug);_scene.addChild(_layer_tip);Laya.stage.addChild(_scene);_camera = new Camera2D(_scene);}public function addToLayer(spr:Sprite, layer:String=LayerEnum.MapLayer, posX:Number=0, posY:Number=0):void{var layerSpr:Sprite = _layerDic.get(layer) as Sprite;if(layerSpr){layerSpr.addChild(spr);spr.x = posX;spr.y = posY;}else{trace("can not find layer " + layer);}}public function getLayer(layer:String):Sprite{return _layerDic.get(layer);}public function add3dContent(node:Node):void{_container3d.addChild(node);}public function getGlobalScreenPos():Point{if(_scene)return _scene.localToGlobal(new Point(_scene.mouseX, _scene.mouseY));elsereturn new Point();}public function getMousePos():Point{if(_scene)return new Point(_scene.mouseX, _scene.mouseY);elsereturn new Point();}public function update():void{_camera.update();}private static var _instance:SceneManagerpublic static function get instance():SceneManager{if(!_instance){ _instance = new SceneManager(); }return _instance;}}}2.摄像机跟随及平滑
如果是U3D的话相机更随就一个脚本直接挂主角上就搞定,但是LayaAir没有自带的2d相机,于是我用scrollRect来实现了一个,让主角不管怎么移动都保持在屏幕的中心,但是为了让相机移动起来相对平滑,加入了一个ease参数来进行调整。
package com.gameLogic.scene{import com.gameLogic.utils.GameConfig;import laya.display.Sprite;import laya.maths.Point;import laya.maths.Rectangle;public class Camera2D extends Sprite{private var _cameraView:Rectangle;public function get cameraView():Rectangle{return _cameraView;}private var _scene:Sprite;private var _ease:Number = 0.0025;private var _focusTarget:Sprite = null;public function Camera2D(scene:Sprite){_cameraView = new Rectangle(0, 0, GameConfig.DeviceW, GameConfig.DeviceH);_scene = scene;_scene.scrollRect = _cameraView;}/** * 镜头跟随 */ public function focus(target:Sprite):void{_focusTarget = target;_cameraView.x = (_focusTarget.x-(GameConfig.DeviceW>>1));_cameraView.y = (_focusTarget.y-(GameConfig.DeviceH>>1));}private var _pos:Point = new Point();public function update():void{if(_focusTarget){_pos.x = (_focusTarget.x-(GameConfig.DeviceW>>1));_pos.y = (_focusTarget.y-(GameConfig.DeviceH>>1));if(_pos.x + GameConfig.DeviceW <= WorldMap.instance.mapW && _pos.x >= 0){_cameraView.x += (_pos.x - _cameraView.x) * Laya.timer.delta * _ease;}if(_pos.y + GameConfig.DeviceH <= WorldMap.instance.mapH && _pos.y >= 0){_cameraView.y += (_pos.y - _cameraView.y) * Laya.timer.delta * _ease;}}}}}3.地图边界处理
地图边界处理的意思就是,当主角移动到地图边界的时候,只主角移动而摄像机不移动。很简单判断下scrollRect的坐标是否在(0,0,地图宽度,地图高度)范围内就ok了。
if(_pos.x + GameConfig.DeviceW <= WorldMap.instance.mapW && _pos.x >= 0){_cameraView.x += (_pos.x - _cameraView.x) * Laya.timer.delta * _ease;}if(_pos.y + GameConfig.DeviceH <= WorldMap.instance.mapH && _pos.y >= 0){_cameraView.y += (_pos.y - _cameraView.y) * Laya.timer.delta * _ease;}4.上个图以及代码下载
源码下载
阅读全文
0 0
- Html5斜45度地图+3D模型ARPG系列教程(2)-- 相机更随及平滑
- Html5斜45度地图+3D模型ARPG系列教程(6)-- 寻路算法及平滑处理
- Html5斜45度地图+3D模型ARPG系列教程(5)-- 地图编辑器
- Html5斜45度地图+3D模型ARPG系列教程(4)-- 地图切块及动态加载
- Html5斜45度地图+3D模型ARPG系列教程(4)-- 地图切块及动态加载
- Html5斜45度地图+3D模型ARPG系列教程(1)-- 搭建开发环境
- Html5斜45度地图+3D模型ARPG系列教程(3)-- 关于如何运行示例项目
- Html5斜45度地图+3D模型MMORPG系列教程(最终版)
- 推荐个HTML5 2D引擎开发系列教程
- 噩梦系列篇之相机平滑跟随Player及Tag的设置
- [unity3d]设置3D模型显示在2D背景之前(多个相机分层显示)
- HTML5实现3D校园地图思路
- cocos2dx使用TiledMap模拟3D地图场景----斜45度2D地图的靠墙直线移动
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(九) 2D游戏角色在地图上的移动
- 2D游戏引擎Allegro 系列教程(四) 文字渲染及显示汉字的方法
- HTML5+WEBGL+PHP实现3D模型
- 从2D地图到3D城市模型的概略路线
- 基于HTML5 Canvas 点击添加 2D 3D 机柜模型
- C++图形打印题
- [设计模式]解释器模式(Interpreter)
- BSOI_2259.跳舞 (dance.pas/c/cpp)
- SQL 增加列、修改列、删除列
- C++之函数参数默认值
- Html5斜45度地图+3D模型ARPG系列教程(2)-- 相机更随及平滑
- PAT排名汇总
- jetty和tomcat的区别和关系
- 安装YII框架
- java学习【知识点及代码15】
- 获取广告在页面中的坐标
- 宏面积
- Android----网络图片游览器
- 云计算IaaS的核心技术:虚拟化技术