<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          getLocation 與 getUILocation

          共 2448字,需瀏覽 5分鐘

           ·

          2022-02-20 10:16

          傻傻分不清,只好自己去看清!

          游戲開發(fā)中少不了觸摸操作,在 Cocos Creator 3.x 中觸摸事件中有 getLocationgetUILocation 這兩個方法,剛開始看到會有些困惑,所以就簡單整理一下其中的奧妙。

          e83e5e8846c5e034aa629a41087aaf37.webpgetLocation getUILocation

          白玉無冰決定在 Creator 3.4 探討 EventTouch 中的 getLocationgetUILocation 的區(qū)別。

          先看一眼聲明文件,好像不是很明白。

          404976a72327e2104d3c48bd3d1bf0c4.webp聲明文件中的注釋

          再搜一搜官方文檔,看來關(guān)鍵點是在 UI窗口

          66541c0af1d7f7559203b1de4d398374.webp官方文檔

          再翻源碼瞧瞧,看看這兩口子有什么區(qū)別!

          2566766ea7094c945b797a54abdf6500.webptouch.ts 源碼

          盲生發(fā)現(xiàn)華點了!區(qū)別在 view._convertToUISpace,繼續(xù)前進看看!

          0e7258d136ed10ff4f5996bae9a2b65b.webp_convertToUISpace

          看來 getUILocation 獲得的坐標(biāo)是 getLocation 的基礎(chǔ)上偏移一個位置,再放大一個系數(shù)。

          接著再跟進 viewportRectscale 是如何變化的。

          b0958472c77f30e195b873907ba0d1d4.webpsetDesignResolutionSize

          viewportRectscale 是在設(shè)置設(shè)計分辨率和匹配模式來進行游戲畫面的屏幕適配時變化的。

          原來 getUILocation 是設(shè)計分辨率與匹配模式相關(guān)的!

          既然涉及到匹配模式,這里把所有匹配策略的代碼摳出來。e2aaeeef71671e45b2827336c101af81.webp

          ContentStrategy

          scale 就是根據(jù)這些適配策略的算出來的,詳細的說明就不細細展開了,可以參考代碼或者官方文檔。https://docs.cocos.com/creator/manual/zh/ui-system/components/engine/multi-resolution.html

          72f73cf0d009f60c3bad54aad6ba59b9.webp官方文檔-多分辨率適配方案

          viewportRect ?是根據(jù)不同策略的容器大小關(guān)系算出的。

          3d7a8876948ac3b4d7b835c98a3ab755.webp_buildResult

          接下來驗證一下吧!隨便寫一個測試代碼。

          import?{?_decorator,?Component,?Node,?Label,?input,?Input,?EventTouch,?view,?screen?}?from?'cc';
          const?{?ccclass,?property?}?=?_decorator;

          @ccclass('NewComponent')
          export?class?NewComponent?extends?Component?{

          ????@property(Label)
          ????lb:?Label?=?null!;

          ????@property(Node)
          ????click:?Node?=?null!;

          ????start()?{
          ????????input.on(Input.EventType.TOUCH_START,?this.onTouch,?this);
          ????????input.on(Input.EventType.TOUCH_MOVE,?this.onTouch,?this);
          ????}

          ????onTouch(evt:?EventTouch)?{
          ????????const?UILocation?=?evt.getUILocation();
          ????????this.lb.string?=
          `
          getLocation:${evt.getLocation().toString()}
          getUILocation:${UILocation.toString()}
          getLocationInView:${evt.getLocationInView().toString()}
          view?scale:(${view.getScaleX().toFixed(3)},${view.getScaleY().toFixed(3)})
          ViewportRect:${view.getViewportRect()}
          DesignResolutionSize:${view.getDesignResolutionSize().toString()}
          screen.windowSize:${screen.windowSize.toString()}
          ResolutionPolicy:${view.getResolutionPolicy()._contentStrategy.name}
          `
          ;
          ????????this.click.setWorldPosition(UILocation.x,?UILocation.y,?0);
          ????}
          }

          根據(jù)代碼推論,當(dāng)設(shè)計分辨率與屏幕分辨率一致時,getLocationgetUILocation 得到結(jié)果是相同的。

          b64634167bf997333516d16d512dde63.webp


          分辨率一致

          當(dāng)分辨率不一致時,根據(jù)適配策略會有些許不同:

          • ExactFit 有不同縮放系數(shù) scaleX,scaleY
          • ShowAll 有位置偏移和相同的縮放系數(shù)。
          • NoBorder 有位置偏移和相同的縮放系數(shù)。
          • FixedHeight 有相同的縮放系數(shù)。
          • FixedWidth 有相同的縮放系數(shù)。19058ea3e0f8a9f2ef12c2854eaff873.webp
          ?分辨率不一致

          那么為何有時需要位置偏移呢?關(guān)于這一點,白玉無冰沒有悟出來。等一個有緣人來化解這個坎。

          a82e994ac88e5f1e0aeab97dcbfb151a.webp為何 contentH 有不同的處理

          最后,結(jié)合放空老師的一文搞懂 Cocos Creator 3.0 坐標(biāo)轉(zhuǎn)換原理可以得出結(jié)論:

          • 設(shè)計分辨率、實際分辨率以及適配策略決定了 getUILocationgetLocation 的變化函數(shù)關(guān)系。
          • getUILocation 可以用來直接設(shè)置 UI 元素的世界坐標(biāo)
          • getLocation 用于射線檢測等坐標(biāo)轉(zhuǎn)換。

          本次探索之旅已結(jié)束,以上是白玉無冰根據(jù) Cocos Creator 3.4 源碼對getLocationgetUILocation 的分析。

          快過年了,祝大伙萬事如意!隨手畫了一個微信紅包皮!送給大伙!

          e3104c6b1dc0549f931e60e534d50e1d.webp



          更多精彩歡迎關(guān)注微信公眾號


          ??【2021年原創(chuàng)精選】


          瀏覽 264
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  台湾中文成人在线 | 夜色福利av| www.黄色毛片 | 男人的天堂官网 | 99精品视频在线观看免费 |