摇杆是所有手游中不可或缺的一部分,是最基本的操作方式,下面是用cococ creator实现的一个简单的四方向摇杆,后面将基于此慢慢优化。

一、场景

新建一个场景,拖入三中图片,如图:

分别表示:spPlayer 代表游戏中的角色,通过摇杆控制其移动;

spRoker 摇杆的事件影响区域;

spRokerCenter 摇杆的中心点。

二、事件监听

为了能控制摇杆,需要监听摇杆的事件,新建一个脚本CompRoker,挂到Canvas上,然后编辑器其内容如下:

cc.Class({

extends: cc.Component,

properties: {

spPlayer: cc.Sprite,

spRoker: cc.Sprite,

spRokerCenter: cc.Sprite

},

onLoad: function () {

this.spRoker.node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);

this.spRoker.node.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);

this.spRoker.node.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);

this.spRoker.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);

},

onTouchStart: function(event) {

console.log("start ...");

},

onTouchMove: function(event) {

console.log("move ...");

},

onTouchEnd: function(event) {

console.log("end ...");

},

onTouchCancel: function(event) {

console.log("cancel ...");

},

});

定义了三个变量,分别表示前面说到的三个控件,从cocos中,将其关联到相应的变量,然后运行,可以看到输出,说明事件监听正确。

三、方向控制

首先,我们做一个最简单的额四方向摇杆,控制角色上下左右移动。

如图,当我们触摸点在spRoker的不同区域,分别表示角色向不同的方向移动。

那么,如何来判断触摸点落在那个区域呢,以spRoker的原点为坐标原点的直角坐标系中,对角线的方程即为: x = y和x = -y,每个区域分别为:上:x < y 且 x > -y

下:x > y 且 x < -y

左:x < y 且 x < -y

右:x > y 且 x > -y

基于这个原理,添加一个函数getDirection根据传入点来获取方向,如下:

onTouchStart: function(event) {

var touchPoint = event.getLocation();

var pos = this.spRoker.node.convertToNodeSpaceAR(touchPoint);

var dir = this.getDirection(pos);

console.log("start ...", dir);

},

onTouchMove: function(event) {

var touchPoint = event.getLocation();

var pos = this.spRoker.node.convertToNodeSpaceAR(touchPoint);

var dir = this.getDirection(pos);

console.log("move ...", dir);

},

getDirection: function(pos) {

var x = pos.x;

var y = pos.y;

if (x <= y && x > -y) {

return cc.v2(0, 1);// 上

} else if (x >= y && x < -y) {

return cc.v2(0, -1);// 下

} else if (x <= y && x < -y) {

return cc.v2(-1, 0);// 左

} else {

return cc.v2(1, 0);// 右

},

运行,点击摇杆的不同位置,验证获得的方向是否准确。

此外,我们需要需要不断的更新摇杆中心点的位置。

onTouchStart: function(event) {

var touchPos = event.getLocation();

var pos = this.spRoker.node.convertToNodeSpaceAR(touchPos);

var dir = this.getDirection(pos);

console.log("start ...", dir);

this.updateRokerCenterPos(pos);

},

onTouchMove: function(event) {

var touchPos = event.getLocation();

var pos = this.spRoker.node.convertToNodeSpaceAR(touchPos);

var dir = this.getDirection(pos);

console.log("move ...", dir);

this.updateRokerCenterPos(pos);

},

onTouchEnd: function(event) {

console.log("end ...");

this.updateRokerCenterPos(cc.v2(0, 0));

},

onTouchCancel: function(event) {

console.log("cancel ...");

this.updateRokerCenterPos(cc.v2(0, 0));

},

updateRokerCenterPos: function(pos) {

this.spRokerCenter.node.setPosition(pos);

四、控制角色移动

通过上面的几几个步骤,已经得到移动的方向,据此,可以来更新角色的位置,另外为了控制角色移动快慢,在设置一个速度。 最终代码如下:

cc.Class({

extends: cc.Component,

properties: {

spPlayer: cc.Sprite,

spRoker: cc.Sprite,

spRokerCenter: cc.Sprite,

moveSpeed: {

type: cc.Float,

default: 1

},

onLoad: function () {

this.spRoker.node.on(cc.Node.EventType.TOUCH_START, this.onTouchStart, this);

this.spRoker.node.on(cc.Node.EventType.TOUCH_MOVE, this.onTouchMove, this);

this.spRoker.node.on(cc.Node.EventType.TOUCH_END, this.onTouchEnd, this);

this.spRoker.node.on(cc.Node.EventType.TOUCH_CANCEL, this.onTouchCancel, this);

},

onTouchStart: function(event) {

var touchPos = event.getLocation();

var pos = this.spRoker.node.convertToNodeSpaceAR(touchPos);

var dir = this.getDirection(pos);

this.moveDir = this.getDirection(pos);

this.updateRokerCenterPos(pos);

},

onTouchMove: function(event) {

var touchPos = event.getLocation();

var pos = this.spRoker.node.convertToNodeSpaceAR(touchPos);

this.moveDir = this.getDirection(pos);

this.updateRokerCenterPos(pos);

},

onTouchEnd: function(event) {

this.updateRokerCenterPos(cc.v2(0, 0));

this.moveDir = null;

},

onTouchCancel: function(event) {

this.updateRokerCenterPos(cc.v2(0, 0));

this.moveDir = null;

},

getDirection: function(pos) {

var x = pos.x;

var y = pos.y;

if (x <= y && x > -y) {

return cc.v2(0, 1);// 上

} else if (x >= y && x < -y) {

return cc.v2(0, -1);// 下

} else if (x <= y && x < -y) {

return cc.v2(-1, 0);// 左

} else {

return cc.v2(1, 0);// 右

},

updateRokerCenterPos: function(pos) {

this.spRokerCenter.node.setPosition(pos);

},

updatePlayerPos: function(dir) {

this.spPlayer.node.x += dir.x * this.moveSpeed;

this.spPlayer.node.y += dir.y * this.moveSpeed;

},

update: function(dt) {

if (this.moveDir) {

this.updatePlayerPos(this.moveDir);

},

});

到这里,就可以看到角色在摇杆的控制下动起来了,当然还有很多细节需要优化的地方,后面再加上。

android 四方向摇杆源码,手游摇杆(一)最简单的四方向摇杆相关推荐

  1. 视频教程-Layabox3D游戏视频教程-源码-手游开发

    Layabox3D游戏视频教程-源码 有多年Unity程序开发经验,有策划和美术设计的经验.愿意在csdn这个平台和大家一起分享! 金龙 ¥49.00 立即订阅 扫码下载「CSDN程序员学院APP」, ...

  2. 仿《游戏鸟》网站源码+手游发号评测/游戏下载网站模板

    正文: 帝国cms仿<游戏鸟>模板源码,92kaifa版APP下载类整站源码.手机游戏门户网站模板,大型手游门户网站模板. 支持PC与手机端同步生成html,需多端同步生成插件. PS:图 ...

  3. 仿酷酷游戏网源码/手游综合门户帝国CMS7.5模板

    正文: 帝国cms7.5仿<酷酷游戏网>源码,帝国cms手游综合门户网站模板,外观大气漂亮的手机游戏下载.游戏资讯.游戏新闻门户.综合手游门户网站模板,包含礼包功能.开测功能.专题.专区. ...

  4. 帝国CMS7.5仿《六皮游戏网》源码/手游门户网站模板/手机游戏下载模板

    ☑️ 编号:ym249 ☑️ 品牌:帝国CMS ☑️ 语言:PHP ☑️ 大小:101MB ☑️ 类型:手游门户 ☑️ 支持:pc+wap

  5. 消消乐php源码,手游泡泡消消乐设计(内附代码)

    有段日子没分享代码了,今天分享一个原本打算上架的项目,游戏做到中途本打算放弃开发,放了一段时间,觉得有些可惜,还是把主体功能写完成了,项目就不上架了,代码分享给大家吧.项目中的UI布局样式也是我自己设 ...

  6. android 修改编译内核源码 对抗反调试

    0×00  写在前面 攻防对立.程序调试与反调试之间的对抗是一个永恒的主题.在安卓逆向工程实践中,通过修改和编译安卓内核源码来对抗反调试是一种常见的方法.但网上关于此类的资料比较少,且都是基于AOSP ...

  7. 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )

    文章目录 安卓直播推流专栏博客总结 一. RTMP 协议 二. RTMP 协议使用 三. RTMPDump 源码下载 四. RTMPDump 源码交叉编译 五. RTMPDump 源码导入 Andro ...

  8. android 三方_面试官送你一份Android热门三方库源码面试宝典及学习笔记

    前言 众所周知,优秀源码的阅读与理解是最能提升自身功力的途径,如果想要成为一名优秀的Android工程师,那么Android中优秀三方库源码的分析和理解则是必备技能.就拿比较热门的图片加载框架Glid ...

  9. Android短视频系统源码功能测试(个人总结完整版)

    Android短视频系统源码功能测试包含短视频系统源码的安装卸载测试,界面测试,业务功能测试,短视频系统源码特性测试,交叉事件测试,兼容性测试,升级更新测试,消息通知测试,功能键测试,手势测试等 1- ...

最新文章

  1. 多行列表右边距为零的实现方法
  2. 有点长的 Java API 设计清单
  3. 《敏捷软件开发》学习笔记 第20章
  4. 字符串-判断数字的三个方法
  5. 计算机中记录的意思,电脑日志看不懂,怎么才能知道日志记录的是什么意思啊?...
  6. C# Explicit 和 Implicit
  7. 【教程】Edraw Max使用教程:Edraw Max快速入门指南
  8. 利用python判断素数
  9. postgresql division by zero
  10. B05 - 008、什么是大数据
  11. 一个计算机毕业生的2012年求职之路
  12. 计算机图形学直线算法程序,计算机图形学直线生成算法实现.doc
  13. MySQL派生表联表查询记录
  14. thinkphp实现邮箱发送
  15. 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版)
  16. 微信小程序 - text 标签头部有空白间距
  17. LINUX支持exfat格式U盘
  18. 大数据前端可视化大屏--前端开发之路
  19. if-else深度优化:巧用状态变更枚举类
  20. UG/NX 8.0安装方法(图文详解)

热门文章

  1. 以奴仆命风月-人间词话
  2. 华为云数据库DDS产品深度赋能
  3. 华为鸿蒙os视频馀承东,布局智慧家庭:荣耀首款搭载华为鸿蒙OS智慧屏正式发布...
  4. cmpp,sgip协议发送 彩信,视频短信的教程
  5. HMW案例拆解:iOS游戏免费榜第一名【网吧模拟器】如何提升留存率?
  6. SassScript
  7. TOMCAT/JS/CSS/JavaWeb/浏览器老是加载缓存/谷歌浏览器/微软浏览器/刷新键都按烂了/无法加载样式解决办法之一
  8. 对可口可乐瓶进行图像识别
  9. 计算机网络功能及计算机网络分类
  10. java.lang.IllegalStateException: Duplicate key 【java8 toMap(key重复如何解决)】