uniapp的動畫運用(二)移動動畫《人物移動》

人物移動在游戲中很常見,今天就簡單介紹一下在uniapp中如何實現(xiàn)讓一個“人物”沿著一條“路線”走的動畫毯欣。這個里面就需要用到animation里面的偏移方法底桂,偏移里面分幾種方式泉懦,有沿著X軸方向的偏移片部,也有沿著Y軸方向的偏移等等,下面我們就以一個demo例子來說明一下如何實現(xiàn)偏移動畫暇番。demo例子如下圖嗤放。

移動DEMO

一、構(gòu)建路線數(shù)組

1. 假如每個格子的大小為112x116

#路線配置
let lineList = 
[
      {
        left: 3, //基于父級的左邊距幾個格子
        top: 0 //基于父級的上邊距幾個格子
      },
      {
        left: 2,
        top: 0
      },
      {
        left: 1,
        top: 0
      },
      ...
]

//地圖列表
let mapList = lineList.map((item, index) => {
        return {
          index: index,
          left: item.left * this.cellWidth, //每個格子的寬度
          top: item.top * this.cellHeight, //每個格子的高度
        }
})

二壁酬、執(zhí)行行走動畫

1.數(shù)據(jù)里面定義的一些變量

props: {
    //父組件將地圖數(shù)組傳遞過來
    mapList: {
      type: Array,
      default() {
        return []
      }
    },
},
data() {
     //所處的地圖的位置(所處地圖數(shù)組的位置)
      position: {
        //所在地圖索引
        index: 0,
        //已經(jīng)移動的X軸距離
        x: 0,
        //已經(jīng)移動的Y軸距離
        y: 0
      },
      //動畫對象
      animation: null,
      //保存動畫數(shù)據(jù)
      animationData: {},
      //有沒有正在走
      isRuning: false,
      //每走一步的時間(單位毫秒)
      timePerStep: 500,
     ...
}

2.行走方法

//設(shè)置角色人物前進
walk(step = 0) {
      //1.假如正在行走
      //2.未傳遞需要行走幾步
      //3.地圖列表長度為空
      //4.當前所在位置已經(jīng)走到頭了
      if (
        this.isRuning ||
        !step ||
        !this.mapList.length ||
        this.position.index >= this.mapList.length - 1
      ) {
        return
      }
      //移動到的目標位置
      let targetPosition = this.position.index + step
      //如果是前進
      if (step > 0) {
        //假如走到底需要計算退回的步數(shù)
        let needBackNum = 0
        //目標位置超過或者達到最后的節(jié)點
        if (targetPosition >= this.mapList.length - 1) {
          //計算出需要回退的步數(shù)
          needBackNum = targetPosition - (this.mapList.length - 1)
          //設(shè)置最后位置為最后的節(jié)點
          targetPosition = this.mapList.length - 1
        }
        //執(zhí)行行走動畫
        this.walkAnimation(this.position.index, targetPosition)
        //如果存在需要回退的情況
        if (needBackNum) {
          //設(shè)置回退后的目標位置
          let lastTargetPosition = targetPosition - needBackNum
          //開啟行走動畫
          this.walkAnimation(targetPosition, lastTargetPosition)
          //設(shè)置最終的目標位置
          targetPosition = lastTargetPosition
        }
      } else {
        //如果退回的位置到了起點位置或者超過了起點位置則統(tǒng)一設(shè)置為最終位置就是起點位置
        if (targetPosition <= 0) {
          targetPosition = 0
        }
        //開始行走動畫
        this.walkAnimation(this.position.index, targetPosition)
      }
      //導(dǎo)出動畫
      this.animationData = this.animation.export()
      //標記開始行走
      this.isRuning = true
      //通知父組件
      this.$emit('runing')
      //播放走路音效
      this.playAudio('walk')
      //設(shè)置當前的位置為新位置
      this.position.index = targetPosition
      //計算出總時長
      let totalDuration = this.timePerStep * Math.abs(step)
      //過了指定時間開放走路模式
      setTimeout(() => {
        //停止走路
        this.isRuning = false
        //停止音效
        this.stopAudio()
        //通知父組件,告知當前的位置
        this.$emit('stop', this.position)
      }, totalDuration)
},
//走路動畫
walkAnimation(startPos = 0, endPos = 0) {
      if (startPos == endPos) {
        //原地不動
        return
      } else if (startPos < endPos) {
        //前進
        for (let index = startPos; index < endPos; index++) {
          //計算出X軸需要移動的距離
          let xDistance =
            this.mapList[index + 1].left - this.mapList[index].left
          //計算出Y軸需要移動的距離
          let yDistance = this.mapList[index + 1].top - this.mapList[index].top
          if (xDistance) {
            this.position.x += xDistance
            this.animation
              .translateX(this.position.x + 'rpx')
              .step({ duration: this.timePerStep })
          } else {
            this.position.y += yDistance
            this.animation
              .translateY(this.position.y + 'rpx')
              .step({ duration: this.timePerStep })
          }
        }
      } else {
        //后退
        for (let index = startPos; index > endPos; index--) {
          //計算出X軸需要移動的距離
          let xDistance =
            this.mapList[index].left - this.mapList[index - 1].left
          //計算出Y軸需要移動的距離
          let yDistance = this.mapList[index].top - this.mapList[index - 1].top
          if (xDistance) {
            this.position.x -= xDistance
            this.animation
              .translateX(this.position.x + 'rpx')
              .step({ duration: this.timePerStep })
          } else {
            this.position.y -= yDistance
            this.animation
              .translateY(this.position.y + 'rpx')
              .step({ duration: this.timePerStep })
          }
        }
      }
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末次酌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厨喂,更是在濱河造成了極大的恐慌和措,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜕煌,死亡現(xiàn)場離奇詭異派阱,居然都是意外死亡,警方通過查閱死者的電腦和手機斜纪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門贫母,熙熙樓的掌柜王于貴愁眉苦臉地迎上來文兑,“玉大人,你說我怎么就攤上這事腺劣÷陶辏” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵橘原,是天一觀的道長籍铁。 經(jīng)常有香客問我,道長趾断,這世上最難降的妖魔是什么拒名? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮芋酌,結(jié)果婚禮上增显,老公的妹妹穿的比我還像新娘。我一直安慰自己脐帝,他們只是感情好同云,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堵腹,像睡著了一般炸站。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秸滴,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天武契,我揣著相機與錄音募判,去河邊找鬼荡含。 笑死,一個胖子當著我的面吹牛届垫,可吹牛的內(nèi)容都是我干的释液。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼装处,長吁一口氣:“原來是場噩夢啊……” “哼误债!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妄迁,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寝蹈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后登淘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箫老,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年黔州,在試婚紗的時候發(fā)現(xiàn)自己被綠了耍鬓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阔籽。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牲蜀,靈堂內(nèi)的尸體忽然破棺而出笆制,到底是詐尸還是另有隱情,我是刑警寧澤涣达,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布在辆,位于F島的核電站,受9級特大地震影響度苔,放射性物質(zhì)發(fā)生泄漏开缎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一林螃、第九天 我趴在偏房一處隱蔽的房頂上張望奕删。 院中可真熱鬧,春花似錦疗认、人聲如沸完残。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谨设。三九已至,卻和暖如春缎浇,著一層夾襖步出監(jiān)牢的瞬間扎拣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工素跺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留二蓝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓指厌,卻偏偏與公主長得像刊愚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子踩验,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 這次迭代開發(fā)時鸥诽,項目中有個選課功能,產(chǎn)品設(shè)計大哥要求以左右滑動重疊的書籍來選擇課程(跟以前那次做的選擇機構(gòu)動畫類似...
    Tony_Yang閱讀 6,835評論 15 8
  • 前兩天分享了 抖音 上下滑切換 ,今天給和大家分享的是抖音右小角底部的專輯動畫 上圖看下 再看下抖音的 具體實現(xiàn)思...
    小七編程閱讀 1,183評論 2 18
  • 角色控制是游戲設(shè)計中必不可少的一個設(shè)計環(huán)節(jié)箕憾,這一節(jié)我們講一講如何制作基本的角色運動控制交互邏輯牡借。 因為是簡單實例教...
    shimmery閱讀 9,321評論 5 20
  • 1、Core Animation Core Animation袭异,即為核心動畫钠龙,它是一組非常強大的動畫處理API,使...
    Geniusn閱讀 472評論 0 1
  • 實現(xiàn)效果anim.gif圖中的灰色區(qū)域都是可滑動區(qū)域,其中我用三種文本顏色表示區(qū)域中三個不同的View俊鱼,黑色部分是...
    Horps閱讀 119評論 0 0