手遊搖桿(一)最簡單的四方向搖桿
搖桿是所有手遊中不可或缺的一部分,是最基本的操作方式,下面是用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);
}
},
});
到這裡,就可以看到角色在搖桿的控制下動起來了,當然還有很多細節需要優化的地方,後面再加上。
相關推薦
手遊搖桿(一)最簡單的四方向搖桿
搖桿是所有手遊中不可或缺的一部分,是最基本的操作方式,下面是用cococ creator實現的一個簡單的搖桿,後面將基於此慢慢優化。 一 場景 新建一個場景,拖入三中圖片,如圖: 分別表示: spPlayer 代表遊戲中的角色,通過搖桿控制其移
深入淺出手遊封包一套好資料教程
主要詳細講解手機遊戲的輔助開發技術所需知識,學習手機遊戲的輔助是如何開發的, 包括安卓模擬器各方面分析等,學習手遊封包解密和加密等技術 包含兩大技術知識如下: 學習後,可以自己開發所有手機遊戲的 按鍵輔助 和 封包輔助 輔助程式,課程講解秉承著我們獨立團一貫以來的:全面,詳
unity3d手遊破解(一)
重點知識: Assembly-CSharp.dll扔進Reflector+reflexil環境轉:https://bbs.pediy.com/thread-226135.htm最近找樂子破解了點手遊玩玩,順便分享一下,目標APK--發條英雄。1、大致分析拿到APK先看看lib
Unity 實現手遊裡面滑輪搖桿控制移動
很多手遊裡面都有一個滑輪控制人物移動 我前段時間也研究了一下 下面附上原始碼,因為有註釋我就不多說什麼了 原始碼: public class CoronaScripts : MonoBehaviour {  
使用EasyTouch一分鐘簡單製作搖桿
使用EasyTouch一分鐘簡單製作搖桿<一> 1.效果: 2.過程 (1).、首先把EasyTouch這個外掛匯入到新建的工程裡,我用的是Easy Touch5.0.12。 (2)、建立一個Easytouch,一個InputManager,還有一個New Joystick
查找(一)史上最簡單清晰的紅黑樹解說
ont 演示 detail align article 向上 節點 動態插入 列表 查找(一) 我們使用符號表這個詞來描寫敘述一張抽象的表格。我們會將信息(值)存儲在當中,然後依照指定的鍵來搜索並獲取這些信息。鍵和值的詳細意義取決於不同的應用。 符號表中可能會保
最簡單,有效的學習mysql教程(一)
數據 處理 ron 解釋 學習 clas itl title 庫存 數據庫 1 定義 數據庫,可以簡單的解釋為:高效的存儲和處理數據的介質(主要分為磁盤和內存兩種)。 2 分類 根據數據庫存儲介質的不同,可以將其分為兩類,即:關系型數據庫(SQL)和非關系型數據庫(NoSQ
建一座安全的“天空城” ——揭秘騰訊WeTest如何與祖龍共同挖掘手遊安全漏洞
rpg 差異 商業 log 自動 pla 腳本 逆向 對比 作者:騰訊WeTest手遊安全測試團隊商業轉載請聯系騰訊WeTest獲得授權,非商業轉載請註明出處。 WeTest導讀 《九州天空城3D》上線至今,長期穩定在APP Store暢銷排行的前五,本文將介紹騰訊W
一步步搭建最簡單author2.0認證服務
web api ref pen pass 比較 mar prim uri part oauth2.0 最早接觸這個概念是在做微信訂閱號開發。當時還被深深的繞進去,關於oauth2.0的解釋網上有好多,而且都講解的比較詳細,下面給大家價格參考資料。 http://owin.o
可能是最簡單的面向對象入門教程(一 ) 一個鴨子引發的血案
CP object 語言 語言特性 ogr 只知道 stat 了解 turn 本文假設,諸位看官完全不了解,何謂面向對象,如果已經入門請跳過。另:歡迎交流,不喜勿噴。 假設你只知道class的概念,但是還沒有深入理解,不理解屬性,不理解方法,那麽看下去。 有這麽一個場景
python 最簡單的web應用(一)
code http服務器 doc == utf with con enc quest 對於所有的Web應用,本質上其實就是一個socket服務端,用戶的瀏覽器其實就是一個socket客戶端。 server.py文件 #!/usr/bin/env python # -*-
史上最簡單的SpringCloud教程 | 第十一篇: docker部署spring cloud項目
大數 imageview 建議 chapter 環境 多次 pan mas 存儲 Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare m
一文秒懂如何搭建一個最簡單的充值系統
數據 一起 表示 存在 除了 社會 index 原因 必須 ? ???閱讀完本文大概需要5分鐘。 目錄 移動支付 微信支付 支付寶支付 充值體系 最基礎的架構 生產環境應用 總結 參考 ? ???一切都是生意。“天下熙熙皆為利來,天下攘攘皆為利往”。不知
【Android】從無到有:手把手一步步教你使用最簡單的Fragment(三)
轉載請註明出處,原文連結:https://blog.csdn.net/u013642500/article/details/80585416 【本文適用讀者】 用程式碼建立並使用了 Fragment,新增 Fragment 之
【Android】從無到有:手把手一步步教你使用最簡單的Fragment(二)
轉載請註明出處,原文連結:https://blog.csdn.net/u013642500/article/details/80579389 【本文適用讀者】 targetSdkVersion 版本大於等於 21,即 app 即將有可能
【Android】從無到有:手把手一步步教你使用最簡單的 Fragment(一)
轉載請註明出處,原文連結:https://blog.csdn.net/u013642500/article/details/80515227 【本文適用讀者】 知道 Fragment 是什麼,不知
thinkphp 5 自動生成模組,最簡單方式,一句程式碼
直接在專案入口檔案中加上最後一句就夠了 可以不依賴自動生成檔案,直接使用預設目錄生成模組,例如: // 定義應用目錄 define('APP_PATH', __DIR__ . '/../application/'); // 載入框架引
收藏:近期已上線或即將上線的熱門手遊盤點,射擊魔幻角色扮演?總有一款適合你
最近哪些手遊比較好玩?近期有不少遊戲上線或者即將上線,給大家推薦一些比較好玩的。有你喜歡的嗎? 1、流星蝴蝶劍(已上線) 8月21日上線的網易大型號稱真硬核動作手遊流星蝴蝶劍上線了,iOS首發便登頂下載榜。一提到網易,想到的就是RPG,從最早的“夢幻西遊”、“倩女幽魂”,到最近的“楚留香”等
網易史上最難遊戲?流星蝴蝶劍手遊手殘黨怎麼解決操作難度問題
網易的新遊流星蝴蝶劍好玩嗎?流星蝴蝶劍上線幾天了,玩家的評價普遍還不錯: 玩家評價 玩家評價 玩家評價 但是不少玩家發現手機操作流星蝴蝶劍的操作難度是有點高的,難度在於滑動螢幕還需要連招,手游上不自動鎖定boss,需要手動是鎖定boss。就拿王者榮耀來說,他是自動鎖
OpenAI Gym 入門與提高(一) Gym環境構建與最簡單的RL agent
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!