zoukankan      html  css  js  c++  java
  • 拼图

    此博客链接:https://www.cnblogs.com/ping2yingshi/p/14332495.html

    拼图

    1.说明

    1.1游戏玩法

    1.1.1游戏1

    界面显示一张被2*3矩形分割后打乱顺序的图片,用户移动图片时,只能移动到相邻的格子,只需要给出方向,拖拽图片,把打乱顺序后的图片还原为原图片。

    1.1.2游戏2

    可以从手机获取图片,界面上显示一张被3*3矩形分割后打乱顺序的图片,用户移动图片时,只能移动到相邻的格子,只需要给出方向,拖拽图片,把打乱顺序后的图片还原为原图片。

    1.1.3游戏3

    可以拍照获取图片,界面上显示一张被4*4矩形分割后打乱顺序的图片(图片中会显示一张白色的图片,称为白色图片),用户移动图片时,只能移动白色图片附近的图片,只需要给出方向,拖拽图片,使图片和白色图片交换,最后把打乱顺序后的图片还原为原图片。

    1.2编程语言

    使用小程序开发拼图游戏。

    2.技术原型

    1.分割图片。

    2.移动图片。

    3.需求

    1.在界面固定坐标处显示几张图片。

    2.打乱图片顺序。

    4.交换图片。

    5.判断用户移动图片是否和原图片一致。

    4.思路

    4.1游戏1

    4.1.1说明

    使用工具分割图片,然后把图片地址存到一个数组中,给每个图片绑定一个编号。

    4.1.2实现思路

    1.显示图片:遍历数组中图片的地址,显示相应图片。

    2.移动图片:通过手势移动的坐标判断移动方向。

    3.交换图片,交换需要移动的图片和移动方向上图片的地址和编号。

    4.通关:通过判断图片编号和数组下标来判断图片是否还原了。

    4.2游戏2

    4.2.1说明

    使用代码分割图片,把图片的背景位置存放到一个数组中,给每个图片绑定一个编号。

    4.2.2思路

    1.显示图片:获取用户自己选的图片并显示。

    2.分割图片:在图片上显示分割线,把分割后的图片坐标重新排序。

    3.获取用户点击事件:获取用户滑动事件,获取当前图片的坐标,判断用户移动方向,改变图片坐标。

    4.通关:通过判断图片编号和数组下标来判断图片是否还原了。

    4.3游戏3

    4.3.1说明

    使用代码分割图片,把图片的背景位置存放到一个数组中,给每个图片绑定一个编号。这里和游戏2的区别是,游戏2用户可以向四个方向滑动图片,但是游戏3用户只能滑动和空白块相邻的图片。

    4.3.2思路

    1.显示图片:获取用户自己选的图片并显示。

    2.分割图片:在图片上显示分割线,把分割后的图片坐标重新排序。

    3.获取用户点击事件:获取用户滑动事件,获取当前图片的坐标,判断用户移动方向,改变图片坐标。

    4.通关:通过判断图片编号和数组下标来判断图片是否还原了。

    5.关键技术和核心代码

    5.1判断用户滑动方向

    5.1.1说明

    拼图游戏中需要判断用户滑动方向。

    5.1.2技术

    1.判断横向还是纵向:取开始移动的坐标A和移动结束的坐标B在x和y轴上的投影差值比例关系判断用户是横向还是纵向移动的。

    2.判断用户向上还是向下,或者向左还是向右:当手势移动后的横坐标小于手势移动前的横坐标时,横坐标差的绝对值大于纵坐标差的绝对值时,说明手势向左移动;横坐标差的绝对值小于纵坐标差的绝对值,如果移动后的纵坐标大于开始的纵坐标,说明手势是向下移动,如果移动后的纵坐标小于开始的纵坐标,说明手势向上移动。

    当手势移动后的横坐标大于手势移动前的横坐标时,横坐标差的绝对值大于纵坐标差的绝对值时,说明手势向右移动;横坐标差的绝对值小于纵坐标差的绝对值,如果移动后的纵坐标大于开始的纵坐标,说明手势是向下移动,如果移动后的纵坐标小于开始的纵坐标,说明手势向上移动。

    5.1.3代码

    if(curPoint[0]<=startPoint[0]){
        if(Math.abs(curPoint[0]-startPoint[0])>=Math.abs(curPoint[1]-startPoint[1])){
          this.setData({
            dir:"left",
          })
          console.info(e.timeStamp+'touche left move')
        }
        else{
          if(curPoint[1]>=startPoint[1])
          {
            this.setData({
              dir:'down',
            })
            console.log(e.timeStamp+'touche down move')
          }
          else{
            this.setData({
              dir:'up',
            })
            console.log(e.timeStamp+'touche up move')
          }
        }
      }
      else{
        if(Math.abs(curPoint[0]-startPoint[0])>=Math.abs(curPoint[1]-startPoint[1])){
          this.setData({
            dir:'right',
          })
          console.info(e.timeStamp+'touche right move')
        }
        else{
          if(curPoint[1]>=startPoint[1])
          {
            this.setData({
              dir:'down',
            })
            console.log(e.timeStamp+'touche down move')
          }
          else{
            this.setData({
              dir:'up',
            })
            console.log(e.timeStamp+'touche up move')
          }
        
        }
      }

    5.2交换图片

    5.2.1说明

    当用户移动图片时,交换用户移动的图片和移动方向上的图片。

    5.2.2技术

    通过判断用户移动的方向,交换数组中存放两张图片元素对象的坐标。

    5.2.3数据结构

    定义一个一维数组,数组中存放一个对象,对象的第一个元素存放图片路径,对象的第二个元素存放图片编号。

    arr:[
          {
            src:'../image/abc3.png',
            name:'2'
          },
          {
            src:'../image/abc6.png',
            name:'3'
          },
          {
            src:'../image/abc1.png',
            name:'1'
          },
          {
            src:'../image/abc2.png',
            name:'4'
          },
          {
            src:'../image/abc5.png',
            name:'6'
          },
          {
            src:'../image/abc4.png',
            name:'5'
          },
        ]

    5.2.4代码

    for(var i=0;i<arr.length;i++)
         {
            if(dir=="up"&&index>2)
            {
              var temp;
              temp=arr[index];
              arr[index]=arr[index-3];
              arr[index-3]=temp;
              count++
              break
            }
            if(dir=="down"&&index<arr.length-3)
            {
              var temp;
              temp=arr[index];
              arr[index]=arr[index+3];
              arr[index+3]=temp;
              count++
              break
            }if(dir=="left"&&index!=3*i)
            {
              var temp;
              temp=arr[index];
              arr[index]=arr[index-1];
              arr[index-1]=temp;
              count++
              break
            }if(dir=="right"&&index!=3*i+2)
            {
              var temp;
              temp=arr[index];
              arr[index]=arr[index+1];
              arr[index+1]=temp;
              count++
              break
            }

     5.3分割图片

    5.3.1说明

    游戏2中用户可以选择自己手机中的照片拼图,这需要把用户提供的照片使用代码分割。

    5.3.2技术

    将图片作为view的背景图显示,然后利用background-position属性,将背景图的位置进行移动,让背景图从不同起始位置开始显示在界面上,从而看起来形成图片分隔效果。

    5.3.3代码

    .picture{
      float: left;
       250rpx;
      height: 250rpx;
      background-repeat: no-repeat;
      /* background-size: 250rpx 250rpx; */
      /* 不能给大小,不然显示的不是切割的图片,而是完整的图片 */
      box-sizing: border-box;
      padding: 1px;
      background-clip: content-box;
    }
    .picture1{
      background-position: 0px 0px;
    }
    .picture2{
      background-position: -250rpx 0;
    }
    .picture3{
      background-position: -500rpx 0px;
    }
    .picture4{
      background-position: 0rpx -250rpx;
    }
    .picture5{
      background-position: -250rpx -250rpx;
    }
    
    .picture6{
      background-position: -500rpx -250rpx;
    }

    5.4压缩或者拉伸图片

    5.4.1说明

    1.游戏2设计的是从相册选图片,从相册选择的图片在界面显示时,选择的图片大小可能与给定显示图片位置的大小不一致,可能比给定的位置大或者比给定的位置小。

    2.利用canvas api自带的绘图函数实现图片压缩功能。以下是微信小程序开发者文档中关于画布的接口说明。

     

    5.4.2技术

    记图片宽高分别为img_w,img_h,canvas画布宽高分别为canvas_w,canvas_h。若满足 img_w > canvas_w || img_h > canvas_h。则将原始图片的宽高绘制在canvas画布上。

    5.4.3代码

                var ctx = wx.createCanvasContext('myCanvas')
                ctx.drawImage(img_url, 0, 0, origin_width, origin_height, 0, 0, 375, 375)
                ctx.draw(false, function () {
                  wx.canvasToTempFilePath({
                    canvasId: 'myCanvas',
                    success: (res) => {
                      console.log(res.tempFilePath)
                      that.setData({
                        jigsaw_img_url: res.tempFilePath
                      })
                      that.init()
                    }
                  })
                })

    6.燃尽图

     

    7.todolist

    序号

    任务

    计划时间

    完成情况

    技术原型

    1

    分割图片

    2021.01.27

    已完成

    2

    移动图片

    2021.01.28

    已完成

    需求实现

    3

    游戏1显示图片

    2021.01.27

    已完成

    4

    游戏1打乱图片顺序

    2021.01.28

    已完成

    5

    游戏1判断图片移动方向

    2021.01.29

    已完成

    6

    游戏1交换图片

    2021.01.29

    已完成

    7

    游戏1用户移动碎片的坐标是否和原图片坐标一致

    2021.01.29

    已完成

    8

    游戏2代码分割图片

    2021.01.30

    已完成

    9

    游戏2获取用户图片

    2021.01.31

    已完成

    10

    游戏2压缩图片

    2021.02.01

    已完成

    11

    游戏3

    2021.02.03

    已完成

    8.实现

    8.1游戏1

    1.用画图 mspaint分割图片,在小程序中显示分割的图片。

    2.滑动图片,判断用户移动方向。

    3.交换图片位置。

    4.打乱图片位置。

    5.判断用户移动图片的坐标是否和原图片坐标一致。

    8.2游戏2

    1.在界面中显示同一张图片显示六遍。

    2.给每张显示的图片不同的背景样式。

    3.添加分割线。

    4.从本地选择照片

     5.在选择完图片后,因为选择的图片大小是不固定的,而我在分割图片时,是按照固定大小显示背景图片的,所以会出现选择的图片小,显示图片时,边界的图片显示不全。如下图所示。

     6.缩放图片的高宽。

    (1)使用wx.getImageInfo获取选择的图片长和宽。

    (2)判断图片的长和宽是否比屏幕大,如果图片比屏幕大,需要对图片进行压缩,如果图片比屏幕小,只需要把获取的图片按照真实值分割大小。这里一开始是把图片先压缩或者拉伸后对图片进行裁剪,但是这样会导致不能显示完整的图片。如下图所示,左图是裁剪后的图片,右图是原图。通过对比可以看出,左图被裁剪后,和原图差距还挺大。

     拉伸和裁剪技术参见压缩拉伸图片博客,博客链接:https://www.cnblogs.com/ping2yingshi/p/14369984.html 。

    (3)图片的长宽比屏幕小时,按照图片真实值对图片进行九等分,这里涉及要给样式赋值变量。

    (4)打乱图片顺序。

    (5)判断用户移动方向,判断图片是否被还原。

    8.3游戏3

    同游戏2步骤,和游戏2的区别在于,在显示图片时,让最后一张图片显示白色,用户在移动图片时,只能把其他图片和白色图片交换移动图片。

    9.实现效果

    9.1游戏1

     

    9.2游戏2

    9.3游戏3

     

    10.PSP

     

     

     

     

     11.代码地址

    coding.net地址:

    出来混总是要还的
  • 相关阅读:
    git上传本地代码
    oracle 时间格式转化以及计算
    windows 下使用sqlplus
    filter 过滤器加载流程
    vscode java
    vscode cpp
    manual jar
    toy jar
    inteli shortcut
    eng
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14332495.html
Copyright © 2011-2022 走看看