農藥迷們看過來,Vue居然能夠實現遊戲搖杆

2021-02-13 開課吧訂閱號

最早實現這個效果,是2011年用Objective-C在iOS裡實現的。原倉庫地址:https://code.google.com/archive/p/ccjoystick/downloads

在Vue裡實現這個東西沒啥用處,畢竟Vue也不是一個遊戲框架,但是誰叫Vue這個話題的熱度最高呢😁,寫文章還是希望被更多人看到嘛...

印象裡我在不同時期曾經用三種語言分別實現過這個案例。所以無論用什麼框架、語言,只要你了解背後的原理,都很容易實現。


01 三層UI第三層是底,只是放在畫面中,為了讓視覺感受更完整。

當然沒有第二層和第三層是不影響搖杆功能的,但誰叫我是一個擬物流的前端偏執狂呢?


把這三個層通過絕對定位+z-index疊起來,通過設置touch事件讓桿頭可以拖動。為了讓大家看得清楚層級,我們先把桿頭變透明。02 圓形的拖拽區

搖杆嘛,圓形的洞裡有根杆(不要汙呀),所以我們必須把拖拽限制在一個圓形區域裡。

onTouchMove(e){
  var curTouch=e.touches[0];
  var tleft=curTouch.clientX-startLeft;
  var ttop=curTouch.clientY-startTop;
  //獲取點擊位置和起點的直線距離,也就是半徑
  var distance = getDistance(tleft,ttop,0,0);
  //如果這個距離是否大於圓形可移動區域的半徑,則強行變更
  if(distance>=this.ballMoveRadius)distance = this.ballMoveRadius;

  //最後通過夾角,正弦,餘弦,半徑還原x,y坐標
  var angle = Math.atan2((ttop-0), (tleft-0));
  this.left=Math.cos(angle)*distance;
  this.top=Math.sin(angle)*distance;
}

代碼中比較核心的部分是:我們先通過所在點和原點位置求出半徑distance,以及之間的夾角角度angle。然後通過限定半徑和夾角角度還原出x,y的坐標。就可以達到控制拖動在圓形區域內的效果了。

//獲取兩點間直線距離的算法
var getDistance=function(x1, y1, x2, y2) {
  var _x = Math.abs(x1 - x2); 
  var _y = Math.abs(y1 - y2); 
  return Math.sqrt(_x * _x + _y * _y);
}


03 羞澀的杆體杆體是這裡面最麻煩的一塊,需要通過搖杆的拖拽的距離變化長度,同時根據搖杆的位置旋轉角度。

<view class='stick' :class="{animation:inDraging===false&&transition}" :style="{height: stickHeight+'px',transform:'translateX(-50%)'}">
  <view :style="{transform:'rotate('+(angle/(3.14159/180)-90)+'deg)'}" style="transform-origin: 50% 0%;width: 100%;height: 100%;">
    <slot name="stick">
    </slot>
  </view>
</view>

這裡我用了兩層dom來完成這個杆體,一層用height進行高度變化,一層用transfrom設置旋轉角度和旋轉中心點。大家有更好的實現方法嗎,在評論區告訴我吧。

夾角轉為旋轉角度算法angle/(3.14159/180),減去90是為了讓度數起點在12點鐘的位置。

onTouchMove(e){
  var curTouch=e.touches[0];
  var tleft=curTouch.clientX-startLeft;
  var ttop=curTouch.clientY-startTop;

  var distance = getDistance(tleft,ttop,0,0);
  if(distance>=this.ballMoveRadius)distance = this.ballMoveRadius;

  var angle = Math.atan2((ttop-0), (tleft-0));
  this.left=Math.cos(angle)*distance;
  this.top=Math.sin(angle)*distance;

  //同步杆體的高度,旋轉角度
  this.stickHeight = distance;
  this.angle = angle;
}

現在搖杆UE基本就完成了,接下來我們要輸出一些數值,畢竟搖杆不能光自己搖,得用來控制其他的元素進行運動。 04 搖杆數值

方向我們在杆體運動的時候,已經寫完了,就是那個角度angle。

power = 當前半徑/最大半徑;

搖杆力度這件事在拳皇裡是不存在的,但是在很多遊戲中分輕推和重推(其實就是搖杆當前距離和最大距離的比),比如輕推是走,重推是跑。

gif有點掉幀,大家能看出來運動的快慢嗎?


05 組件化

現在把上面的成果封裝成一個vue組件,方便復用。

<ezjoystick
    :touchRadius="100"
    :ballMoveRadius="50"
    :transition="true"
    @onJoyStickUpdate="onBeetleJoystickUpdate"
    >
    <view slot="ball">
    </view>
    <view slot="stick">
    </view>
    <view slot="bottom">
    </view>
</ezjoystick>

ballMoveRadius 桿頭的最大移動範圍半徑

三個slot

三個slot都是非必須的,不填的話,該部分就是空dom。具體可參考源碼。

onJoystickUpdate 有數值變化就會觸發
06 實現經典UI組件封裝好了,接下來用咱們這個組件實現幾個經典的界面吧


模擬十字鍵,核心是把角度轉成4個方向,這裡我隨手寫了一下,應該有更優雅的實現。


onCrossJoyStickUpdate(obj){
    this.crossupPressed=false;
    this.crossrightPressed=false;
    this.crossdownPressed=false;
    this.crossleftPressed=false;
    if(obj.angle>-2.35&&obj.angle<-0.75){
        this.crossupPressed=true;
    }else if(obj.angle>-0.75&&obj.angle<0.75){
        this.crossrightPressed=true;
    }else if(obj.angle>0.75&&obj.angle<2.35){
        this.crossdownPressed=true;
    }else{
        this.crossleftPressed=true;
    }
}


07 源碼倉庫


https://github.com/ezshine/ezjoystickclone源碼後使用HBuilerX打開可以快速看到實例,或將components複製到vuecli項目中導入使用。數位化人才教育平臺開課吧已獲5.5億美元獨立融資,領跑新職業教育賽道,累積累積文獻超過500萬。我們整合了全球知名度IT和網際網路企業一線師資,提供Java,Web前端,數據分析,Python ,人工智慧,產品運營,智能物聯等技術課程。您將與國內外知名院校的畢業生及各大廠的職場精英,共同探索計算機科學帶來的世界變革。

相關焦點

  • 用Vue實現一個街機遊戲搖杆
    前言最早實現這個效果,是2011年用Objective-C在iOS裡實現的。原倉庫地址:https://code.google.com/archive/p/ccjoystick/downloads在Vue裡實現這個東西沒啥用處,畢竟Vue也不是一個遊戲框架,但是誰叫Vue這個話題的熱度最高呢😁,寫文章還是希望被更多人看到嘛...
  • 基於Vue實現一個有點意思的拼拼樂小遊戲
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言為了加深大家對vue的了解和vue項目實戰,筆者採用vue生態來重構此項目,方便大家學習和探索。
  • 電視遊戲還可以這樣玩?KO電玩城定製版拳霸街機搖杆測評
    日前電科技收到的KO電玩城的遊戲大禮包,由遊戲外設知名企業拳霸為KO電玩城深度定製的"Q1斬"家用遊戲搖杆。在傾力打造模擬器遊戲的KO電玩城的遊戲平臺下,這款遊戲搖杆的出現為電視遊戲外設的多樣化發展提供了一個發展平臺。
  • 現在你玩街機遊戲,一般使用搖杆、手柄、鍵盤、還是手機呢?
    當年我們在遊戲廳玩《街頭霸王2》的時候,玩家們別無選擇的使用了搖杆。因此認為搖杆才是最好用的設備。不過那時候玩家們的技術,真心的菜,就連反升龍拳都搖不出來。但是使用搖杆卻是最有感覺的。多年後,很多玩家開始在電腦上面玩模擬器回味街機遊戲,因為沒有遊戲設備,因此不得不嘗試用鍵盤來玩,本來初期非常不習慣的,但是經過一段時間的鍛鍊,發現使用鍵盤竟然可以打出當年打不出來的招式。這時候玩家們才明白,鍵盤可以簡化出招,甚至有的比較繁瑣的招式都可以通過鍵盤打出來。
  • 北通阿修羅3遊戲手柄體驗:首創物理變速搖杆,遊戲玩家的利器!
    今天為大家介紹的手柄品牌來自北通,北通一直是以手柄控制器、適配器和其他配件而聞名,近期北通也推出了全新的阿修羅 3 遊戲手柄,我也是第一時間拿到了這款遊戲手柄,現在為各位玩家們送上它的使用感受分享。一個好的遊戲手柄應該符合人體工學設計,即使雙手出汗仍然能保持穩定的握感。
  • 在vue項目中使用vuex實現狀態管理的案例
    並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。準備工作:a.在vue項目中安裝vuex: npm install vuex -S。b.了解下vuex的五個屬性。modules:模塊化管理vuex,實現項目中拆分的每個功能模塊都有各自的 state,getter,mutations,actions。
  • Razer街機遊戲搖杆原型機開發至第13版 已進入最終Beta測試階段
    2011年的東京電玩展上我們首次宣布了該Beta測試計劃,目前此計劃將步入第二年,並且我們也對該街機遊戲搖杆進行反覆修改,到了第13個版本。已有200名格鬥遊戲玩家與MOD玩家收到了我們最新的原型機樣機,並開始在遊戲中進行測試,他們的反饋將幫助我們開發出終極街機遊戲搖杆。
  • 萊仕達PXN-00081街機遊戲搖杆怎麼樣?使用評測
    然而最美好的時光是在「一周的零花錢才能去一次的遊戲廳」,而每次去都會叫上同學、朋友一起,有人一起玩感覺樂趣增加了很多,而且畢竟零花錢有限,自己玩結束了看朋友玩也是一種樂趣。拳皇97,是一款SNK公司發布於1997年的街機格鬥遊戲,在國內非常受歡迎,相比拳皇前三個版本各方面均有較大改進,是拳皇系列的成熟之作。也有一些經過修改的版本。不管是在街機還是家用機還是PC模擬器上,都有無數Fans。
  • vue輪播圖實現
    其中數據為定義的模擬數據,接下來是代碼的實現過程:1、使用swiper插件:vue-awesome-swiper(Github上搜索相對應插件)2、下載插件到項目內:npm install vue-awesome-swiper@2.6.7 --save //(@x.x.x表示插件版本)3、全局下(main.js)引入:import VueAwesomeSwiper from 'vue-awesome-swiper'import
  • Vue使用swiper實現輪播圖效果
    實現案例演示:可以實現功能:1.下方分頁器也可實現點擊切換banner圖效果3. 還可以通過設置屬性的方式實現一些輪播的效果(例如:設置autoplay屬性,即可讓banner圖自動輪播.設置loop屬性,讓輪播圖輪播是否為循環輪播.)二、 在vue中swiper的使用方式1.
  • vue-router 實現分析
    是 Vue.js 官方的路由庫,本著學習的目的,我對 vue-router 的源碼進行了閱讀和分析,分享出來給其他感興趣的同學做個參考吧。深入如何實現對地址變更的監聽?對於預設的 HashHistory 模式(也就是基於頁面地址的 hash 部分來實現路由功能,如 http://example.com/path#/foo、http://example.com/path#/bar),是通過監聽 hashChange 事件來實現:window.addEventListener('hashchange', () =>
  • Unity3D中使用Joystick Pack實現搖杆控制
    花了幾個小時重新根據Unity3D的初學者教程做了一個簡單的Demo,做完後確實對新人來說是個比較不錯的學習項目,項目中控制人物移動是用的鍵盤的方向鍵,就想如果在手機平臺的話,實現搖杆控制方向
  • Springboot Vue Login(從零開始實現Springboot+Vue登錄)
    小Hub領讀:一個完整的Spirngboot+vue實現登錄的小例子,我之前在vueblog中也搞過,哈哈,再來回顧一下!
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    它們通過ViewModel來通信,ViewModel通常要實現一個observer觀察者,當數據發生變化,ViewModel能夠監聽到數據的這種變化,然後通知到對應的視圖做自動更新,而當用戶操作視圖,ViewModel也能監聽到視圖的變化,然後通知數據做改動,這實際上就實現了數據的雙向綁定。
  • iPad專用遊戲搖杆 Fling簡單評測
    今天講給大家介紹的這款產品,來自於TEN ONE推出的iPad搖杆。用在iPad上玩遊戲    這是一款名為Fling的全透明iPad搖杆,它採用樹脂材料製成,採用純物理操作手法,無需插電,也不需要與iPad有任何的線纜連接,只需要用吸盤吸在 iPad的屏幕上就可以使用
  • 重燃格鬥之魂,格威爾角鬥士大搖杆
    選擇遊戲外設的大標準是什麼?手感手感還是手感!對於遊戲發燒友來說,選擇遊戲外設的參考標準就是它是否能夠再現「原汁原味」的手感。近期,隨著CPS3宣告破解成功,街機模擬器這個話題又再度火熱起來,不少格鬥迷都紛紛在電腦上戰起了《街頭霸王3.3》這隻經典2D格鬥遊戲。
  • 戰爭雷霆搖杆外設介紹 搖杆外設推薦
    戰爭雷霆搖杆外設介紹,搖杆外設推薦,今天小編給大家帶來的是遊戲全真模式推薦使用的搖杆設備介紹,一起來看看!  趁著這次歷史全真比賽和THRUSTMASTER與戰爭雷霆在ChinaJoy上的合作活動,和大家聊一聊在cj上看到的戰爭雷霆搖杆外設,讓各位早日拜託苦逼的鍵鼠全真,加入搖杆大軍。
  • 《最後生還者》獲金搖杆年度遊戲 遊戲總監尼爾感謝玩家支持
    《最後生還者》獲金搖杆年度遊戲 遊戲總監尼爾感謝玩家支持 時間:2020-11-25 11:49:19 來源:Twitter
  • 用虛擬搖杆玩電腦遊戲—GestureWorks
    用虛擬搖杆玩電腦遊戲—GestureWorks 2014年07月29日 17:20作者:喬然編輯:喬然文章出處:泡泡網原創      [泡泡網 前沿電子頻道] 對於極度沈迷於手機遊戲的朋友,虛擬按鈕的搖杆應該早就上手無虞了,但你會不會瘋狂到連PC Game也打算採用一樣的操控方式?
  • 全面解析Vue.nextTick實現原理
    vue中有一個較為特殊的API,nextTick。理解MutationObserverMutationObserver是HTML5新增的屬性,用於監聽DOM修改事件,能夠監聽到節點的屬性、文本內容、子節點等的改動,是一個功能強大的利器,基本用法如下:var observer = new MutationObserver(function(){    console.log('DOM被修改了