国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【拼圖】拼圖游戲-微信小程序開發(fā)流程詳解

這篇具有很好參考價(jià)值的文章主要介紹了【拼圖】拼圖游戲-微信小程序開發(fā)流程詳解。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

還記得小時(shí)候玩過的經(jīng)典拼圖游戲嗎,上小學(xué)時(shí),在路邊攤用買個(gè)玩具,是一個(gè)正方形盒子形狀,里面裝的是圖片分割成的很多塊,還差一塊,怎么描述好呢,和魔方玩具差不多,有沒有聽說叫二維的魔方,這里用小程序把它實(shí)現(xiàn),有感興趣的同學(xué)可以來看看

準(zhǔn)備

此文章適合新手學(xué)習(xí),使用小程序開發(fā)的讀者閱讀哦

  • 會使用微信開發(fā)著工具,或使用HbuilderX工具會做uniapp項(xiàng)目
  • 需要熟悉 HTML5 Canvas
  • 適合新手入門

開始吧,在電腦上把微信開發(fā)者工具打開,選擇新建項(xiàng)目,最后點(diǎn)確定

  • 選擇小程序,再點(diǎn)擊+符號新建
  • 選擇 使用測試號(沒有自己申請一個(gè))
  • 選擇 不使用云服務(wù)
  • 選擇模板 JavaScript 基礎(chǔ)模板

新建項(xiàng)目后有生成了一堆東西,不用管它,接下來,將在這基礎(chǔ)上添加代碼

頁面制作

首先,要做的小程序頁面同下面這樣,

二維平面圖片上的塊一開始是打亂的,需要把它轉(zhuǎn)正,到整個(gè)圖片剛好看著沒問題,這個(gè)過程叫拼圖游戲,
【拼圖】拼圖游戲-微信小程序開發(fā)流程詳解

移動圖片,拼到正確就算攻關(guān),完成過程時(shí)間越短越厲害,訓(xùn)練大腦,是個(gè)益智游戲

第一個(gè)頁面

第一個(gè)頁面是pages/index/index/wxml,在里面加了一個(gè)表單form,還有提交按鈕button form-type="submit",點(diǎn)擊開始游戲,相信很多同學(xué)都會自己寫布局,這里不展開講,

在第一個(gè)頁面的pages/index/index.js里,點(diǎn)擊按鈕事件里寫開始游戲邏輯,就是打開第二個(gè)頁面,很簡單的,這里不展開講,

具體的可以看文章的項(xiàng)目源碼,放在文章結(jié)尾,可以找到,

點(diǎn)開始游戲前,給第二個(gè)頁面?zhèn)魅胗螒蚺渲孟嚓P(guān)的兩個(gè)參數(shù)即可

  • 網(wǎng)格列數(shù) cols=3
  • 選擇圖片 bgImg=默認(rèn)本地圖片路徑

第二個(gè)頁面

第二個(gè)頁面是pages/game/game.wxml,布局很簡單,只需要以下幾個(gè)元素標(biāo)簽,其中畫布canvas標(biāo)簽才是主要的

<view class="content">
  <canvas type="2d" id="canvA" class="canvas" bindtouchstart="onTouchStart" bindtouchmove="onTouchMove" bindtouchend="onTouchEnd" ></canvas>
  <view class="padding">
    <text>?游戲用時(shí):{{timerNum}}s</text>
  </view>
  <view class="padding">
    <button class="btn" size="mini" bindtap="onClick" data-key="help"><icon class="icon" type="info"></icon> <text>游戲說明</text></button>
    <button class="btn" size="mini" bindtap="onClick" data-key="restart"><icon class="icon" type="clear"></icon> <text>重新開始</text></button>
  </view>
</view>

還有頁面相關(guān)的樣式寫在pages/game/game.wxss里,達(dá)到顯示效果

游戲邏輯

初始化

接下來,在pages/game/game.js寫,實(shí)現(xiàn)畫布canvas的初始化邏輯,代碼如下

Page({

  /**
   * 頁面的初始數(shù)據(jù)
   */
  data: {
  	//游戲配置
    config:{
      cols:3,
      bgImg:'/static/1677722908380.jpg'
    },
    //計(jì)時(shí)數(shù)
    timerNum:0,
  },

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面加載
   */
  onLoad(options) {
    const changel = this.getOpenerEventChannel();
    if(changel && changel.once) {
      //接收游戲配置參數(shù)
      changel.once('args',res=>{
        const { cols, bgImgSrc } = res;
        this.data.config.cols = cols;
        this.data.config.bgImg = bgImgSrc;
        this.initCanvas();
      })
    }else{
      this.initCanvas();
    }
  },

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面卸載
   */
  onUnload() {
  	//清除所有計(jì)時(shí)器
    if(this.data.timer){
      clearTimeout(this.data.timer);
    }
    if(this.data.gameTimer){
      clearInterval(this.data.gameTimer);
    }
  },

  /**
   * 初始化游戲畫布canvas
   */
  initCanvas(){
    wx.createSelectorQuery().select('#canvA').fields({ size:true, node:true },res=>{
      const { node, width, height } = res;
      node.width = width;
      node.height = height;
	  //使用游戲配置	
      const { cols, bgImg } = this.data.config;
	  //計(jì)算網(wǎng)格大小和邊距
      const gs = Math.trunc(width/cols);
      const padding = Math.trunc(width%cols/2);
	  //設(shè)置畫布相關(guān)的數(shù)據(jù)
      this.data.canvas = {
        node, width, height, padding,
        gridSize: gs,
        context: node.getContext('2d'),
      };
	  //異步處理加載圖片
      Promise.resolve({
        then(resolve,reject) {
          let img = node.createImage();
          img.onload=function () {
            resolve(img)
          };
          img.onerror=reject;
          img.src=bgImg;
        }
      }).then(res=>{
        //分割圖片方法
        this.splitImg(res.currentTarget || res);
        //重繪方法
        this.reDraw();
        //開始計(jì)時(shí)
        this.data.gameTimer = setInterval(()=> {
          if(this.data.isEnd) {
            clearInterval(this.data.gameTimer);
            this.data.gameTimer=null;
            return;
          }
          this.setData({
            timerNum:this.data.timerNum+1
          })
        },1000)
      }).catch(err=>{
        console.error(err)
      })
    }).exec();
  },
  //...
})

分割圖片

初始化的方法中,還調(diào)用了一些方法,

這里主要講分割圖片splitImg(bgImg)和重新繪制reDraw(isRest)方法,展開說明,代碼如下

const AnimationUpdateDelay=10;//更新動畫延遲ms
const MovingPixelsOffset=5;//每次動畫移動的單位距離px

Page({
  //...
  /**
   *  清除畫布
   */
  clearBg(){
    //...
  },
  /**
   *  分割圖片
   * @param String - bgImg 背景圖片元素
   */
  splitImg(bgImg){
    const { cols } = this.data.config;
    const { width, height, context:c, gridSize:gs, padding } = this.data.canvas;
    this.clearBg();
    //繪制背景圖片
    c.drawImage(bgImg,0,0,width,height);
	//定義網(wǎng)格集合
    const grids = [];
    for(let y=0; y<cols; y++){
      for(let x=0; x<cols; x++){
        const grid = {
			//定義網(wǎng)格數(shù)據(jù)...
        };
        c.rect(grid.left,grid.top,gs,gs);
        grids.push(grid);
      }
    }
    //繪制網(wǎng)格
    c.stroke();
	//定義分割后的圖片集合
    let imgs = [];
    let lastIndex;
    grids.forEach(function (g,i) {
      //將部分區(qū)域弄個(gè)圖片集合中...
    });
    imgs.forEach(function (img,i) {
	  //將每個(gè)圖片弄到網(wǎng)格集合中...
    });
    //設(shè)置最后的(空白位置)圖片索引
    this.data.lastIndex = lastIndex;
    //設(shè)置網(wǎng)格集合
    this.data.canvas.grids = grids;
  },

  /**
   *  重繪畫布方法
   * @param Boolean - isRest 是否重置
   */
  reDraw(isRest){
    const { lastIndex } = this.data;
    const { width, height, context:c, grids, gridSize:gs } = this.data.canvas;

    this.clearBg();
	//繪制網(wǎng)格上的圖片
    grids.forEach(function (g,i) {
      if(isRest) {
        //重置網(wǎng)格數(shù)據(jù)...
      }
      //繪制網(wǎng)格...
    });
	//繪制出來
    c.rect(0,0,width,height);
    c.stroke();
  },
	//...
})

游戲交互

接下來,實(shí)現(xiàn)游戲的交互邏輯,處理用戶點(diǎn)擊某按鈕,

還有,獲取用戶點(diǎn)擊(觸摸)某圖片,再處理下一步,邏輯代碼如下

Page({
  //...
  /**
   *  按鈕點(diǎn)擊事件處理
   */
  onClick(e){
    //...
  },
  /**
   *  重新開始游戲
   */
  reStart(){
    //...
  },
  /**
   *  在畫布中開始觸摸事件
   */
  onTouchStart(e){
    this.data.touch = e.touches[0];
  },
  /**
   *  在畫布中觸摸并移動事件
   */
  onTouchMove(e){
    this.onTouchStart(e)
  },
  /**
   *  在畫布中不再觸摸時(shí)事件
   */
  onTouchEnd(){
    const { touch, lastIndex, isAnimation, isEnd } = this.data;
    //如果哦沒有觸摸,或在動畫中,或已經(jīng)結(jié)束,就直接返回不處理
    if(!touch || isAnimation || isEnd) return;
    const { grids, gridSize:gs } = this.data.canvas;
    //獲取在畫布觸摸到某圖片的索引
    let gIndex = grids.findIndex(function (g) {
    	//判斷符合條件的某網(wǎng)格圖片...
    });
    //如果觸摸的是空白位置,直接返回不處理
    if(gIndex==lastIndex) return;
    let grid = grids[gIndex];
    let lastGrid = grids[lastIndex];
    //定義移動方向的偏移數(shù)據(jù)
    let offsetMove;
    if (grid.x==lastGrid.x){
      //設(shè)置左右移動...
    }else if(grid.y==lastGrid.y){
      //設(shè)置上下移動...
    }
    //如果沒有可移動的,直接返回不處理
    if (!offsetMove) return;
    //...處理交換圖片后,更新索引
    this.data.lastIndex = gIndex;
    //開始移動圖片動畫
    this.startMoveAnimation(lastIndex,offsetMove);
  },
  //...
})

游戲動畫

這里實(shí)現(xiàn)開始移動動畫的效果,

開始移動圖片的方法是startMoveAnimation(lastIndex,offsetMove),實(shí)現(xiàn)稍微復(fù)雜一點(diǎn),邏輯代碼如下

const AnimationUpdateDelay=10;//更新動畫延遲ms
const MovingPixelsOffset=5;//每次動畫移動的單位距離px

Page({
  //...
  /**
   *  開始移動圖片動畫
   */
  startMoveAnimation(lastIndex,offsetMove){
    const { grids, gridSize:gs, node:canvas } = this.data.canvas;
	//定義移動單位距離
    const offset = MovingPixelsOffset;
    const activeGrid = grids[lastIndex];
    //此處省略了一些處理邏輯...
    //定義動畫結(jié)束方法
    const endAnimation = () => {
      this.reDraw(true);
      this.data.isAnimation = false;
      this.isEndGame();
    };
    //定義動畫更新方法
    const updateAnimation = () => {
      //判斷條件,更新移動數(shù)據(jù)
      if(offsetMove.x<0 && activeGrid.offsetX<0) activeGrid.offsetX+=offset;
      //其余的一些判斷邏輯省略了...
      else {
        endAnimation();
        return;
      }
      this.reDraw();
      //繼續(xù)下一個(gè)更新動畫
      // this.data.timer = setTimeout(()=>{
        canvas.requestAnimationFrame(() => updateAnimation());
      // },AnimationUpdateDelay);
    };
    //設(shè)置動畫進(jìn)行中
    this.data.isAnimation = true;
    //開始更新動畫
    updateAnimation();
  },
  /**
   *  判斷游戲是否結(jié)束(通關(guān))
   */
  isEndGame(){
    const { grids } = this.data.canvas;
    let isEnd = grids.every(function (current,index) {
      //...判斷邏輯,檢查網(wǎng)格集合里所有的圖片順序是否正確
    });
    //如果結(jié)束,就是順序正確,彈出提示用戶
    if(isEnd){
      this.data.isEnd=true;
      wx.showModal({
        title: '游戲結(jié)束',
        content: `恭喜攻關(guān)!用時(shí)${this.data.timerNum}`,
        confirmText:'重新開始',
        complete: (res) => {
          if (res.cancel) {
            this.data.lastIndex=-1;
            this.reDraw();
            return;
          }
          if (res.confirm) {
            this.reStart();
          }
        }
      })
    }
  },
  //...
})

游戲是否結(jié)束判斷方法isEndGame(),在移動動畫結(jié)束時(shí)會調(diào)用

寫到這里,拼圖游戲講解到此結(jié)束,理清了上面整個(gè)游戲思路嗎,相信自己能做到吧,

關(guān)于項(xiàng)目

項(xiàng)目源碼請?jiān)谶@里找點(diǎn)這里查看項(xiàng)目源碼,在資源一欄下,其中有個(gè)叫拼圖游戲的就是它,可以下載來看,謝謝支持!

運(yùn)行測試

打開項(xiàng)目源碼,游戲運(yùn)行效果動圖如下,

拼圖游戲里面圖片是可以更換的,換個(gè)自己喜歡的圖片,這樣才有新鮮感

【拼圖】拼圖游戲-微信小程序開發(fā)流程詳解

如果有遇到什么問題請留言,作者會抽時(shí)間解答疑惑。

應(yīng)用場景

這個(gè)拼圖游戲應(yīng)用場景,用于解鎖攻關(guān)最合適不過文章來源地址http://www.zghlxwxcb.cn/news/detail-494071.html

  • ?? 我的夢有一把鎖,我的心中一條河,等待有人開啟有人穿越~??

到了這里,關(guān)于【拼圖】拼圖游戲-微信小程序開發(fā)流程詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 微信小程序 | 小程序開發(fā)

    微信小程序 | 小程序開發(fā)

    ??? 微信小程序?qū)冢盒〕绦蜷_發(fā) 初級知識 ????? 個(gè)人簡介:一個(gè)不甘平庸的平凡人?? ? 個(gè)人主頁:CoderHing的個(gè)人主頁 ?? 格言: ?? 路漫漫其修遠(yuǎn)兮,吾將上下而求索?? ?? 你的一鍵三連是我更新的最大動力?? 目錄 一、認(rèn)識小程序開發(fā) 什么是小程序? 各個(gè)平臺小

    2024年01月24日
    瀏覽(61)
  • 微信小程序開發(fā)之微信小程序交互

    微信小程序開發(fā)之微信小程序交互

    目錄 一、小程序交互 前端: 1、先在登陸界面中編寫代碼 2、在前端中編寫js代碼 后端: ? ? ? ? ? 1、先導(dǎo)入依賴: ? ? ? ? ? 2、定義好配置文件 ? ? ? ? ? 3、編寫好實(shí)體類 ? ? ? ? ? 4、將幫助類進(jìn)行配置 ? ? ? ? ? 5、編寫mapper類 ? ? ? ? ? 6、定義service層以及對應(yīng)的

    2024年02月09日
    瀏覽(21)
  • python做微信小程序開發(fā),python怎么開發(fā)小程序

    python做微信小程序開發(fā),python怎么開發(fā)小程序

    大家好,小編來為大家解答以下問題,python做微信小程序開發(fā),python怎么開發(fā)小程序,今天讓我們一起來看看吧! 大家好,小編為大家解答用python編寫一個(gè)小程序的問題。很多人還不知道如何用python做小軟件,現(xiàn)在讓我們一起來看看吧! 大家好,小編來為大家解答以下問題

    2024年03月12日
    瀏覽(25)
  • 【微信小程序開發(fā)零基礎(chǔ)入門】——微信小程序入門

    【微信小程序開發(fā)零基礎(chǔ)入門】——微信小程序入門

    學(xué)習(xí)小程序跟學(xué)習(xí)網(wǎng)頁開發(fā)有什么不同 1.如何創(chuàng)建微信小程序項(xiàng)目 1.1 注冊、登錄、復(fù)制appId 注冊:在 https://mp.weixin.qq.com/cgi-bin/wx 進(jìn)行注冊微信小程序開發(fā)賬號 登錄:在 https://mp.weixin.qq.com 登錄小程序賬號 復(fù)制appId: 在 \\\"開發(fā)\\\" 的 \\\"開發(fā)管理\\\" 的 \\\"開發(fā)設(shè)置\\\" 的 \\\"開發(fā)者ID\\\"中 1.2 下

    2024年02月03日
    瀏覽(32)
  • 微信小程序 -- 小程序開發(fā)能力與拓展

    微信小程序 -- 小程序開發(fā)能力與拓展

    1. 獲取用戶頭像 當(dāng)小程序需要讓用戶完善個(gè)人資料時(shí),我們可以通過微信提供的頭像、昵稱填寫能力快速完善。如圖: 想使用微信提供的頭像填寫能力,需要兩步: 將 button 組件 open-type 的值設(shè)置為 chooseAvatar 當(dāng)用戶選擇需要使用的頭像之后,可以通過 bindchooseavatar 事件回調(diào)

    2024年04月15日
    瀏覽(29)
  • 微信小程序開發(fā)---小程序的頁面配置

    目錄 一、小程序頁面配置的作用 二、頁面配置和全局配置的關(guān)系 三、頁面配置中常用的配置項(xiàng) 在每個(gè)小程序中,每個(gè)頁面都有自己的.json配置文件,用來對當(dāng)前頁面的窗口外觀,頁面效果進(jìn)行配置。 小程序中,app.json中的windows節(jié)點(diǎn),可以全局配置小程序中每個(gè)頁面的窗口表

    2024年02月09日
    瀏覽(19)
  • 微信小程序開發(fā)教程(二)--上傳小程序

    微信小程序開發(fā)教程(二)--上傳小程序

    接上文,我們已經(jīng)有一個(gè)小例子了。 在模擬器的位置,點(diǎn)擊頭像,會登錄。 此時(shí)我們可以第一次嘗試將我們的小程序進(jìn)行上傳。 點(diǎn)擊下圖箭頭所指位置: 點(diǎn)擊確定: 填寫版本號和備注信息,選擇上傳: 在網(wǎng)頁管理小程序上,選擇上傳,以下都選擇紅框所在位置: 填寫相關(guān)

    2023年04月25日
    瀏覽(26)
  • 微信小程序開發(fā)15 項(xiàng)目實(shí)戰(zhàn) 基于云開發(fā)開發(fā)一個(gè)在線商城小程序

    在學(xué)完前 4 個(gè)模塊之后,我相信你會對微信小程序的開發(fā)有一個(gè)全新的認(rèn)識。在前面 3 個(gè)模塊中,俊鵬分別從微信小程序內(nèi)在的運(yùn)行原理,小程序工程化開發(fā)以及具體實(shí)踐層面,深度講解了微信小程序開發(fā)所必要的知識和能力。而第 4 個(gè)模塊里,我?guī)阏J(rèn)識了微信小程序的云

    2024年02月11日
    瀏覽(99)
  • 【微信小程序開發(fā)】微信小程序集成騰訊位置項(xiàng)目配置

    【微信小程序開發(fā)】微信小程序集成騰訊位置項(xiàng)目配置

    騰訊位置服務(wù)官網(wǎng) 當(dāng)然沒賬號的要先注冊一個(gè)賬號 在我的應(yīng)用里創(chuàng)建一個(gè)新的應(yīng)用,印象中需要小程序ID,去微信開發(fā)者工具里面找到自己的小程序ID填入即可 添加 key 中勾選勾選 WebServiceAPI 從官網(wǎng)里下載,我這里下載的是 v1.2 打開微信開發(fā)者工具 在查找小程序ID的地方下滑

    2024年02月02日
    瀏覽(39)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包