首页 > 编程语言 >微信小程序使用canvas2d实现拼图游戏

微信小程序使用canvas2d实现拼图游戏

时间:2023-04-20 20:47:45浏览次数:36  
标签:10 22 微信 num canvas2d var 拼图游戏 col row

根据周文洁微信小程序开发实战编写,但是微信更新了canvas接口,按照书上写的已经不能使用了。

目录

 

改进后如下:

app.wxss:

 1 .container {
 2   height: 100vh;
 3   color: #E64340;
 4   font-weight: bold;
 5   display: flex;
 6   flex-direction: column;
 7   align-items: center;
 8   justify-content:space-evenly;
 9 }
10 .title{
11   font-size: 18pt;
12 }
View Code

index.wxml:

1 <view class="container">
2   <view class="title">游戏选关</view>
3   <view class="level">
4     <view class="box" wx:for="{{levels}}" wx:key="level{{index}}" bindtap="choolLevel" data-level="{{item}}">
5       <image src="/images/{{item}}" mode=""/>
6       <text>第{{index+1}}关</text>
7     </view>
8   </view>
9 </view>
View Code

index.wxss:

 1 .level{
 2   width: 100%;
 3 }
 4 .box{
 5   width: 50%;
 6   float: left;
 7   margin: 25rpx 0;
 8   display: flex;
 9   flex-direction: column;
10   align-items: center;
11 }
12 image{
13   width: 260rpx;
14   height: 260rpx;
15 }
View Code

index.js:

 1   data: {
 2     levels:[
 3       'pic01.jpg',
 4       'pic02.jpg',
 5       'pic03.jpg',
 6       'pic04.jpg',
 7       'pic05.jpg',
 8       'pic06.jpg',
 9     ]
10   },
11   choolLevel:function(e){
12     let level=e.currentTarget.dataset.level;
13     wx.navigateTo({
14       url: '../game/game?level='+level,
15     })
16   },
View Code

games.wxml:

1 <view class="container">
2   <view class="title">提示图</view>
3   <image src="{{url}}" />
4   <canvas canvas-id="my-canvas" id="my-canvas" type="2d" bindtouchstart="touchBox" />
5   <button type="warn" bindtap="reset">重新开始</button>
6   <button type="primary" bindtap="help">帮助</button>
7 </view>
View Code

games.wxss:

1 image{
2   width: 250rpx;
3   height: 250rpx;
4 }
5 canvas{
6   border: 1rpx solid;
7   width: 300px;
8   height: 300px;
9 }
View Code

最重要的是games.js:

  1 var num=[
  2   ['00','01','02'],
  3   ['10','11','12'],
  4   ['20','21','22']
  5 ];
  6 var w=100;
  7 var url='/images/pic01.jpg';
  8 Page({
  9   data: {
 10     isWin:false
 11   },
 12   onl oad(options) {
 13     url='/images/'+options.level;
 14     this.setData({url:url});
 15     
 16     this.shuffle();
 17     this.drawCanvas();
 18   },
 19   shuffle:function(){
 20     num=[
 21       ['00','01','02'],
 22       ['10','11','12'],
 23       ['20','21','22']
 24     ];
 25     var row=2;
 26     var col=2;
 27     for (var i = 0; i < 100; i++) {
 28       var direction=Math.round(Math.random()*3);
 29       if(direction==0){
 30         if(row!=0){
 31           num[row][col]=num[row-1][col]
 32           num[row-1][col]='22';
 33           row-=1;
 34         }
 35       }else if (direction==1){
 36         if(row!=2){
 37           num[row][col]=num[row+1][col]
 38           num[row+1][col]='22';
 39           row+=1;
 40         }
 41       }else if (direction==2){
 42         if(col!=0){
 43           num[row][col]=num[row][col-1]
 44           num[row][col-1]='22';
 45           col-=1;
 46         }
 47       }else if (direction==3){
 48         if(col!=2){
 49           num[row][col]=num[row][col+1]
 50           num[row][col+1]='22';
 51           col+=1;
 52         }
 53       }
 54     }
 55   },
 56   drawCanvas:function(){
 57     //新方法
 58     const query = wx.createSelectorQuery(); 
 59     query.select('#my-canvas')
 60     .fields({ node: true, size: true }).exec((res) => {
 61           const canvas = res[0].node;
 62           const ctx = canvas.getContext('2d');
 63           ctx.clearRect(0,0,300,300);
 64           
 65           //生成图片
 66           for (let i = 0; i < 3; i++) {
 67             for (let j = 0; j < 3; j++) {
 68               if(num[i][j]!='22'){
 69                 let row=parseInt(num[i][j]/10);
 70                 let col=num[i][j]%10;
 71 
 72                 const img = canvas.createImage();
 73                 img.src=url;
 74                 img.onload = () => {
 75                   ctx.drawImage(img, col*w, row*w, w, w, j*w, i*w/2, w, 50);
 76                 }
 77 
 78               }
 79             }
 80           }
 81         })
 82   },
 83   //移动拼图
 84   touchBox:function(e){
 85     if(this.data.isWin) return;
 86     var x=e.changedTouches[0].x;
 87     var y=e.changedTouches[0].y;
 88 
 89     var row=parseInt(y/w);
 90     var col=parseInt(x/w);
 91 
 92     if(num[row][col]!='22'){
 93       this.moveBox(row,col);
 94     }
 95     this.drawCanvas();
 96     if(this.Win()){
 97       wx.createSelectorQuery()
 98       .select('#my-canvas')
 99       .fields({ node: true, size: true })
100       .exec(res=>{
101         let ctx2 = res[0].node.getContext('2d');
102         let canvas2 = res[0].node;
103         // 通过设备的像素比等重新绘制宽高
104         const dpr = wx.getSystemInfoSync().pixelRatio
105           canvas2.width = res[0].width * dpr
106           canvas2.height = res[0].height * dpr
107           ctx2.scale(dpr, dpr)
108           ctx2.font="30px Arial";
109           ctx2.fillText("笨蛋",10,150);
110       })
111 
112     }
113   },
114   //具体移动函数
115   moveBox:function(i,j){
116     if(i>0){
117       //方块在上边
118       if(num[i-1][j]=='22'){
119         num[i-1][j]=num[i][j];
120         num[i][j]='22';
121         return;
122       }
123     }
124     if(i<2){
125       //方块在下边
126       if(num[i+1][j]=='22'){
127         num[i+1][j]=num[i][j];
128         num[i][j]='22';
129         return;
130       }
131     }
132     if(j>0){
133       //方块在左边
134       if(num[i][j-1]=='22'){
135         num[i][j-1]=num[i][j];
136         num[i][j]='22';
137         return;
138       }
139     }
140     if(j<2){
141       //方块在左边
142       if(num[i][j+1]=='22'){
143         num[i][j+1]=num[i][j];
144         num[i][j]='22';
145         return;
146       }
147     }
148   },
149   Win:function(){
150     for (let t = 0; t < 3; t++) {
151       for (let v = 0; v < 3; v++) {
152         if(num[t][v]!=t*10+v){
153           return false;
154         }
155       }
156     }
157     return true;
158   },
159   reset:function(){
160     this.shuffle();
161     this.drawCanvas();
162   },
163   help:function(){
164     num=[
165       ['00','01','02'],
166       ['10','11','12'],
167       ['20','22','21']
168     ];
169     this.Win();
170     this.drawCanvas();
171   },
172 
173   //生命周期函数--监听页面初次渲染完成
174   onReady() {},
175
176   //生命周期函数--监听页面显示
177   onShow() {},
178 
179   //生命周期函数--监听页面隐藏
180   onHide() {},
181 
182   //生命周期函数--监听页面卸载
183   onUnload() {},
184 
185   //页面相关事件处理函数--监听用户下拉动作
186   onPullDownRefresh() {},
187 
188   //页面上拉触底事件的处理函数
189   onReachBottom() {},
190 
191   //用户点击右上角分享
192   onShareAppMessage() {}
193 })

微信的 wx.createCanvasContext('myCanvas')方法已经弃用 改为了wx.createSelectorQuery()

官方文档讲的太模糊压根看不明白。

这个Demo主要是通过改变数组元素的位置来实现拼图的位置变换的,所以只要对点击的图片判断白色方块是否在它的四周就可以了。

变换完数组的位置后,重新绘图,来改变图片在页面中的位置。

我觉得绘图主要的函数为 : 

ctx.drawImage(img, col*w, row*w, w, w, j*w, i*w/2, w, 50);

drawImage()函数和其中的参数定义了绘图的位置大小等等。

页面效果:

 

标签:10,22,微信,num,canvas2d,var,拼图游戏,col,row
From: https://www.cnblogs.com/HJumping/p/17338238.html

相关文章

  • 微信Windows版 v3.9.0.28 多开&消息防撤回正式版绿色版
    微信,大家工作中生活中用的最多的一款应用;很多公司喜欢用微信来作为工作沟通的工具,官方原版只支持登陆一个微信,这对于需要在电脑上登陆多个微信账号的朋友来说肯定是极其的不方便。另外有的时候别人撤回了一些重要消息,会导致我们错失部分重要内容。而这个绿色特别版本就 支持多开,......
  • 微信小程序隐藏页面滚动条
    开发小程序时,经常会碰到页面长度超过屏幕高度,然后下拉时会出现滚动条,对于一些有强迫症的人来说是不可忍受的。网上看了好多,写的。都评论有起作用或者不起作用的。我在这分享一个全局隐藏滚动条的方式。样式代码我们在app.wxss中,写一个类选择器: .contain{height:100vh;......
  • [Wechat]概念辨析:微信的生态平台/运管平台
    0引言微信的各类XX社区、XX文档、XX平台,实在是太多,让人眼花缭乱。必须得理一理了。1微信公众平台https://mp.weixin.qq.com/即微信公众号(小程序/订阅号/服务号)的管理平台微信公众平台是运营者通过微信公众号为微信用户提供资讯和服务的平台;而微信公众平台开......
  • vue3微信公众号商城项目实战系列(12)项目发布到服务器上
    本篇介绍如何将vue3项目打包发布到服务器上,然后在微信公众号上打开。vue3发布之前需要对项目进行编译,编译时会在项目根目录下创建dist文件夹,编译后的文件会存放在这里。 在编译之前,我们在public目录下建一个config.js的文件,里面放如下的代码:constconfig={baseUr......
  • 微信小程序实现长按拖拽排序
    <viewclass="container"><movable-areaclass="item_box"style="width:{{boxWeight}}rpx;height:{{boxHeight}}rpx"><movable-viewclass="item{{selectId===item.id?'item_show':&#......
  • 2023年最新微信小程序抓包教程
    01开门见山隔一个月发一篇文章,不过分。首先回顾一下《微信绑定手机号数据库被脱库事件》,我也是第一时间得知了这个消息,然后跟踪了整件事情的经过。下面是这起事件的相关截图以及近日流出的一万条数据样本:个人认为这件事也没什么,还不如关注一下之前45亿快递......
  • h5项目怎么嵌入到微信小程序中
    背景:最近用vue开发了一个h5的项目,然后产品说想把它上到微信小程序里面去,ok,开干!第一步:web-view<!--index.wxml--><viewclass="container"><web-viewsrc="https://xxx.xxxx.com/"/></view>第二步:在小程序中配置域名白名单     第三步:可以正常开发,调试啦遇......
  • vue3微信公众号商城项目实战系列(9)购物车页面
    本篇显示购物车中的商品,购物车表结构如下,我们通过接口服务抓取登录用户的购物车信息。表名字段功能shoppingcartcart_id(int)购物车编号user_id(int)用户编号goods_id(int)商品编号goods_name(varchar)商品名称photo(varchar)商品图片price(decimal)......
  • 微信小程序开发自定义tabbar
    问题背景自定义tabBar可以让开发者更加灵活地设置tabBar样式,以满足更多个性化的场景。本文将介绍微信小程序开发中如何自定义tabbar。问题分析微信小程序中,自定义tabbar的流程如下:配置信息在app.json中的tabBar项指定custom字段,同时其余tabBar相关配置也补充完整......
  • vue3微信公众号商城项目实战系列(8)商品展示页面
    本篇实现在首页展示商品功能,表结构如下:表名字段功能goodsgoods_id(int)商品编号goods_name(varchar)商品名称photo(varchar)商品图片price(decimal)价格商品表页面呈现效果如下: 第1步:在api.js中加入获取首页商品信息和加购物车的接口方法,如下......