这边想再单独和大家分享一下有关虚拟摇杆的开发经验,因为觉得这个功能还是很实用和用途广泛的!

效果:

运行地址:
http://h5demo.yyfuncdn.com/res/gameDemo/Pokemon/game.html

摇杆显示:

因为制作该游戏使用了 pixi 框架,所以需要利用 PIXI.Graphics() 方法绘制两个圆就可以了,一大一小,大圆为移动背景,给与一个颜色和透明度,默认隐藏即可,下面是绘制一个按钮移动背景圆的代码:

 var rockerbg = new PIXI.Graphics();//绘制摇杆背景rockerbg.lineStyle(0);//外边框宽度为0rockerbg.beginFill(0x000000, 0.3);//背景色 透明度var radius = 0;//半径if(phoneWidth > phoneHeight)radius = phoneWidth/10;else radius = phoneHeight/10;rockerbg.drawCircle(0,0,radius);//设置半径rockerbg.endFill();//结束绘画parent.addChild(rockerbg);//添加到舞台,parent为传进来的舞台参数

控制按钮同理,只不过小一点就可以了。当然如果小伙伴们图省事或不使用框架,找两个圆的图片也可以,但是要注意设置锚点为中心

摇杆功能:

接下来就要具体说明一下他是如何将被操作的人或物捆绑到一起的了,在该宝可梦游戏中主要为了提供给角色一个速度,这个速度是一个 json 数据,里面存放了 x 轴与 y 轴的速度

var speed = {x:0,y:0};

如何实现触摸屏幕给与速度相应数据呢,这就要用到开启舞台交互事件中的“鼠标按下”、“鼠标抬起”、“鼠标移动”三个事件

其中“鼠标按下”事件中控制获取当前鼠标位置,以及按钮的显示

    app.stage.on("pointerdown",function(event){//在鼠标按下位置显示控制器var pos = event.data.getLocalPosition(app.stage);rockerbg.x = pos.x;rockerbg.y = pos.y;rockerbg.visible = true;})

“鼠标抬起”事件中控制控制器隐藏以及速度归零

    app.stage.on("pointerup",function(){//鼠标抬起时控制器隐藏,速度归零rocker.x = 0;rocker.y = 0;rockerbg.visible = false;speed = {x:0,y:0};})

“鼠标移动”事件是整个控制的关键,他将控制按钮的移动,利用大圆与小圆的圆心位置获得角色所需的移动方向,因为角色只能四个方向移动,所以只需要先判断小圆圆心据原点的X轴与Y轴绝对值的最大值,再判断最大值为正值或负值即可得出角色的移动方向

    rocker.on("pointermove",function(event){//利用判断控制器在控制器背景原点的方向进行设置角色移动方向var pos = event.data.getLocalPosition(app.stage);var A = rockerbg.x-pos.x;//摇杆起始点与鼠标X轴距离var B = rockerbg.y-pos.y;//摇杆起始点与鼠标Y轴距离var Z = radius;//控制器背景的半径var X = pos.x-rockerbg.x;//获取鼠标X轴位置var Y = pos.y-rockerbg.y;//获取鼠标Y轴位置if(Z*Z<A*A+B*B){//判断鼠标位置是否超出摇杆移动范围var angle = Math.atan((pos.y-rockerbg.y)/(pos.x-rockerbg.x));//计算鼠标与摇杆起始点角度if(pos.x<rockerbg.x){//判断鼠标是否在摇杆左侧X = -Z*Math.cos(angle);Y = -Z*Math.sin(angle);}else{//判断鼠标是否在摇杆右侧X = Z*Math.cos(angle);Y = Z*Math.sin(angle);}}speed = {x:0,y:0};var movescope = rockerbg.width/6;//设置控制器移动的最小范围(当超过这个值时则可设置方向与速度)if(Math.abs(X) > Math.abs(Y) && Math.abs(X) > movescope){if(X < 0){obj.moveState = true;obj.direction = "a";//人物动画speed.x = -3;//设置x轴速度}else if(X > 0){obj.moveState = true;obj.direction = "d";//人物动画speed.x = 3;//设置x轴速度}}else if(Math.abs(X) < Math.abs(Y) && Math.abs(Y) > movescope){if(Y < 0){obj.moveState = true;obj.direction = "w";//人物动画speed.y = -3;//设置y轴速度}else if(Y > 0){obj.moveState = true;obj.direction = "s";//人物动画speed.y = 3;//设置y轴速度}}rocker.x = X;//设置按钮x坐标rocker.y = Y;//设置按钮y坐标})

上面代码中各行都有详细的功能注释说明,希望对大家的理解有所帮助,最后的最后是调用当前对象中的 getSpeed 方法即可获取该对象中的 json 数据 speed

    this.getSpeed = function(){return speed;}

下面的是整个虚拟控制器的完整代码

function Fsvjoy(parent){//虚拟控制器var self = this;var rockerbg = new PIXI.Graphics();//绘制摇杆背景rockerbg.lineStyle(0);rockerbg.beginFill(0x000000, 0.3);var radius = 0;if(phoneWidth > phoneHeight)radius = phoneWidth/10;else radius = phoneHeight/10;rockerbg.drawCircle(0,0,radius);rockerbg.endFill();parent.addChild(rockerbg);var rocker = new PIXI.Graphics();//绘制摇杆rocker.lineStyle(0);rocker.beginFill(0xf0f0f0,0.7);rocker.drawCircle(0,0,rockerbg.height/8);rocker.endFill();rockerbg.addChild(rocker);rockerbg.visible = false;var obj = null;this.setobj = function(role){obj = role;}var speed = {x:0,y:0};app.stage.interactive = true;//开启舞台交互app.stage.on("pointerdown",function(event){//在鼠标按下位置显示控制器var pos = event.data.getLocalPosition(app.stage);rockerbg.x = pos.x;rockerbg.y = pos.y;rockerbg.visible = true;})app.stage.on("pointerup",function(){//鼠标抬起时控制器隐藏,速度归零rocker.x = 0;rocker.y = 0;rockerbg.visible = false;speed = {x:0,y:0};})rocker.interactive = true;//开启摇杆交互rocker.on("pointermove",function(event){//利用判断控制器在控制器背景原点的方向进行设置角色移动方向var pos = event.data.getLocalPosition(app.stage);var A = rockerbg.x-pos.x;//摇杆起始点与鼠标X轴距离var B = rockerbg.y-pos.y;//摇杆起始点与鼠标Y轴距离var Z = radius;//控制器背景的半径var X = pos.x-rockerbg.x;//获取鼠标X轴位置var Y = pos.y-rockerbg.y;//获取鼠标Y轴位置if(Z*Z<A*A+B*B){//判断鼠标位置是否超出摇杆移动范围var angle = Math.atan((pos.y-rockerbg.y)/(pos.x-rockerbg.x));//计算鼠标与摇杆起始点角度if(pos.x<rockerbg.x){//判断鼠标是否在摇杆左侧X = -Z*Math.cos(angle);Y = -Z*Math.sin(angle);}else{//判断鼠标是否在摇杆左侧X = Z*Math.cos(angle);Y = Z*Math.sin(angle);}}speed = {x:0,y:0};var movescope = rockerbg.width/6;//设置控制器移动的最小范围(当超过这个值时则可设置方向与速度)if(Math.abs(X) > Math.abs(Y) && Math.abs(X) > movescope){if(X < 0){obj.moveState = true;obj.direction = "a";speed.x = -3;}else if(X > 0){obj.moveState = true;obj.direction = "d";speed.x = 3;}}else if(Math.abs(X) < Math.abs(Y) && Math.abs(Y) > movescope){if(Y < 0){obj.moveState = true;obj.direction = "w";speed.y = -3;}else if(Y > 0){obj.moveState = true;obj.direction = "s";speed.y = 3;}}rocker.x = X;rocker.y = Y;})this.getSpeed = function(){return speed;}
}

游戏开发:Html5 虚拟摇杆控制人物移动相关推荐

  1. Unity实战篇:实现虚拟摇杆控制人物(Easy Touch 5.X插件)

    先上一张效果图 1.先导入Easy Touch 5.X插件 https://download.csdn.net/download/qq_15020543/10718144 强烈建议大家去Unity 商 ...

  2. cocos2dx游戏开发学习——虚拟摇杆(8方向)讲解

    写这篇博客的目的主要是记录一下 虚拟摇杆的实现过程.虚拟摇杆一般分文四方向和八方向,也主要根据项目需求来决定.直接进入主题吧. 先上效果图: 方向的思路分析 看图,说先我们可以将8个方向在坐标系中画出 ...

  3. Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要格斗》(1)

      这里是Evankaka的博客,欢迎大家前面讨论与交流------      转载请注明出处http://blog.csdn.net/evankaka/article/details/4204350 ...

  4. 手机游戏摇杆控制人物移动解决方案

    手机游戏摇杆控制人物移动解决方案 https://zhuanlan.zhihu.com/p/358614239 完成之后的演示 一.摇杆的UI搭建 Panel里主要是一个摇杆的背景(圆环)和摇杆头(红 ...

  5. Cocos2d-x虚拟摇杆控制精灵上下左右运动之————“赵云要格斗”(1)

    转载请注明出处http://blog.csdn.net/evankaka/article/details/42043509 有需要源代码和材料的邮箱留个,这里实现了能通过虚拟摇杆控制精灵的运动,而且能 ...

  6. 360度虚拟摇杆控制机器人前进后退转弯(一)

    项目需求 最近做一个项目,要求使用虚拟摇杆控制机器人设备前进后退转弯,整个过程的思路不算复杂,写篇文章记录下大致思路 (1)黄色圆不动时候 小车速度为0 (2)拖动摇杆 拖动距离越大 小车速度越大 距 ...

  7. 《Cocos Creator游戏实战》虚拟摇杆实现

    虚拟摇杆实现 摇杆布局实现 摇杆功能实现 用摇杆控制主角 该功能已收录在Many Widgets插件中,使用Cocos Creator 3.x版本的小伙伴可以用该插件快速生成摇杆. 插件地址:http ...

  8. 喵的Unity游戏开发之路 - 玩家控制下的球的滑动

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  9. Unity3D游戏开发第三人称角色控制的模式

    众所周知,在Unity3D游戏开发中,经常会用到角色控制,一般情况下角色控制有第一人称和第三人称两种,在 RPG 游戏中通常以第三人称的形式出现.而对于第三人称角色控制而言,通常有 2 种模式,我们今 ...

  10. Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机

    前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控制器,主要看看UGUI虚拟摇杆是否可以完美的控制移动和旋转.(PS:主要是为接下来的项目做技术测试),手游版的CF ...

最新文章

  1. 1.2.2 OSI参考模型 下
  2. Win2003 安全设置大全
  3. pythonweb开发需要学哪些知识,python web需要了解哪些
  4. python 字符串 编码 解码_Python 字符串编解码研究
  5. ajax 请求_你了解前端出现Ajax跨域请求的原因吗?
  6. 利用WebBrowser获得页面部分数据
  7. Kotlin 1.3带来稳定的协程、合约及其他
  8. linux 微秒延时_Linux基础知识(Linux系统、Linux中的链表)
  9. Referrer Policy:strict-origin-when-cross-origin 404
  10. java什么是类枚举类_Java 枚举类 详解
  11. 01单片机——基础知识
  12. HtmlHelper、TagHelper、局部视图、视图组件
  13. Anaconda中pkgs文件夹详解
  14. java毕业设计宠物寄养预约系统Mybatis+系统+数据库+调试部署
  15. 求最大公约数及求多个数的最大公约数
  16. 身份证OCR识别发展史
  17. WIN SECS .NET 2.7
  18. mac 上如何安装及切换输入法
  19. 进销存表格模版制作软件
  20. 从零搭建仿抖音短视频APP-后端开发短视频业务模块(1)

热门文章

  1. 【C++ 程序】 解线性方程组(Cramer法则)(分数形式结果)
  2. 达梦数据库的学习使用
  3. STM32开发小结--使用STM32F4串口的空闲中断模式+DMA接收不定长数据帧
  4. 近世代数--陪集--拉格朗日定理|G|=|H|·[G:H],传递性[G:H][H:K]=[G:K]
  5. verilog qpsk调制解调
  6. vivado 开发教程(一) 创建新硬件工程
  7. max31865C语言程序,max31865温度传感器通信驱动代码
  8. 大数据技术原理与应用(第八章HBase测试)
  9. matlab反拉氏变换,matlab拉普拉斯变换.doc
  10. 账龄分析表excel模板_老会计分享财务报表及EXCEL会计报表分析系统模板!收藏领取!...